RESTful API

API Documentation

Kelola artikel dan kategori secara terprogram menggunakan REST API SecuilInfo. Dapatkan akses ke semua fitur dengan API key.

Pendahuluan

API ini memungkinkan Anda untuk mengelola konten SecuilInfo secara terprogram. Gunakan API untuk mengintegrasikan konten dengan aplikasi mobile, static site generator, atau layanan pihak ketiga. Semua response dalam format JSON.

Autentikasi

Endpoint publik (GET) tidak memerlukan autentikasi. Endpoint write (POST, PUT, PATCH, DELETE) memerlukan API key yang dikirim melalui header.

Request
curl http://localhost:8080/api/articles \
  -H "X-API-Key: YOUR_API_KEY"

Alternatif

API key juga dapat dikirim via Authorization: Bearer <key>

Base URL

http://localhost:8080/api

HTTP Status Codes

CodeDescription
200OK — Request berhasil
201Created — Resource berhasil dibuat
400Bad Request — Request tidak valid
401Unauthorized — API key tidak disertakan
403Forbidden — API key tidak valid / tidak aktif
404Not Found — Resource tidak ditemukan
409Conflict — Kategori masih memiliki artikel
422Unprocessable Entity — Validasi gagal
429Too Many Requests — Rate limit tercapai
500Internal Server Error

Rate Limiting

Publik (GET)

60/menit

Terautentikasi

1.000/menit

Response menyertakan header X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset.

List Articles

GET/api/articles

Mendapatkan daftar artikel yang dipublikasikan dengan paginasi.

Query params: page, per_page, category_id

cURL
curl "http://localhost:8080/api/articles?page=1&per_page=10"
Response
{
  "status": "success",
  "message": "OK",
  "data": [
    {
      "id": 1,
      "title": "Judul Artikel",
      "slug": "judul-artikel",
      "excerpt": "Cuplikan artikel...",
      "featured_image": "https://...",
      "category": {
        "id": 1,
        "name": "Teknologi",
        "slug": "teknologi"
      },
      "author": "Admin",
      "published_at": "2026-06-01T10:00:00+07:00"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 10,
    "total": 24,
    "total_pages": 3
  }
}

Get Article

GET/api/articles/{id}

Mendapatkan detail artikel berdasarkan ID, termasuk artikel terkait.

cURL
curl http://localhost:8080/api/articles/1
Response
{
  "status": "success",
  "message": "OK",
  "data": {
    "id": 1,
    "title": "Judul Artikel",
    "slug": "judul-artikel",
    "content": "<p>Konten lengkap artikel...</p>",
    "excerpt": "Cuplikan...",
    "featured_image": "https://...",
    "alt_text": "Deskripsi gambar",
    "meta_title": "SEO Title",
    "meta_description": "SEO Description",
    "canonical_url": null,
    "is_published": true,
    "category": { "id": 1, "name": "Teknologi", "slug": "teknologi" },
    "author": "Admin",
    "related_articles": [
      { "id": 2, "title": "Artikel Terkait", "slug": "artikel-terkait" }
    ],
    "published_at": "2026-06-01T10:00:00+07:00",
    "created_at": "2026-06-01T09:00:00+07:00",
    "updated_at": "2026-06-01T10:00:00+07:00"
  }
}

Create Article

POST/api/articles

Membuat artikel baru. Auth required

cURL
curl -X POST http://localhost:8080/api/articles \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "title": "Judul Baru",
    "content": "Isi artikel minimal 50 karakter untuk bisa dipublikasikan...",
    "excerpt": "Cuplikan opsional",
    "category_id": 1,
    "is_published": true
  }'
Response
{
  "status": "success",
  "message": "Article created",
  "data": {
    "id": 25,
    "title": "Judul Baru",
    "slug": "judul-baru",
    "is_published": true
  }
}
Request Body
FieldTipeKeterangan
titlestringRequired, max 255
contentstringRequired, min 50
excerptstringOpsional, max 500
category_idintOpsional
featured_imageurlOpsional, max 500
alt_textstringOpsional, max 255
meta_titlestringOpsional, max 255
meta_descriptionstringOpsional, max 320
is_publishedboolDefault: false

Update Article

