DEV Community

ahmadasroni38
ahmadasroni38

Posted on

API Documentation - Webhook Apotek Online

πŸ“‹ Daftar Isi

πŸ“– Pendahuluan

API Webhook Apotek Online adalah interface untuk melakukan update status bridging resep kronis antara sistem apotek online dan sistem farmasi rumah sakit. API ini memungkinkan apotek online untuk memberikan feedback status processing resep secara real-time.

πŸ” Autentikasi

Semua endpoint webhook menggunakan token authentication. Token harus disertakan di header request dengan salah satu format berikut:

# Format 1: Authorization Bearer
Authorization: Bearer YOUR_TOKEN

# Format 2: Authorization tanpa Bearer
Authorization: YOUR_TOKEN

# Format 3: Custom Header
X-Webhook-Token: YOUR_TOKEN
Enter fullscreen mode Exit fullscreen mode

Token diperoleh dari administrator sistem farmasi rumah sakit.

🌐 Base URL

http://farmasi.balimed.local/api/webhook/apotek-online
Enter fullscreen mode Exit fullscreen mode

πŸ“‘ Endpoints

Health Check

Endpoint untuk mengecek status kesehatan webhook API.

Endpoint: GET /health

Headers:

Authorization: Bearer YOUR_TOKEN
Enter fullscreen mode Exit fullscreen mode

Response:

{
    "success": true,
    "message": "Webhook endpoint is healthy",
    "timestamp": "2025-08-19T10:30:00.000000Z",
    "version": "1.0.0"
}
Enter fullscreen mode Exit fullscreen mode

Get Resep Info

Mendapatkan informasi resep untuk verifikasi sebelum update status.

Endpoint: GET /resep/{resepId}

Headers:

Authorization: Bearer YOUR_TOKEN
Enter fullscreen mode Exit fullscreen mode

Parameters:

  • resepId (integer, required): ID resep yang akan dicek

Response Success:

{
    "success": true,
    "data": {
        "resep_id": 123,
        "nomor_resep": "RX-2025-08-001",
        "tanggal_resep": "2025-08-19",
        "no_rm": "RM001234",
        "nama_pasien": "John Doe",
        "bridging_status": "processing",
        "bridging_sent_at": "2025-08-19T10:00:00.000000Z",
        "bridging_attempts": 1,
        "bridging_error_message": null,
        "last_webhook_received": null
    }
}
Enter fullscreen mode Exit fullscreen mode

Response Error:

{
    "success": false,
    "message": "Resep kronis tidak ditemukan"
}
Enter fullscreen mode Exit fullscreen mode

Update Status Bridging

Update status bridging untuk satu resep.

Endpoint: POST /update-status

Headers:

Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Request Body:

{
    "resep_id": 123,
    "status": "success",
    "response_id": "AOL-123-456",
    "message": "Resep berhasil diproses dan siap diantar",
    "response_data": {
        "estimated_delivery": "2025-08-20",
        "pharmacy_notes": "Obat tersedia lengkap"
    },
    "delivery_info": {
        "courier": "Express Delivery",
        "tracking_number": "TRK123456789"
    }
}
Enter fullscreen mode Exit fullscreen mode

Request Parameters:

  • resep_id (integer, required): ID resep
  • status (string, required): Status baru (success, failed, processing, delivered, cancelled)
  • response_id (string, optional): ID response dari sistem apotek online
  • message (string, optional): Pesan atau keterangan tambahan
  • response_data (object, optional): Data response tambahan
  • delivery_info (object, optional): Info pengiriman (untuk status delivered)

Response Success:

{
    "success": true,
    "message": "Status bridging berhasil diupdate",
    "data": {
        "resep_id": 123,
        "nomor_resep": "RX-2025-08-001",
        "old_status": "processing",
        "new_status": "success",
        "updated_at": "2025-08-19T10:35:00.000000Z"
    }
}
Enter fullscreen mode Exit fullscreen mode

Response Error:

{
    "success": false,
    "message": "Validasi gagal",
    "errors": {
        "resep_id": ["The resep_id field is required."],
        "status": ["The selected status is invalid."]
    }
}
Enter fullscreen mode Exit fullscreen mode

Batch Update Status

Update status bridging untuk multiple resep sekaligus.

Endpoint: POST /batch-update-status

Headers:

Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Request Body:

