CONFIDENTIAL

TPID Payment Docs

API Reference & Integration Guide — 85 Endpoints, 7 Services

Version 1.0 Base URL https://api.pocikode.web.id Endpoints 85 Updated 28 August 2026

Introduction

Dokumen ini merupakan referensi lengkap API untuk platform pembayaran TPID Payment Docs. Seluruh endpoint, format request/response, dan mekanisme autentikasi bersifat rahasia dan hanya untuk partner resmi yang telah diotorisasi.

Seven components: Core Auth (31), Core Payment (17), Core Transfer (7), Core Wallet (8), Core Worker (1), Dashboard Web App (19), and Backoffice Portal (2).

CONFIDENTIAL — Dokumen ini tidak boleh didistribusikan ke pihak ketiga tanpa persetujuan tertulis dari TPID Payment Docs.

Getting Started

Base URL

EnvironmentBase URL
Productionhttps://api.pocikode.web.id

Service Endpoints

Core Auth

https://api.pocikode.web.id/auth

Core Payment

https://api.pocikode.web.id/payment

Core Transfer

https://api.pocikode.web.id/transfer

Core Wallet

https://api.pocikode.web.id/wallet

Core Worker

https://api.pocikode.web.id/worker

Dashboard Merchant

https://dashboard-merchant.nexuscode.web.id

Backoffice

https://backoffice.nexuscode.web.id

Content Type

Semua request harus menggunakan Content-Type: application/json kecuali upload yang menggunakan multipart/form-data.

Integration Flow

1. Register via POST /merchant-portal/auth/register
2. Verify OTP via POST /merchant-portal/auth/otp
3. Complete registration via POST /merchant-portal/auth/verify
4. Login via POST /merchant-portal/auth/login — receive JWT
5. Use access token for all authenticated endpoints

Authentication

Bearer Token (JWT)

Obtained via POST /merchant-portal/auth/login:

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Cookie-Based Session (Dashboard)

Dashboard Web App uses cookie-based sessions. After login, session cookie is set automatically.

Cookie: connect.sid=s%3A...

SNAP Signature

HeaderDescription
X-CLIENT-KEYPartner client key
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature
X-PARTNER-IDMerchant/partner ID
X-EXTERNAL-IDUnique request ID
CHANNEL-IDChannel identifier

Internal Signature (HMAC)

HeaderDescription
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREBlake3 HMAC signature

Common Response Format

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Human-readable description",
  "message_id": "API_CALL_xxxxx",
  "message_request_datetime": "2026-08-28T13:00:00+07:00"
}

SNAP Response Format

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "partnerReferenceNo": "...",
  "referenceNo": "..."
}

Dashboard Response Format

{
  "success": true,
  "user": {
    "access_token": "eyJhbGciOiJIUzI1NiIs..."
  }
}

Error Codes Reference

message_actionHTTP StatusDescription
SUCCESS200Request berhasil diproses
GENERAL_ERROR_REQUEST400Permintaan tidak valid
INVALID_CREDENTIALS401Email atau password tidak cocok
INVALID_SIGNATURE403Signature tidak valid
NOT_FOUND404Resource tidak ditemukan
DUPLICATE_EXTERNAL_ID409External ID sudah ada
INTERNAL_SERVER_ERROR500Kesalahan server internal

HTTP Status Codes

CodeMeaning
200Success
302Redirect
400Bad Request
401Unauthorized
403Forbidden
404Not Found
405Method Not Allowed
409Conflict
500Internal Server Error

Rate Limits

Endpoint GroupLimitScope
Default100 requests/60sPer IP
SNAP EndpointsSubject to partner agreementPer partner

Core Auth Service — 31 endpoints

Base URL: https://api.pocikode.web.id/auth

GET /api/v1/health

Health check. Public.

Auth: Public

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "status": "ok"
  },
  "message_desc": "Request processed successfully"
}
POST /merchant-portal/auth/register

Register merchant baru. OTP dikirim ke email.

Auth: Public

Request Body

{
  "email": "merchant@example.com"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Kode OTP telah dikirim ke email Anda."
}
POST /merchant-portal/auth/otp

Verifikasi OTP yang dikirim ke email.

Auth: Public

Request Body

{
  "email": "merchant@example.com",
  "otp": "123456"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "OTP verified successfully."
}
POST /merchant-portal/auth/verify

Lengkapi registrasi dengan mengatur password.

Auth: Public

Request Body

