Skip to main content
POST
/
api
/
v2.0
/
ewallet
/
trigger-topup
Trigger Top-Up
curl --request POST \
  --url https://sandbox-payment-b2b.singapay.id/api/v2.0/ewallet/trigger-topup \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'X-PARTNER-ID: <api-key>' \
  --header 'X-Signature: <x-signature>' \
  --header 'X-Timestamp: <x-timestamp>' \
  --data '
{
  "account_id": "01K5G4FZZ18DMK0M5QTR8Y9QY9",
  "reference_number": "REF-001",
  "ewallet_code": "DANA",
  "customer_number": "085733347341",
  "amount": {
    "value": "10000.00",
    "currency": "IDR"
  },
  "notes": "Top up DANA"
}
'
{
  "response_code": "SP000",
  "response_message": "Successful",
  "data": {
    "transaction_id": "EWT-20260402-0001",
    "transaction_status": {
      "code": "03",
      "desc": "Pending"
    },
    "reference_number": "REF-001",
    "notes": "Top up DANA",
    "ewallet": {
      "code": "DANA",
      "customer_number": "085733347341",
      "customer_name": "John Doe"
    },
    "post_timestamp": "2026-04-02T10:30:00+07:00",
    "processed_timestamp": "2026-04-02T10:30:05+07:00",
    "balance_after": {
      "value": "10000.00",
      "currency": "IDR"
    },
    "net_amount": {
      "value": "10000.00",
      "currency": "IDR"
    },
    "fee": {
      "value": "10000.00",
      "currency": "IDR"
    },
    "gross_amount": {
      "value": "10000.00",
      "currency": "IDR"
    }
  }
}

Authorizations

Authorization
string
header
required

JWT issued by POST /api/v1.1/access-token/b2b. Send Authorization: Bearer <token>.

X-PARTNER-ID
string
header
required

Merchant API key (Credential.api_key). Required on every request.

Headers

X-Signature
string
required

HMAC-SHA512 hex signature, computed as HMAC_SHA512(clientSecret, "{HTTP_METHOD}:{REQUEST_URI}:{ACCESS_TOKEN}:{SHA256_HEX(MINIFIED_BODY)}:{X_TIMESTAMP}"). MINIFIED_BODY is the request body with object keys recursively sorted alphabetically and re-serialised with no whitespace (an empty/missing body hashes the empty string). ACCESS_TOKEN is the bearer token without the Bearer prefix. Missing header returns 400 (response_code=4019900); signature mismatch returns 401 (response_code=4019900).

X-Timestamp
string<date-time>
required

ISO-8601 timestamp of the request; used as part of the signed string. Missing header returns 400 (response_code=4019900).

Body

application/json

Request payload to initiate an e-wallet transfer. Includes validation, balance deduction, and asynchronous processing through the job queue.

account_id
string
required

Unique identifier (ULID) of the merchant account

Maximum string length: 64
Example:

"01K5G4FZZ18DMK0M5QTR8Y9QY9"

reference_number
string
required

Unique reference identifier for this transaction. Must be unique per account to prevent duplicate submissions.

Maximum string length: 64
Example:

"REF-001"

ewallet_code
string
required

E-wallet provider code (DANA, OVO, GOPAY, SHOPEEPAY)

Example:

"DANA"

customer_number
string
required

Beneficiary phone number or account identifier

Required string length: 10 - 15
Example:

"085733347341"

amount
object
required

Transfer amount (includes platform fees if applicable)

notes
string | null

Optional transaction notes or description for internal reference. Notes only allows space, alphanumeric, non-latin letter, non-latin numeric, and "/" characters.

Maximum string length: 50
Example:

"Top up DANA"

Response

Queued — data matches EwalletTriggerTopUpSuccessData (usually 03 Pending)

Success response data after balance lock and transaction creation (HTTP 200). Transaction status is typically Pending until processed by job or confirmed via webhook. Funds have been deducted from merchant account.

response_code
string

Standardized response code (e.g., SP000 for success)

Example:

"SP000"

response_message
string

Human-readable response message

Example:

"Successful"

data
object

Detailed data about the initiated transaction