{
    "updates": [
        {
            "resep_id": 123,
            "status": "success",
            "response_id": "AOL-123-456",
            "message": "Resep berhasil diproses"
        },
        {
            "resep_id": 124,
            "status": "failed",
            "message": "Stok obat tidak tersedia"
        },
        {
            "resep_id": 125,
            "status": "delivered",
            "message": "Resep telah diantar",
            "delivery_info": {
                "delivered_at": "2025-08-19T14:30:00",
                "recipient": "John Doe",
                "signature": "base64_signature_data"
            }
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Request Parameters:

  • updates (array, required): Array berisi data update untuk setiap resep
  • updates[].resep_id (integer, required): ID resep
  • updates[].status (string, required): Status baru
  • updates[].response_id (string, optional): ID response
  • updates[].message (string, optional): Pesan
  • updates[].response_data (object, optional): Data response
  • updates[].delivery_info (object, optional): Info pengiriman

Response Success:

{
    "success": true,
    "message": "Batch update selesai. Berhasil: 2, Gagal: 1",
    "summary": {
        "total": 3,
        "success": 2,
        "failed": 1
    },
    "details": [
        {
            "resep_id": 123,
            "nomor_resep": "RX-2025-08-001",
            "success": true,
            "old_status": "processing",
            "new_status": "success",
            "message": "Status berhasil diupdate"
        },
        {
            "resep_id": 124,
            "nomor_resep": "RX-2025-08-002",
            "success": true,
            "old_status": "processing",
            "new_status": "failed",
            "message": "Status berhasil diupdate"
        },
        {
            "resep_id": 125,
            "success": false,
            "message": "Resep kronis tidak ditemukan"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

πŸ“Š Status Codes

Status Deskripsi Kapan Digunakan
success Berhasil diproses Resep berhasil diverifikasi dan disiapkan
failed Gagal diproses Resep tidak dapat diproses (stok kosong, dll)
processing Sedang diproses Resep sedang dalam tahap verifikasi/penyiapan
delivered Sudah diantar Resep telah berhasil diantar ke pasien
cancelled Dibatalkan Resep dibatalkan oleh apotek atau pasien

⚠️ Error Handling

HTTP Status Codes

  • 200 - Success
  • 400 - Bad Request (validasi gagal)
  • 401 - Unauthorized (token tidak valid)
  • 404 - Not Found (resep tidak ditemukan)
  • 500 - Internal Server Error

Error Response Format

{
    "success": false,
    "message": "Deskripsi error",
    "error_code": "ERROR_CODE",
    "errors": {
        "field_name": ["Error message"]
    }
}
Enter fullscreen mode Exit fullscreen mode

Error Codes

Code Deskripsi
TOKEN_MISSING Token tidak ditemukan di header
INVALID_TOKEN Token tidak valid
CONFIG_NOT_FOUND Konfigurasi sistem tidak ditemukan
AUTHENTICATION_ERROR Error saat verifikasi token

πŸš€ Contoh Penggunaan

1. Cek Status API

curl -X GET "http://farmasi.balimed.local/api/webhook/apotek-online/health" \
  -H "Authorization: Bearer YOUR_TOKEN"
Enter fullscreen mode Exit fullscreen mode

2. Ambil Info Resep

curl -X GET "http://farmasi.balimed.local/api/webhook/apotek-online/resep/123" \
  -H "Authorization: Bearer YOUR_TOKEN"
Enter fullscreen mode Exit fullscreen mode

3. Update Status Berhasil

curl -X POST "http://farmasi.balimed.local/api/webhook/apotek-online/update-status" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "resep_id": 123,
    "status": "success",
    "response_id": "AOL-123-456",
    "message": "Resep berhasil diproses dan siap diantar",
    "response_data": {
      "estimated_delivery": "2025-08-20",
      "pharmacy_notes": "Obat tersedia lengkap"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

4. Update Status Gagal

curl -X POST "http://farmasi.balimed.local/api/webhook/apotek-online/update-status" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "resep_id": 124,
    "status": "failed",
    "message": "Stok obat A tidak tersedia"
  }'
Enter fullscreen mode Exit fullscreen mode

5. Update Status Delivered

curl -X POST "http://farmasi.balimed.local/api/webhook/apotek-online/update-status" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "resep_id": 125,
    "status": "delivered",
    "message": "Resep telah diantar kepada pasien",
    "delivery_info": {
      "delivered_at": "2025-08-19T14:30:00",
      "recipient": "John Doe",
      "courier": "Express Delivery",
      "tracking_number": "TRK123456789"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

6. Batch Update

curl -X POST "http://farmasi.balimed.local/api/webhook/apotek-online/batch-update-status" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "resep_id": 123,
        "status": "success",
        "response_id": "AOL-123-456",
        "message": "Resep berhasil diproses"
      },
      {
        "resep_id": 124,
        "status": "failed",
        "message": "Stok obat tidak tersedia"
      }
    ]
  }'
Enter fullscreen mode Exit fullscreen mode

πŸ“ Notes

  1. Token Security: Token harus dijaga kerahasiaan dan tidak boleh dibagikan
  2. Rate Limiting: API memiliki rate limiting untuk mencegah abuse
  3. Logging: Semua request webhook akan di-log untuk audit trail
  4. Timeout: Request timeout maksimal 30 detik
  5. Retry Logic: Implementasikan retry logic dengan exponential backoff untuk handling error temporary

πŸ”„ Flow Integration

  1. Apotek Online menerima resep dari sistem farmasi RS
  2. Apotek Online memproses resep (verifikasi, penyiapan)
  3. Apotek Online mengirim update status melalui webhook:
    • processing - saat mulai memproses
    • success - jika berhasil disiapkan
    • failed - jika gagal (stok kosong, dll)
    • delivered - setelah diantar
    • cancelled - jika dibatalkan
  4. Sistem Farmasi RS menerima update dan melakukan tindakan sesuai status

πŸ“ž Support

Untuk bantuan teknis atau pertanyaan mengenai API ini, hubungi:


Last Updated: August 19, 2025

API Version: 1.0.0

Top comments (0)