{
  "email": "merchant@example.com",
  "password": "ChangeMe123!"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Registration complete."
}
POST /merchant-portal/auth/login

Login merchant. Mengembalikan JWT access token.

Auth: Public

Request Body

{
  "email": "merchant@example.com",
  "password": "ChangeMe123!"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "user_id": "uuid-here",
    "full_name": "Merchant Name",
    "email": "merchant@example.com",
    "role": "OWNER",
    "has_merchant": true,
    "access_token": "eyJhbGciOiJIUzI1NiIs..."
  },
  "message_desc": "Login berhasil."
}

Response 401 Unauthorized

{
  "message_action": "INVALID_CREDENTIALS",
  "message_data": {},
  "message_desc": "Alamat email atau kata sandi tidak cocok."
POST /merchant-portal/auth/forgot-password

Kirim link reset password ke email.

Auth: Public

Request Body

{
  "email": "merchant@example.com"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Reset link sent to email."
}
GET /merchant-portal/auth/reset-password-page

Halaman reset password (HTML page).

Auth: Public

HTML page for password reset form.

Response 200 OK

POST /merchant-portal/auth/reset-password

Reset password menggunakan token dari email.

Auth: Public

Request Body

{
  "email": "merchant@example.com",
  "token": "reset-token-from-email",
  "password": "NewPass123!"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Password has been reset."
}
POST /merchant-portal/auth/logout

Logout merchant. Invalidate current JWT token.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Logged out successfully."
}
PATCH /merchant-portal/auth/password

Update password user yang sedang login.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "current_password": "OldPass123!",
  "new_password": "NewPass123!",
  "confirm_password": "NewPass123!"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Password updated."
}
GET /merchant-portal/profile

Dapatkan profil merchant yang sedang login.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "email": "merchant@example.com",
    "full_name": "Merchant Name",
    "role": "OWNER"
  }
}
GET /merchant-portal/merchant

Daftar seluruh merchant milik user.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": [
      {
        "id": 3,
        "merchant_id": "00000683",
        "wallet_id": "00000683",
        "name": "Warung QRIS Coba",
        "merchant_status": "ACTIVE",
        "verification_status": "LIVE"
      }
    ],
    "pagination": {
      "limit": 10,
      "page": 1,
      "total_data": 1,
      "total_page": 1
    }
  }
}
POST /merchant-portal/merchant

Buat merchant baru untuk user yang sedang login.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "name": "Warung QRIS Coba",
  "type_merchant": "INVOICING"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683",
    "name": "Warung QRIS Coba"
  },
  "message_desc": "Merchant created."
}
PATCH /merchant-portal/merchant/{merchantID}

Update informasi merchant berdasarkan merchantID.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Path Parameters

ParameterTypeDescription
merchantIDstringMerchant ID (e.g. 00000683)

Request Body

{
  "name": "Updated Merchant Name"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Merchant updated."
}
GET /merchant-portal/settings/merchant

Dapatkan pengaturan merchant termasuk callback URLs.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683",
    "qris_callback_url": "https://your-app.com/callback",
    "document_urls": {}
  }
}
PATCH /merchant-portal/settings/merchant/callback

Perbarui URL callback QRIS untuk merchant.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "qris_callback_url": "https://your-app.com/callback"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Callback URL updated."
}
POST /merchant-portal/reset-password

Reset merchant password (admin action).

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Merchant password reset."
}
GET /api/v1/preview/{key}

Preview file. Redirect ke presigned S3 URL.

Auth: Public

Path Parameters

ParameterTypeDescription
keystringFile key identifier (e.g. uploads/example.pdf)

Response 302 Found

"

Redirect ke presigned S3 URL.

"
POST /api/v1/upload

Upload file.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>
Content-Typemultipart/form-data

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "File uploaded successfully."
}
DELETE /api/v1/file/{key}

Hapus file berdasarkan key.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Path Parameters

ParameterTypeDescription
keystringFile key identifier

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "File deleted successfully."
}
POST /openapi/v1.0/access-token/b2b

Dapatkan B2B access token untuk integrasi SNAP.

Auth: SNAP Headers

Headers

HeaderValue
X-CLIENT-KEYPartner client key
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "grantType": "client_credentials"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "tokenType": "bearer",
  "expiresIn": 86400
}
POST /user/internal/signature/symmetric/verification INTERNAL

Validasi signature simetrik antar microservice.

Auth: Internal Signature

Headers

HeaderValue
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREBlake3 HMAC signature

Request Body

