๐Ÿ›๏ธ Museum Service API

API untuk Museum Digital Indonesia - Single Museum Pattern

๐Ÿ“ฅ Download API Spec (YAML)

๐Ÿ“‹ Overview

API untuk Museum Digital Indonesia - Single Museum Pattern

๐Ÿ›๏ธ Museum Management

CRUD operations untuk museum dengan single museum pattern

๐Ÿบ Artifact Management

Kelola koleksi artifact dengan metadata lengkap

๐Ÿ“ธ Media Integration

Integrasi dengan Media Service untuk upload file

๐Ÿ” JWT Authentication

Autentikasi via Account Service dengan RS256

Base URL

https://museumdigi.id

Authentication

Type: Bearer JWT

Header: Authorization: Bearer <token>

Token source: Account Service

Token contains: account_id, organization_id, permissions

Flow Overview

  1. Login ke Account Service โ†’ dapat JWT token
  2. Simpan token di localStorage/browser
  3. Kirim token di setiap request
  4. Museum di-identifikasi dari org_id dalam JWT (bukan URL path)

Constraints

๐Ÿ”„ Service Flow Diagram

Visualisasi alur data antara Account Service โ†’ Museum โ†’ Artifacts โ†’ Media Service

๐Ÿ”Œ API Endpoints

My Museum (Single Museum Pattern)

Setiap organization hanya memiliki satu museum

GET /api/v1/museum

Ambil museum milik organization dari JWT org_id

Auth: Required

Response Example:

{
  "id": "f6c857ea-5428-427f-b7bb-a19bfaeff6cf",
  "organization_id": "d6450e6c-c4ea-4e9f-a4d3-c9cf0c755d6a",
  "name": "Museum Gangelang",
  "location": "Bali",
  "description": "Museum untuk organisasi ini",
  "image_url": "https://media.museumdigi.id/media/abc123/photo.jpg",
  "contact_info": "",
  "artifact_count": 0,
  "created_at": "2026-03-02T16:09:02+07:00",
  "updated_at": "2026-03-02T16:09:02+07:00"
}
PATCH /api/v1/museum

Update data museum milik organization

Auth: Required museum:write

FieldTypeRequiredDescription
name string optional ex: Museum Gangelang Updated
location string optional ex: Jakarta Pusat
description string optional ex: Deskripsi museum yang diupdate
image_url string optional ex: https://media.museumdigi.id/media/abc123/photo.jpg
contact_info string optional ex: +62 812-3456-7890

Request Body:

{
  "name": "Museum Gangelang Updated",
  "location": "Bali",
  "description": "Updated description"
}
DELETE /api/v1/museum

Hapus museum milik organization

Auth: Required museum:delete

POST /api/v1/museum/image

Update image URL museum (URL dari Media Service)

Auth: Required museum:write

FieldTypeRequiredDescription
image_url string required ex: https://media.museumdigi.id/media/abc123/photo.jpg

Request Body:

{
  "image_url": "https://media.museumdigi.id/media/xyz789/updated.jpg"
}

Artifacts

Kelola koleksi artifact museum

GET /api/v1/artifacts

List semua artifact (public) atau filter by org (authenticated)

Auth: Optional (public access available)

ParamTypeRequiredDescription
page integer optional Halaman ke- (default: 1)
page_size integer optional Jumlah item per halaman (default: 9)
search string optional Cari berdasarkan nama/description
POST /api/v1/artifacts

Buat artifact baru

Auth: Required artifact:write

FieldTypeRequiredDescription
museum_id string (uuid) required ID museum pemilik
name string required Nama artifact
description string optional
category string optional ex: historical
era string optional ex: ancient
origin string optional ex: Indonesia
status string optional ex: active
image_url string optional URL dari Media Service
model3d_url string optional URL 3D model dari Media Service

Request Body:

{
  "museum_id": "f6c857ea-5428-427f-b7bb-a19bfaeff6cf",
  "name": "Candi Borobudur Miniature",
  "description": "Miniatur candi skala 1:100",
  "category": "historical",
  "era": "Modern",
  "origin": "Indonesia",
  "status": "active",
  "image_url": "https://media.museumdigi.id/media/art123/photo.jpg",
  "model3d_url": "https://media.museumdigi.id/media/3d123/model.glb"
}
GET /api/v1/artifacts/{id}

Ambil detail artifact by ID

Auth: Optional (public access available)

PATCH /api/v1/artifacts/{id}

Update data artifact

Auth: Required artifact:write

FieldTypeRequiredDescription
name string optional
description string optional
image_url string optional
model3d_url string optional

Request Body:

{
  "name": "Artifact Updated",
  "description": "Updated description",
  "image_url": "https://media.museumdigi.id/media/art456/new-photo.jpg"
}
DELETE /api/v1/artifacts/{id}

Hapus artifact

Auth: Required artifact:delete

POST /api/v1/artifacts/{id}/image

Update image URL artifact

Auth: Required artifact:write

FieldTypeRequiredDescription
image_url string required

Request Body:

