curl --request POST \
--url https://sg.sandbox.api.reap.global/postings/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "100"
}
]
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'DEPOSIT',
entries: [{virtualAssetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', amount: '100'}]
})
};
fetch('https://sg.sandbox.api.reap.global/postings/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/postings/"
payload = {
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "100"
}
]
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "<string>",
"rateSnapshot": 1
}
],
"settledAmount": 134.87,
"createdAt": "<string>"
}{
"error": {
"code": "POSTING_ACCOUNT_INELIGIBLE",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "POSTING_ACCOUNT_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "POSTING_VIRTUAL_ASSET_DISABLED",
"message": "<string>",
"detail": {}
}
}Create posting
Atomically applies a posting against the target account’s virtual asset balances. See the type field for variant semantics. For SETTLEMENT, the value applied to the outstanding card debt is returned as settledAmount, with the per-entry rate used reflected in entries[].rateSnapshot.
curl --request POST \
--url https://sg.sandbox.api.reap.global/postings/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "100"
}
]
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'DEPOSIT',
entries: [{virtualAssetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', amount: '100'}]
})
};
fetch('https://sg.sandbox.api.reap.global/postings/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/postings/"
payload = {
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "100"
}
]
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "DEPOSIT",
"entries": [
{
"virtualAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": "<string>",
"rateSnapshot": 1
}
],
"settledAmount": 134.87,
"createdAt": "<string>"
}{
"error": {
"code": "POSTING_ACCOUNT_INELIGIBLE",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "POSTING_ACCOUNT_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "POSTING_VIRTUAL_ASSET_DISABLED",
"message": "<string>",
"detail": {}
}
}Authorizations
API key as Bearer token
Headers
API version (YYYY-MM-DD)
2025-02-14 "2025-02-14"
Unique key for safely retrying this request. Up to 255 characters; we recommend a UUIDv4. The first request executes and its response is cached; subsequent requests with the same key replay the cached response (24h retention).
1 - 255Body
Account to post against
DEPOSIT: Credit the submitted virtual asset amounts to the account balance.WITHDRAWAL: Debit the submitted virtual asset amounts from the account balance. Rejected if any entry would take the balance below zero.SETTLEMENT: Debit the submitted virtual asset amounts from the account balance AND apply their value to the account’s outstanding card debt. Same non-negative guard asWITHDRAWAL.
DEPOSIT, WITHDRAWAL, SETTLEMENT "DEPOSIT"
At least one entry. Each virtualAssetId may appear only once.
1Show child attributes
Show child attributes
Response
Client-driven posting against an account.
Posting ID
Account ID
DEPOSIT: Credit the submitted virtual asset amounts to the account balance.WITHDRAWAL: Debit the submitted virtual asset amounts from the account balance. Rejected if any entry would take the balance below zero.SETTLEMENT: Debit the submitted virtual asset amounts from the account balance AND apply their value to the account’s outstanding card debt. Same non-negative guard asWITHDRAWAL.
DEPOSIT, WITHDRAWAL, SETTLEMENT "DEPOSIT"
Show child attributes
Show child attributes
Value applied to outstanding card debt, in the billing currency of the card program. Each entry is valued at amount × rateSnapshot and rounded to the billing currency's precision, then the entries are summed. Populated for SETTLEMENT postings, null otherwise.
134.87
ISO 8601 creation timestamp