{
  "data": "payload-to-verify",
  "signature": "hex-signature"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "valid": true
  }
}
POST /user/internal/signature/asymetric INTERNAL

Generate signature asimetrik untuk komunikasi antar microservice.

Auth: Internal Signature

Headers

HeaderValue
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREBlake3 HMAC signature

Request Body

{
  "data": "payload-to-sign"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "signature": "base64-signature"
  }
}
POST /internal/merchant PRIVATE

Validasi merchant dari microservice internal.

Auth: Internal

Request Body

{
  "merchant_id": "MCH-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "valid": true
  }
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
GET /internal/dashboard/merchant PRIVATE

Data merchant untuk dashboard internal.

Auth: Internal

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
GET /backoffice/merchant/verification BACKOFFICE

Daftar verifikasi merchant di backoffice.

Auth: Backoffice

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": []
  }
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
PUT /backoffice/merchant/verification BACKOFFICE

Verifikasi atau reject merchant dari backoffice.

Auth: Backoffice

Request Body

{
  "merchant_id": "00000683",
  "status": "APPROVED",
  "note": "Documents verified"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "Merchant verification updated."
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
GET /backoffice/merchant/{merchantID}/verification BACKOFFICE

Detail verifikasi merchant tertentu.

Auth: Backoffice

Path Parameters

ParameterTypeDescription
merchantIDstringMerchant ID (e.g. 00000683)

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683",
    "verification_status": "PENDING"
  }
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
GET /backoffice/merchant BACKOFFICE

Daftar semua merchant dari backoffice.

Auth: Backoffice

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": []
  }
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
GET /backoffice/merchant/{merchantID} BACKOFFICE

Detail merchant dari backoffice.

Auth: Backoffice

Path Parameters

ParameterTypeDescription
merchantIDstringMerchant ID (e.g. 00000683)

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683",
    "name": "Warung QRIS Coba",
    "merchant_status": "ACTIVE"
  }
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
POST /backoffice/merchant/upload-nmid BACKOFFICE

Upload batch NMID dari backoffice.

Auth: Backoffice

Request Body

{
  "nmid_data": "batch-payload"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {},
  "message_desc": "NMID batch uploaded."
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.

Core Payment Service — 17 endpoints

Base URL: https://api.pocikode.web.id/payment

GET /api/v1/health

Health check endpoint.

Auth: Public

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "status": "ok"
  },
  "message_desc": "Request processed successfully"
}
POST /secure/jsonAPI/v1/echo

Artajasa echo test — verifikasi konektivitas jaringan.

Auth: Partner (HMAC-SHA256)

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "institutionCode": "002"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS"
}
POST /secure/jsonAPI/v1/signoff

Artajasa signoff — end of day processing.

Auth: Partner (HMAC-SHA256)

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "institutionCode": "002"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS"
}
POST /secure/jsonAPI/v1/cut-over

Artajasa cut-over processing.

Auth: Partner (HMAC-SHA256)

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "institutionCode": "002"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS"
}
POST /secure/jsonAPI/v1/paycredit

Artajasa pay credit — credit payment processing.

Auth: Partner (HMAC-SHA256)

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "institutionCode": "002"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS"
}
POST /secure/jsonAPI/v1/checkstatus

Artajasa check status — cek status transaksi.

Auth: Partner (HMAC-SHA256)

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "institutionCode": "002"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS"
}
POST /openapi/v1.0/qr/qr-mpm-generate

Generate QRIS MPM via SNAP partner. Mengembalikan QR content.

Auth: SNAP Headers

Headers

HeaderValue
AuthorizationBearer <snap_token>
X-TIMESTAMPISO 8601 timestamp
X-PARTNER-IDPartner ID
X-EXTERNAL-IDUnique request ID
CHANNEL-IDChannel identifier
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "partnerReferenceNo": "TEST-QR-001",
  "merchantId": "00000171",
  "terminalId": "T-001",
  "amount": {
    "value": "10000.00",
    "currency": "IDR"
  }
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "partnerReferenceNo": "TEST-QR-001",
  "referenceNo": "INV-20260828-xxx",
  "qrContent": "000201010212...",
  "merchantVisibleData": "Warung QRIS Coba"
}
POST /openapi/v1.0/qr/qr-mpm-generate/internal INTERNAL

Generate QRIS MPM dari internal microservice.

Auth: Internal

Request Body