{
  "image_url": "https://media.museumdigi.id/media/art789/image.jpg"
}

Articles (CMS)

Kelola artikel/berita museum dan konten artifact

GET /api/v1/articles

List semua artikel dengan filter dan pagination

Auth: Optional (public access available)

ParamTypeRequiredDescription
page integer optional Halaman ke- (default: 1)
page_size integer optional Jumlah item per halaman (default: 12)
museum_id string (uuid) optional Filter berdasarkan museum
type string optional Filter berdasarkan tipe (news, artifact_detail)
search string optional Cari berdasarkan judul/konten
is_published boolean optional Filter berdasarkan status publish
include_deleted boolean optional Sertakan artikel yang sudah dihapus (admin only) (default: false)

Response Example:

{
  "data": [
    {
      "id": "art-123",
      "museum_id": "museum-456",
      "user_id": "user-789",
      "type": "news",
      "title": "Pameran Baru Dibuka",
      "slug": "pameran-baru-dibuka-1709523456",
      "excerpt": "Kami dengan bangga mengumumkan...",
      "content_html": "<h1>Pameran Baru</h1><p>Kami dengan bangga...</p>",
      "cover_image": "https://media.museumdigi.id/media/art123/cover.jpg",
      "is_published": true,
      "published_at": "2024-03-15T10:00:00Z",
      "created_at": "2024-03-10T08:00:00Z",
      "updated_at": "2024-03-15T09:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "page_size": 12,
    "total": 1,
    "total_pages": 1
  }
}
GET /api/v1/articles/slug/{slug}

Ambil artikel by slug (untuk akses publik)

Auth: Optional (public access available)

GET /api/v1/articles/{id}

Ambil detail artikel by ID

Auth: Optional (public access available)

POST /api/v1/articles

Buat artikel baru

Auth: Required article:write

FieldTypeRequiredDescription
museum_id string (uuid) required ID museum pemilik
type string required Tipe artikel
artifact_id string (uuid) optional Wajib jika type = artifact_detail
title string required Judul artikel
slug string optional URL slug (auto-generate jika kosong)
content string (markdown) required Konten artikel dalam format Markdown
cover_image string optional URL cover image dari Media Service
is_published boolean optional Status publish

Request Body:

{
  "museum_id": "f6c857ea-5428-427f-b7bb-a19bfaeff6cf",
  "type": "news",
  "title": "Pameran Sejarah Indonesia 2024",
  "content": "# Pameran Sejarah Indonesia\n\nKami dengan **bangga** mengumumkan...",
  "cover_image": "https://media.museumdigi.id/media/art123/cover.jpg",
  "is_published": true
}
PATCH /api/v1/articles/{id}

Update data artikel

Auth: Required article:write

FieldTypeRequiredDescription
type string optional
artifact_id string (uuid) optional
title string optional
slug string optional
content string (markdown) optional
cover_image string optional
is_published boolean optional
DELETE /api/v1/articles/{id}

Soft-delete artikel

Auth: Required article:delete

POST /api/v1/articles/{id}/restore

Restore artikel yang sudah dihapus

Auth: Required article:write

๐Ÿ“ค File Upload Flow

Museum Service tidak menangani upload file langsung. Frontend harus upload ke Media Service terlebih dahulu, kemudian kirim URL yang didapat ke Museum Service.

Step 1: Upload ke Media Service

POST /api/v1/upload

Service: Media Service (bukan Museum Service)

Auth: Required media:upload

curl -X POST https://museumdigi.id/api/v1/upload \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@photo.jpg" \
  -F "folder_id=optional-folder-id"

Response:

{
  "success": true,
  "data": {
    "media_id": "abc123...",
    "url": "https://media.museumdigi.id/media/abc123/photo.jpg",
    "thumbnail_url": "https://media.museumdigi.id/media/abc123/thumb.jpg"
  }
}

Step 2: Simpan URL ke Museum/Artifact

Gunakan url dari response Media Service untuk update image:

// Update museum image
curl -X POST https://museumdigi.id/api/v1/museum/image \\
  -H "Authorization: Bearer TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"image_url": "https://media.museumdigi.id/media/abc123/photo.jpg"}'

// Update artifact image
curl -X POST https://museumdigi.id/api/v1/artifacts/{id}/image \\
  -H "Authorization: Bearer TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"image_url": "https://media.museumdigi.id/media/abc123/photo.jpg"}'
Tips: Simpan juga media_id di database jika perlu referensi ke file di Media Service (untuk delete atau update nanti).

๐Ÿงช API Tester

Test API endpoints directly from this documentation. Masukkan JWT token (optional) dan parameters, lalu klik "Send Request".

Token tersimpan di browser (localStorage). Leave empty for public endpoints.

๐Ÿ“ค Gunakan untuk upload file ke Media Service.

โš ๏ธ Note: Untuk upload file asli, gunakan curl atau Postman dengan multipart/form-data.

Response
Click "Send Request" to see the response...

Quick Test Buttons

Artifacts

Images

Museum

Other