PUT/api/articles/{id}

Update penuh artikel. Semua field required. Auth required

cURL
curl -X PUT http://localhost:8080/api/articles/1 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "title": "Judul Diubah",
    "content": "Konten artikel yang sudah diperbarui dengan minimal 50 karakter...",
    "is_published": true
  }'
Response
{
  "status": "success",
  "message": "Article updated",
  "data": {
    "id": 1,
    "title": "Judul Diubah",
    "slug": "judul-diubah"
  }
}

Patch Article

PATCH/api/articles/{id}

Update parsial artikel. Hanya field yang dikirim akan diubah. Auth required

cURL
curl -X PATCH http://localhost:8080/api/articles/1 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"title": "Judul Baru Saja"}'
Response
{
  "status": "success",
  "message": "Article patched",
  "data": {
    "id": 1,
    "title": "Judul Baru Saja"
  }
}

Delete Article

DELETE/api/articles/{id}

Menghapus artikel. Auth required

cURL
curl -X DELETE http://localhost:8080/api/articles/1 \
  -H "X-API-Key: YOUR_API_KEY"
Response
{
  "status": "success",
  "message": "Article deleted",
  "data": null
}

List Categories

GET/api/categories

Mendapatkan semua kategori dengan jumlah artikel.

cURL
curl http://localhost:8080/api/categories
Response
{
  "status": "success",
  "message": "OK",
  "data": [
    {
      "id": 1,
      "name": "Teknologi",
      "slug": "teknologi",
      "description": "Berita teknologi terkini",
      "article_count": 12,
      "created_at": "2026-01-01T00:00:00+07:00",
      "updated_at": "2026-06-01T10:00:00+07:00"
    }
  ]
}

Get Category

GET/api/categories/{id}

Detail kategori beserta artikel di dalamnya (paginasi).

cURL
curl "http://localhost:8080/api/categories/1?page=1&per_page=5"
Response
{
  "status": "success",
  "message": "OK",
  "data": {
    "id": 1,
    "name": "Teknologi",
    "slug": "teknologi",
    "description": "Berita teknologi terkini",
    "articles": [
      {
        "id": 3,
        "title": "Artikel dalam kategori",
        "slug": "artikel-dalam-kategori",
        "excerpt": "Cuplikan...",
        "featured_image": null,
        "alt_text": null,
        "author": "Admin",
        "published_at": "2026-06-01T10:00:00+07:00"
      }
    ]
  },
  "meta": {
    "page": 1,
    "per_page": 5,
    "total": 8,
    "total_pages": 2
  }
}

Create Category

POST/api/categories

Membuat kategori baru. Auth required

cURL
curl -X POST http://localhost:8080/api/categories \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"name": "Kategori Baru"}'
Response
{
  "status": "success",
  "message": "Category created",
  "data": {
    "id": 7,
    "name": "Kategori Baru",
    "slug": "kategori-baru"
  }
}
Request Body
FieldTipeKeterangan
namestringRequired, max 100
slugstringOpsional (auto-generated)
descriptionstringOpsional, max 500

Update Category

PUT/api/categories/{id}

Update penuh kategori. Auth required

cURL
curl -X PUT http://localhost:8080/api/categories/1 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"name": "Kategori Diubah"}'
Response
{
  "status": "success",
  "message": "Category updated",
  "data": {
    "id": 1,
    "name": "Kategori Diubah",
    "slug": "kategori-diubah"
  }
}

Patch Category

PATCH/api/categories/{id}

Update parsial kategori. Auth required

cURL
curl -X PATCH http://localhost:8080/api/categories/1 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"description": "Deskripsi baru"}'
Response
{
  "status": "success",
  "message": "Category patched",
  "data": {
    "id": 1,
    "name": "Teknologi",
    "slug": "teknologi",
    "description": "Deskripsi baru"
  }
}

Delete Category

DELETE/api/categories/{id}

Menghapus kategori. Gagal (409) jika masih memiliki artikel. Auth required

cURL
curl -X DELETE http://localhost:8080/api/categories/1 \
  -H "X-API-Key: YOUR_API_KEY"
Response
{
  "status": "success",
  "message": "Category deleted",
  "data": null
}