{
  "partnerReferenceNo": "INT-QR-001",
  "merchantId": "00000171",
  "amount": {
    "value": "25000.00",
    "currency": "IDR"
  }
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "qrContent": "000201010212..."
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /openapi/v1.0/qr/qr-mpm-decode

Decode QRIS content yang discan oleh customer.

Auth: SNAP Headers

Headers

HeaderValue
AuthorizationBearer <snap_token>
X-TIMESTAMPISO 8601 timestamp
X-PARTNER-IDPartner ID
X-EXTERNAL-IDUnique request ID
CHANNEL-IDChannel identifier
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "partnerReferenceNo": "TEST-DECODE-001",
  "qrContent": "000201010212...",
  "scanTime": "2026-08-28T10: 00: 00+07: 00",
  "additionalInfo": {}
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "partnerReferenceNo": "TEST-DECODE-001",
  "referenceNo": "REF-xxx",
  "merchantInfo": {
    "merchantId": "00000171",
    "merchantName": "Warung QRIS Coba"
  }
}
POST /openapi/v1.0/qr/qr-mpm-query

Query status transaksi QRIS berdasarkan reference number.

Auth: SNAP Headers

Headers

HeaderValue
AuthorizationBearer <snap_token>
X-TIMESTAMPISO 8601 timestamp
X-PARTNER-IDPartner ID
X-EXTERNAL-IDUnique request ID
CHANNEL-IDChannel identifier
X-SIGNATUREHMAC-SHA256 signature

Request Body

{
  "originalReferenceNo": "REF-001",
  "serviceCode": "47",
  "merchantId": "00000171"
}

Response 200 OK

{
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "partnerReferenceNo": "...",
  "referenceNo": "REF-001",
  "transactionStatus": "SUCCESS",
  "amount": {
    "value": "25000.00",
    "currency": "IDR"
  }
}
GET /merchant-portal/transaction

Daftar transaksi merchant dengan filter tanggal.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeRequiredDescription
merchant_idstringYesMerchant ID
start_datestringNoFormat: YYYY-MM-DD
end_datestringNoFormat: YYYY-MM-DD
limitintegerNoDefault: 10
pageintegerNoDefault: 1

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": [],
    "pagination": {
      "limit": 10,
      "page": 1,
      "total_items": 0,
      "total_pages": 0
    }
  }
}
GET /merchant-portal/summary/total

Ringkasan total transaksi merchant.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeRequiredDescription
merchant_idstringYesMerchant ID
start_datestringNoFormat: YYYY-MM-DD
end_datestringNoFormat: YYYY-MM-DD

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "total_transactions": 150,
    "total_amount": 1500000,
    "total_fees": 15000
  }
}
GET /merchant-portal/analytics

Data analitik transaksi merchant.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeRequiredDescription
merchant_idstringYesMerchant ID
start_datestringNoFormat: YYYY-MM-DD
end_datestringNoFormat: YYYY-MM-DD

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
POST /merchant-portal/qr/qr-mpm-generate

Generate QRIS MPM melalui Merchant Portal. Lebih sederhana dari SNAP.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "amount": 25000,
  "validity_period": 15
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "reference_no": "INV-20260828-xxx",
    "qr_content": "000201010212...",
    "amount": 25000,
    "qris_type": "QRIS_DYNAMIC",
    "merchant_name": "Warung QRIS Coba",
    "validity_period": "15m"
  }
}
GET /backoffice/transactions BACKOFFICE

Daftar seluruh transaksi dari backoffice.

Auth: Backoffice

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": []
  }
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
GET /backoffice/configuration BACKOFFICE

Ambil konfigurasi sistem pembayaran.

Auth: Backoffice

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.
PATCH /backoffice/configuration BACKOFFICE

Update konfigurasi sistem pembayaran.

Auth: Backoffice

Request Body

{
  "key": "config_name",
  "value": "new_value"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Backoffice Only — Endpoint ini hanya diakses dari backoffice portal.

Core Transfer Service — 7 endpoints

Base URL: https://api.pocikode.web.id/transfer

GET /api/v1/health

Health check endpoint.

Auth: Public

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "status": "ok"
  }
}
POST /api/v1/inquiry

Inquiry rekening tujuan sebelum transfer.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "bank_code": "002",
  "bank_account": "1234567890",
  "external_id": "TEST-INQUIRY-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "bank_code": "002",
    "bank_account": "1234567890",
    "account_name": "Test Recipient"
  }
}
POST /api/v1/payment

Eksekusi transfer ke rekening tujuan.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

