CONFIDENTIAL

TPID Nexus Code

API Reference & Integration Guide

Version 1.0 Base URL https://api.pocikode.web.id 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 yang tercantum di sini bersifat rahasia dan hanya untuk partner resmi yang telah diotorisasi.

This document covers five microservices that compose the TPID Nexus Core Platform: Core Auth, Core Payment, Core Transfer, Core Wallet, and Core Worker.

CONFIDENTIAL — Dokumen ini tidak boleh didistribusikan ke pihak ketiga tanpa persetujuan tertulis dari TPID Payment Docs. Pelanggaran akan diproses secara hukum.

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

Content Type

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

Integration Flow

Alur integrasi standar untuk merchant baru:

1. Register account 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 access token

5. Use access token for all authenticated endpoints

Authentication

Bearer Token (JWT)

Obtained via POST /merchant-portal/auth/login. Sertakan di setiap authenticated request:

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

SNAP Signature

Untuk SNAP endpoints (QRIS partner), headers berikut wajib disertakan:

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)

Untuk internal endpoints antar microservice:

HeaderDescription
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREBlake3 HMAC signature

Common Response Format

Semua endpoint menggunakan format respons berikut:

{
  "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

QRIS endpoints mengikuti format SNAP:

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

Error Codes Reference

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

HTTP Status Codes

CodeMeaning
200Success
302Redirect
400Bad Request / Invalid payload
401Unauthorized / Invalid credentials
403Forbidden / Invalid signature
404Not Found
405Method Not Allowed
409Conflict (duplicate external ID)
500Internal Server Error

Rate Limits

Endpoint GroupLimitScope
Default100 requests per 60 secondsPer IP address
SNAP EndpointsSubject to partner agreementPer partner

Core Auth Service

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

GET /api/v1/health

Health check endpoint. Tidak memerlukan autentikasi.

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": { "status": "ok" },
  "message_desc": "Request processed successfully",
  "message_id": "",
  "message_request_datetime": "2026-08-28T13:00:00+07:00"
}
POST /merchant-portal/auth/register

Register merchant baru. OTP akan dikirim ke email yang didaftarkan.

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.

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 proses registrasi dengan mengatur password.

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 untuk autentikasi.

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.

Request Body

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

Response 200 OK

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

Dapatkan profil merchant yang sedang login. Memerlukan autentikasi.

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. Memerlukan autentikasi.

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
    }
  }
}
GET /merchant-portal/settings/merchant

Dapatkan pengaturan merchant termasuk callback URLs dan document URLs.

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.

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."
}
GET /api/v1/preview/{key}

Preview file. Redirect ke presigned S3 URL. Endpoint publik.

Path Parameters

ParameterTypeDescription
keystringFile key identifier

Response 302 Found

Redirect ke presigned S3 URL untuk file yang diminta.

POST /api/v1/upload

Upload file. Memerlukan autentikasi.

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. Memerlukan autentikasi.

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. Memerlukan signature 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
}

Response 400 Bad Request

{
  "responseCode": "4007302",
  "responseMessage": "Invalid Mandatory Field X-CLIENT-KEY."
}

Core Payment Service

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

GET /api/v1/health

Health check endpoint. Format respons sama dengan Core Auth health.

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": { "status": "ok" },
  "message_desc": "Request processed successfully"
}
POST /openapi/v1.0/qr/qr-mpm-generate

Generate QRIS MPM (Merchant Presented Mode) via SNAP partner integration. Mengembalikan QR content yang dapat discan oleh customer.

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 /merchant-portal/qr/qr-mpm-generate

Generate QRIS MPM melalui Merchant Portal. Lebih sederhana dari SNAP — cukup amount dan validity period.

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"
  }
}
POST /openapi/v1.0/qr/qr-mpm-decode

Decode QRIS content yang discan oleh customer. Mengembalikan informasi merchant dan transaksi.

Headers

Sama dengan QRIS Generate SNAP headers.

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.

Headers

Sama dengan QRIS Generate SNAP headers.

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. Memerlukan autentikasi.

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeRequiredDescription
merchant_idstringYesMerchant ID
start_datestringYesFormat: YYYY-MM-DD
end_datestringYesFormat: 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.

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeDescription
merchant_idstringMerchant ID

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.

Headers

HeaderValue
AuthorizationBearer <access_token>

Query Parameters

ParameterTypeDescription
merchant_idstringMerchant ID

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {}
}
POST /secure/jsonAPI/v1/{action}

Artajasa integration endpoints. Semua request harus di-sign dengan HMAC-SHA256. Digunakan untuk interoperabilitas jaringan pembayaran.

Available Endpoints

EndpointDescription
POST /secure/jsonAPI/v1/echoEcho test endpoint
POST /secure/jsonAPI/v1/signoffSign off / end of day
POST /secure/jsonAPI/v1/cut-overCut-over processing
POST /secure/jsonAPI/v1/paycreditCredit payment processing
POST /secure/jsonAPI/v1/checkstatusCheck transaction status

Headers

HeaderValue
AuthorizationBearer <access_token>
X-TIMESTAMPISO 8601 timestamp
X-SIGNATUREHMAC-SHA256 signature
Note: Semua Artajasa endpoints menggunakan HMAC-SHA256 signature. Hubungi tim integrasi untuk mendapatkan secret key.

Core Transfer Service

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

POST /api/v1/inquiry

Inquiry rekening tujuan sebelum melakukan transfer. Memerlukan autentikasi.

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. Memerlukan autentikasi.

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. Memerlukan autentikasi.

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. Memerlukan autentikasi.

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"
  }
}

Core Wallet Service

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

GET /api/v1/health

Health check endpoint untuk Core Wallet service.

Response 200 OK

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

Cek saldo wallet. Internal endpoint — hanya dapat diakses dari microservice internal.

Headers

HeaderValue
AuthorizationBearer <access_token>

Request Body

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

Response 200 OK

{
  "message_action": "SUCCESS",
  "message_data": {
    "wallet_id": "WAL-001",
    "balance": 100000
  }
}
POST /internal/wallet/{operation}

Operasi wallet internal. Semua endpoint memerlukan HMAC signature (Blake3). Hanya dapat diakses dari microservice internal.

Headers

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

Available Operations

EndpointDescription
POST /internal/wallet/debitDebit (pengurangan) saldo wallet
POST /internal/wallet/creditCredit (penambahan) saldo wallet
POST /internal/wallet/overbookingTransfer antar wallet
POST /internal/wallet/validateValidasi wallet
POST /internal/wallet/statusCek status wallet
POST /internal/wallet/detailDetail informasi wallet

Debit Example

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

Credit Example

{
  "wallet_id": "WAL-001",
  "amount": 10000,
  "api_call": "CALL-003"
}
Internal Only — Wallet endpoints hanya boleh diakses dari microservice internal yang telah terdaftar. Akses dari eksternal akan ditolak.

Core Worker Service

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

GET /health

Health check untuk Core Worker. Mengembalikan status setiap dependency.

Response 200 OK

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

Support

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