Skip to main content
POST
Create

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. ACCESS_TOKEN is the bearer token without the Bearer prefix. Missing header returns 422 (response_code=SP018); signature mismatch returns 401 (response_code=SP016).

X-Timestamp
string<date-time>
required

Timestamp of the request; used as part of the signed string. Missing header returns 422 (response_code=SP018).

Body

application/json

Target account, reference number, customer details, withdrawal amount, and payment channel selection.

Request body for initiating a new cardless withdrawal transaction. The target account is specified in the body (account_id), not in the URL path.

account_id
string
required

Unique identifier (ULID) of the merchant account to debit. The account must be active and belong to the authenticated merchant.

Maximum string length: 99
Example:

"01K946KF851RK7FX075GJHBVKF"

reference_number
string
required

Unique merchant reference for this withdrawal within the account. Used for idempotency; a duplicate reference returns HTTP 400 with response code SP004.

Maximum string length: 64
Example:

"REF-20260610-001"

customer_name
string
required

Name of the end customer performing the ATM withdrawal.

Maximum string length: 100
Example:

"Budi Santoso"

customer_id
string
required

Merchant-side identifier of the end customer.

Maximum string length: 50
Example:

"CUST-00123"

amount
number
required

Net withdrawal amount in IDR. Must be a multiple of 50,000, between 50,000 and 1,000,000 inclusive. Values that are not a multiple of 50,000 return HTTP 422 with response code SP018.

Required range: 50000 <= x <= 1000000
Example:

500000

vendor_code
string
required

Code identifying the cardless withdrawal payment channel. Contact support for the list of available vendor codes.

Maximum string length: 50
Example:

"CLWD_BRI"

Response

SP000 Successfully — withdrawal initiated (data.transaction_status.code is 01). The data.otp_number holds the OTP for ATM redemption. Note: data.balance_after is always "0" on this response — it is not the actual post-debit balance; use the show or list endpoint to read the real account balance.

Custom v2 envelope for cardless withdrawal create and cancel. Success uses SP000 (HTTP 200).

response_code
string
required

SingaPay custom business response code.

Example:

"SP000"

response_message
string
required

Human-readable label paired with response_code.

Example:

"Successfully"

data
object
required

data on successful create or cancel (HTTP 200, response_code SP000).