{
  "recipient_bank": "002",
  "recipient_account": "1234567890",
  "recipient_name": "Test Recipient",
  "amount": 10000,
  "note": "Sandbox payment",
  "external_id": "TEST-PAYMENT-001",
  "merchant_id": "MCH-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "external_id": "TEST-PAYMENT-001",
    "status": "PENDING",
    "amount": 10000
  }
}
GET /api/v1/balance

Cek saldo tersedia untuk transfer.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "balance": 500000,
    "currency": "IDR"
  }
}
GET /api/v1/status/{external_id}

Cek status settlement berdasarkan external ID.

Auth: Bearer Token

Headers

HeaderValue
AuthorizationBearer <access_token>

Path Parameters

ParameterTypeDescription
external_idstringUnique external ID dari request transfer

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "external_id": "TEST-PAYMENT-001",
    "status": "SETTLED",
    "settlement_date": "2026-08-28T15: 00: 00+07: 00"
  }
}
POST /api/v1/internal-confirm INTERNAL

Internal inquiry antar akun. Hanya untuk microservice internal.

Auth: Internal Signature

Request Body

{
  "from_account": "ACC-001",
  "to_account": "ACC-002",
  "amount": 10000,
  "external_id": "TEST-INT-INF-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /api/v1/internal-transfer INTERNAL

Eksekusi transfer internal antar akun.

Auth: Internal Signature

Request Body

{
  "from_account": "ACC-001",
  "to_account": "ACC-002",
  "amount": 10000,
  "external_id": "TEST-INT-TRF-001",
  "inquiry_id": "550e8400-e29b-41d4-a716-446655440000"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.

Core Wallet Service — 8 endpoints

Base URL: https://api.pocikode.web.id/wallet

Internal Only — Seluruh wallet endpoint (kecuali health) hanya boleh diakses dari microservice internal.
GET /api/v1/health

Health check untuk Core Wallet service.

Auth: Public

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "status": "ok"
  },
  "message_desc": "Request processed successfully"
}
POST /internal/wallet/overbooking INTERNAL

Transfer antar wallet (overbooking).

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "api_call": "CALL-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/status INTERNAL

Cek status history wallet.

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "api_call": "CALL-002"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/detail INTERNAL

Detail informasi wallet.

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "api_call": "CALL-003"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/debit INTERNAL

Debit (pengurangan) saldo wallet.

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "amount": 5000,
  "api_call": "CALL-004"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/credit INTERNAL

Credit (penambahan) saldo wallet.

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "amount": 10000,
  "api_call": "CALL-005"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/validate INTERNAL

Validasi wallet.

Auth: Internal Signature

Request Body

{
  "wallet_id": "WAL-001",
  "api_call": "CALL-006"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.
POST /internal/wallet/balance INTERNAL

Cek saldo wallet. Memerlukan JWT + internal signature.

Auth: JWT + Internal Signature

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREBlake3 HMAC signature

Request Body

{
  "wallet_id": "WAL-001"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "wallet_id": "WAL-001",
    "balance": 100000
  }
}
Internal/Private — Endpoint ini hanya dapat diakses dari internal yang telah terdaftar. Akses dari eksternal akan ditolak.

Core Worker Service — 1 endpoint

Base URL: https://api.pocikode.web.id/worker

GET /health

Health check untuk Core Worker. Mengembalikan status setiap dependency.

Auth: Public

Response 200 OK

{
  "service": "core-worker",
  "services": {
    "postgres": "not connected",
    "redis": "healthy"
  },
  "status": "ok",
  "uptime": "2h15m"
}

Dashboard Web App — 19 endpoints

Base URL: https://dashboard-merchant.nexuscode.web.id

Dashboard Web App is a Next.js frontend that proxies to Core Auth service. Cookie-based sessions for browser access, Bearer token proxy for API access.

POST /api/auth/login

Login ke dashboard. Returns cookie session + access token.

Auth: Public

Request Body

{
  "email": "merchant@example.com",
  "password": "ChangeMe123!"
}

Response 200 OK

{
  "success": true,
  "user": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "full_name": "Merchant Name",
    "email": "merchant@example.com"
  }
}
POST /api/auth/logout

Logout dari dashboard. Invalidate session.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Request Body

{}

Response 200 OK

{
  "success": true
}
GET /api/auth/profile

Dapatkan profil user dari session cookie.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Response 200 OK

{
  "success": true,
  "user": {
    "email": "merchant@example.com",
    "full_name": "Merchant Name"
  }
}
POST /api/auth/reset-password

Kirim reset password link ke email.

Auth: Public

Request Body

{
  "email": "merchant@example.com"
}

Response 200 OK

{
  "success": true
}
POST /api/register/send-otp

Kirim OTP ke email untuk registrasi.

Auth: Public

Request Body

{
  "email": "newuser@example.com"
}

Response 200 OK

{
  "success": true
}
POST /api/register/verify-otp

Verifikasi OTP registrasi.

Auth: Public

Request Body

{
  "email": "newuser@example.com",
  "otp": "123456"
}

Response 200 OK

{
  "success": true
}
POST /api/register/create-account

Buat akun baru setelah OTP verified.

Auth: Public

Request Body

{
  "email": "newuser@example.com",
  "password": "NewPass123!",
  "otp": "123456"
}

Response 200 OK

{
  "success": true
}
POST /api/merchant/register

Register merchant baru via dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Request Body

{
  "name": "New Merchant",
  "type_merchant": "INVOICING"
}

Response 200 OK

{
  "success": true
}
GET /api/merchant/settings

Dapatkan pengaturan merchant.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Response 200 OK

{
  "success": true,
  "settings": {
    "merchant_id": "00000683",
    "qris_callback_url": "https://your-app.com/callback"
  }
}
PATCH /api/merchant/settings

Update pengaturan merchant.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Request Body

{
  "qris_callback_url": "https://new-callback.com/hook"
}

Response 200 OK

{
  "success": true
}
GET /api/merchants

Daftar merchants (proxy ke Core Auth via Bearer token).

Auth: Bearer Token Proxy

Headers

HeaderValue
AuthorizationBearer <access_token> (proxied to Core Auth)

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": [
      {
        "merchant_id": "00000683",
        "name": "Warung QRIS Coba"
      }
    ]
  }
}
POST /api/merchants

Create merchant (proxy ke Core Auth).

Auth: Bearer Token Proxy

Headers

HeaderValue
AuthorizationBearer <access_token> (proxied to Core Auth)

Request Body

{
  "name": "New Merchant",
  "type_merchant": "INVOICING"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683"
  }
}
GET /api/merchants/{id}

Detail merchant (proxy ke Core Auth via Bearer token).

Auth: Bearer Token Proxy

Headers

HeaderValue
AuthorizationBearer <access_token> (proxied to Core Auth)

Path Parameters

ParameterTypeDescription
idstringMerchant ID (e.g. MCH-001)

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "merchant_id": "00000683",
    "name": "Warung QRIS Coba"
  }
}
PATCH /api/merchants/{id}

Update merchant (proxy ke Core Auth).

Auth: Bearer Token Proxy

Headers

HeaderValue
AuthorizationBearer <access_token> (proxied to Core Auth)

Path Parameters

ParameterTypeDescription
idstringMerchant ID (e.g. MCH-001)

Request Body

{
  "name": "Updated Name"
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
GET /api/transactions

Daftar transaksi merchant dari dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "items": []
  }
}
POST /api/qris/generate

Generate QRIS dinamis dari dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Request Body

{
  "amount": 10000
}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "qr_content": "000201010212...",
    "amount": 10000
  }
}
POST /api/qris/static

Generate QRIS statis dari dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Request Body

{}

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "qr_content": "000201010212..."
  }
}
POST /api/upload

Upload file dari dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...
Content-Typemultipart/form-data

Response 200 OK

{
  "success": true,
  "key": "uploads/example.pdf"
}
DELETE /api/upload/{key}

Hapus file dari dashboard.

Auth: Cookie Session

Headers

HeaderValue
Cookieconnect.sid=s%3A...

Path Parameters

ParameterTypeDescription
keystringFile key (e.g. uploads/example.pdf)

Response 200 OK

{
  "success": true
}

Backoffice Portal — 2 endpoints

Base URL: https://backoffice.nexuscode.web.id

GET /

Root URL redirects to admin login page.

Auth: Public

Response 302 Found

"

Redirect to /admin/login

"
GET /admin/login

Admin login page (serves HTML page).

Auth: Public

Response 200 OK

"

HTML login page for backoffice admin.

"

Support

ChannelDetails
Emailapi-support@nexuscode.web.id
Dashboardhttps://backoffice.nexuscode.web.id
Postman Collection — Postman collection lengkap tersedia upon request. Hubungi api-support@nexuscode.web.id.
Sandbox Access — Untuk environment testing, gunakan base URL yang sama. Seluruh data di sandbox bersifat simulasi.