POST /v1/sandbox/advance
Move this merchant's sandbox clock forward, then run settlement and the return scan
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
seconds requiredinteger | 1 to 7776000 |
Responses
| Status | Meaning |
|---|---|
200 | The new clock and balances |
404 | Error — error shape and codes |
Fields of data (200)
| Field | Notes | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
objectstring = "sandbox_clock" | — | ||||||||||||||
offset_secondsinteger | — | ||||||||||||||
nowstring (date-time) | — | ||||||||||||||
returns_processedinteger | — | ||||||||||||||
balancesobject | The merchant's balances on SMP's ledger, from one snapshot7 child fields
|
Example
Move the sandbox clock 61 seconds
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/advance \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"seconds": 61
}'
HTTP 200
Cache-Control: no-store
{
"data": {
"object": "sandbox_clock",
"offset_seconds": 61,
"now": "2026-10-28T00:23:36.567Z",
"returns_processed": 0,
"balances": {
"settlement_cents": 8400,
"merchant_balance_cents": 8051,
"fee_revenue_cents": 349,
"held_cents": 0,
"pending_cents": 0,
"reserve_held_cents": 0,
"payable_cents": 8051
}
}
}
POST /v1/sandbox/return
The sandbox bank returns a settled debit now
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
The bank only reports it; SMP books it on the next return scan or POST /v1/sandbox/advance.
Request body
| Field | Notes |
|---|---|
payment_id requiredstring | — |
code requiredenum | one of R01, R02, R03, R04, R05, R07, R08, R09, R10, R11, R16, R20, R29, R51 |
Responses
| Status | Meaning |
|---|---|
202 | Returned at the bank, not yet booked |
404 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (202)
| Field | Notes |
|---|---|
objectstring = "sandbox_bank_return" | — |
payment_idstring | — |
return_codestring | — |
returned_atstring (date-time) | — |
bookedboolean = false | — |
Example
Make the payer's bank return a debit
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/return \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"payment_id": "b17067cf-5562-4448-a039-3149a0ccd6cc",
"code": "R01"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_bank_return",
"payment_id": "b17067cf-5562-4448-a039-3149a0ccd6cc",
"return_code": "R01",
"returned_at": "2026-10-28T00:24:38.640Z",
"booked": false
}
}
POST /v1/sandbox/notice-of-change
The payer's bank sends a Notice of Change for a payment's debit; applied on the next scan or advance
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
payment_id requiredstring | — |
change_code requiredenum | one of C01, C02, C03, C05, C06, C07 |
Responses
| Status | Meaning |
|---|---|
202 | Sent by the bank |
400 | Error — error shape and codes |
404 | Error — error shape and codes |
Fields of data (202)
| Field | Notes |
|---|---|
objectstring = "sandbox_notice_of_change" | — |
payment_idstring | — |
change_codeenum | one of C01, C02, C03, C05, C06, C07 |
noticestring | The bank's reference for the notice, noc_ and a UUID. |
appliedboolean | Always false here: SMP applies the notice on its next scan (every 15 minutes) or on POST /v1/sandbox/advance. |
Example
The payer's bank corrects an account (notice of change)
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/notice-of-change \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"payment_id": "3c8029c9-00de-481f-aff2-4e80839dea08",
"change_code": "C01"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_notice_of_change",
"payment_id": "3c8029c9-00de-481f-aff2-4e80839dea08",
"change_code": "C01",
"notice": "noc_bf9d9dc4-5daf-4f42-b721-1844e9f6d126",
"applied": false
}
}
POST /v1/sandbox/payout-return
The bank sends a payout back (cancelled before it settles, or returned with code after); booked on the next scan
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
payout_id requiredstring | — |
codestring | Return code for a settled payout (default R03) |
Responses
| Status | Meaning |
|---|---|
202 | Sent back by the bank |
400 | Error — error shape and codes |
404 | Error — error shape and codes |
Fields of data (202)
| Field | Notes |
|---|---|
objectstring = "sandbox_payout_return" | — |
payout_idstring | — |
bank_statusenum | The sandbox bank's status of the payout transfer after the call. A payout not yet settled is cancelled; a settled one is returned. one of pending, settled, returned, cancelled |
return_codestring | null | The return code, once the transfer is returned; null for a cancelled transfer. |
bookedboolean | Always false here: SMP books the return on its next settlement or return scan. |
Example
Your bank sends a payout back
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/payout-return \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"payout_id": "7b6d615c-b239-44a0-b13d-fc2507da24ab",
"code": "R03"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_payout_return",
"payout_id": "7b6d615c-b239-44a0-b13d-fc2507da24ab",
"bank_status": "returned",
"return_code": "R03",
"booked": false
}
}
POST /v1/sandbox/fee-collection-return
The merchant's bank returns a settled fee collection debit with code; booked on the next scan or advance
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
fee_collection_id requiredstring | — |
code requiredstring | — |
Responses
| Status | Meaning |
|---|---|
202 | Returned by the bank |
400 | Error — error shape and codes |
404 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (202)
| Field | Notes |
|---|---|
objectstring = "sandbox_fee_collection_return" | — |
fee_collection_idstring | — |
return_codestring | The return code that was sent. |
bookedboolean | Always false here: SMP books the return on its next return scan. |
Example
The merchant's bank returns a fee debit
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/fee-collection-return \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"fee_collection_id": "fc_d7dfee96-ee3a-4a4b-96f5-bb17919f1b76",
"code": "R01"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_fee_collection_return",
"fee_collection_id": "fc_d7dfee96-ee3a-4a4b-96f5-bb17919f1b76",
"return_code": "R01",
"booked": false
}
}
POST /v1/sandbox/invoices/{id}/push
The sandbox customer sends money to an invoice's account
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
An ACH credit lands after the sandbox settle delay (POST /v1/sandbox/advance moves the clock); an instant payment lands now.
Parameters
| Field | Notes |
|---|---|
id requiredpath · string | — |
Request body
| Field | Notes |
|---|---|
amount_cents requiredinteger | 1 to 1000000000 |
railenum | one of ach, instant. default "ach" |
Responses
| Status | Meaning |
|---|---|
202 | Sent from the customer's bank |
400 | Error — error shape and codes |
404 | Error — error shape and codes |
Fields of data (202)
| Field | Notes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
objectstring = "sandbox_incoming_credit" | — | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
invoice_idstring | — | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
amount_centsinteger | — | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
railenum | one of ach, instant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bank_statusstring | — | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lands_atstring (date-time) | — | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
invoiceobject | 21 child fields
|
Examples (2)
The customer sends part by ACH
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/invoices/69fcf9e0-a58f-4891-ac46-3f2a615e070d/push \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"amount_cents": 1000000,
"rail": "ach"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_incoming_credit",
"invoice_id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
"amount_cents": 1000000,
"rail": "ach",
"bank_status": "pending",
"lands_at": "2026-10-28T00:28:40.666Z",
"invoice": {
"id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
"object": "invoice",
"status": "sent",
"amount_cents": 1850000,
"paid_cents": 0,
"remaining_cents": 1850000,
"overpaid_cents": 0,
"currency": "USD",
"customer_name": "Acme Wholesale Inc",
"customer_email": "ap@acme.example",
"due_date": "2026-11-27",
"description": "October shop supplies",
"line_items": [
{
"description": "Shelving units",
"quantity": 40,
"unit_price_cents": 42500
},
{
"description": "Delivery and installation",
"quantity": 1,
"unit_price_cents": 150000
}
],
"external_id": "INV-2026-0412",
"funds": {
"received_cents": 0,
"booked_cents": 0,
"held_at_bank_cents": 0,
"status": "none"
},
"virtual_account_last_four": "6252",
"paid_at": null,
"cancelled_at": null,
"overdue_at": null,
"created_at": "2026-10-28T00:27:40.662Z"
}
}
}
The rest arrives as an instant payment
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/invoices/69fcf9e0-a58f-4891-ac46-3f2a615e070d/push \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"amount_cents": 850000,
"rail": "instant"
}'
HTTP 202
Cache-Control: no-store
{
"data": {
"object": "sandbox_incoming_credit",
"invoice_id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
"amount_cents": 850000,
"rail": "instant",
"bank_status": "settled",
"lands_at": "2026-10-28T00:28:41.687Z",
"invoice": {
"id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
"object": "invoice",
"status": "paid",
"amount_cents": 1850000,
"paid_cents": 1850000,
"remaining_cents": 0,
"overpaid_cents": 0,
"currency": "USD",
"customer_name": "Acme Wholesale Inc",
"customer_email": "ap@acme.example",
"due_date": "2026-11-27",
"description": "October shop supplies",
"line_items": [
{
"description": "Shelving units",
"quantity": 40,
"unit_price_cents": 42500
},
{
"description": "Delivery and installation",
"quantity": 1,
"unit_price_cents": 150000
}
],
"external_id": "INV-2026-0412",
"funds": {
"received_cents": 1850000,
"booked_cents": 1850000,
"held_at_bank_cents": 0,
"status": "booked"
},
"virtual_account_last_four": "6252",
"paid_at": "2026-10-28T00:28:41.687Z",
"cancelled_at": null,
"overdue_at": null,
"created_at": "2026-10-28T00:27:40.662Z"
}
}
}
POST /v1/sandbox/balance-history
A test account's daily available balance, so payday-aware debits can be tried without a bank
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
One reading per day (a date sent again replaces it). The newest reading also becomes the account's live balance.
Request body
| Field | Notes | ||||
|---|---|---|---|---|---|
bank_account_id requiredstring | — | ||||
observations requiredarray of object | at least 1 item. at most 400 items2 child fields
|
Responses
| Status | Meaning |
|---|---|
200 | Recorded |
400 | Error — error shape and codes |
404 | Error — error shape and codes |
Fields of data (200)
| Field | Notes |
|---|---|
objectstring = "sandbox_balance_history" | — |
bank_account_idstring | — |
recordedinteger | — |
fromstring (date) | — |
tostring (date) | — |
payday_foundboolean | — |
Example
A test account's daily balance
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/balance-history \
-H 'Authorization: Bearer sk_sandbox_…' \
-H 'Content-Type: application/json' \
-d '{
"bank_account_id": "0fb9dd42-2bd9-49c1-9c85-68872c5cee57",
"observations": [
{
"date": "2026-08-01",
"available_balance_cents": 76000
},
{
"date": "2026-08-02",
"available_balance_cents": 72000
},
{
"date": "2026-08-03",
"available_balance_cents": 68000
},
{
"date": "2026-08-04",
"available_balance_cents": 64000
},
{
"date": "2026-08-05",
"available_balance_cents": 60000
},
{
"date": "2026-08-06",
"available_balance_cents": 56000
},
{
"date": "2026-08-07",
"available_balance_cents": 262000
},
{
"date": "2026-08-08",
"available_balance_cents": 258000
},
{
"date": "2026-08-09",
"available_balance_cents": 254000
},
{
"date": "2026-08-10",
"available_balance_cents": 250000
},
{
"date": "2026-08-11",
"available_balance_cents": 246000
},
{
"date": "2026-08-12",
"available_balance_cents": 242000
},
{
"date": "2026-08-13",
"available_balance_cents": 238000
},
{
"date": "2026-08-14",
"available_balance_cents": 234000
},
{
"date": "2026-08-15",
"available_balance_cents": 230000
},
{
"date": "2026-08-16",
"available_balance_cents": 226000
},
{
"date": "2026-08-17",
"available_balance_cents": 222000
},
{
"date": "2026-08-18",
"available_balance_cents": 218000
},
{
"date": "2026-08-19",
"available_balance_cents": 214000
},
{
"date": "2026-08-20",
"available_balance_cents": 210000
},
{
"date": "2026-08-21",
"available_balance_cents": 416000
},
{
"date": "2026-08-22",
"available_balance_cents": 412000
},
{
"date": "2026-08-23",
"available_balance_cents": 408000
},
{
"date": "2026-08-24",
"available_balance_cents": 404000
},
{
"date": "2026-08-25",
"available_balance_cents": 400000
},
{
"date": "2026-08-26",
"available_balance_cents": 396000
},
{
"date": "2026-08-27",
"available_balance_cents": 392000
},
{
"date": "2026-08-28",
"available_balance_cents": 388000
},
{
"date": "2026-08-29",
"available_balance_cents": 384000
},
{
"date": "2026-08-30",
"available_balance_cents": 380000
},
{
"date": "2026-08-31",
"available_balance_cents": 376000
},
{
"date": "2026-09-01",
"available_balance_cents": 372000
},
{
"date": "2026-09-02",
"available_balance_cents": 368000
},
{
"date": "2026-09-03",
"available_balance_cents": 364000
},
{
"date": "2026-09-04",
"available_balance_cents": 570000
},
{
"date": "2026-09-05",
"available_balance_cents": 566000
},
{
"date": "2026-09-06",
"available_balance_cents": 562000
},
{
"date": "2026-09-07",
"available_balance_cents": 558000
},
{
"date": "2026-09-08",
"available_balance_cents": 554000
},
{
"date": "2026-09-09",
"available_balance_cents": 550000
},
{
"date": "2026-09-10",
"available_balance_cents": 546000
},
{
"date": "2026-09-11",
"available_balance_cents": 542000
},
{
"date": "2026-09-12",
"available_balance_cents": 538000
},
{
"date": "2026-09-13",
"available_balance_cents": 534000
},
{
"date": "2026-09-14",
"available_balance_cents": 530000
},
{
"date": "2026-09-15",
"available_balance_cents": 526000
},
{
"date": "2026-09-16",
"available_balance_cents": 522000
},
{
"date": "2026-09-17",
"available_balance_cents": 518000
},
{
"date": "2026-09-18",
"available_balance_cents": 724000
},
{
"date": "2026-09-19",
"available_balance_cents": 720000
},
{
"date": "2026-09-20",
"available_balance_cents": 716000
},
{
"date": "2026-09-21",
"available_balance_cents": 712000
},
{
"date": "2026-09-22",
"available_balance_cents": 708000
},
{
"date": "2026-09-23",
"available_balance_cents": 704000
},
{
"date": "2026-09-24",
"available_balance_cents": 700000
},
{
"date": "2026-09-25",
"available_balance_cents": 696000
},
{
"date": "2026-09-26",
"available_balance_cents": 692000
},
{
"date": "2026-09-27",
"available_balance_cents": 688000
},
{
"date": "2026-09-28",
"available_balance_cents": 684000
},
{
"date": "2026-09-29",
"available_balance_cents": 680000
},
{
"date": "2026-09-30",
"available_balance_cents": 676000
},
{
"date": "2026-10-01",
"available_balance_cents": 672000
},
{
"date": "2026-10-02",
"available_balance_cents": 878000
},
{
"date": "2026-10-03",
"available_balance_cents": 874000
},
{
"date": "2026-10-04",
"available_balance_cents": 870000
},
{
"date": "2026-10-05",
"available_balance_cents": 866000
},
{
"date": "2026-10-06",
"available_balance_cents": 862000
},
{
"date": "2026-10-07",
"available_balance_cents": 858000
},
{
"date": "2026-10-08",
"available_balance_cents": 854000
},
{
"date": "2026-10-09",
"available_balance_cents": 850000
},
{
"date": "2026-10-10",
"available_balance_cents": 846000
},
{
"date": "2026-10-11",
"available_balance_cents": 842000
},
{
"date": "2026-10-12",
"available_balance_cents": 838000
},
{
"date": "2026-10-13",
"available_balance_cents": 834000
},
{
"date": "2026-10-14",
"available_balance_cents": 830000
},
{
"date": "2026-10-15",
"available_balance_cents": 826000
},
{
"date": "2026-10-16",
"available_balance_cents": 1032000
},
{
"date": "2026-10-17",
"available_balance_cents": 1028000
},
{
"date": "2026-10-18",
"available_balance_cents": 1024000
},
{
"date": "2026-10-19",
"available_balance_cents": 1020000
},
{
"date": "2026-10-20",
"available_balance_cents": 1016000
},
{
"date": "2026-10-21",
"available_balance_cents": 1012000
},
{
"date": "2026-10-22",
"available_balance_cents": 1008000
},
{
"date": "2026-10-23",
"available_balance_cents": 1004000
},
{
"date": "2026-10-24",
"available_balance_cents": 1000000
},
{
"date": "2026-10-25",
"available_balance_cents": 996000
},
{
"date": "2026-10-26",
"available_balance_cents": 992000
},
{
"date": "2026-10-27",
"available_balance_cents": 988000
},
{
"date": "2026-10-28",
"available_balance_cents": 984000
},
{
"date": "2026-10-29",
"available_balance_cents": 980000
},
{
"date": "2026-10-30",
"available_balance_cents": 1186000
}
]
}'
HTTP 200
Cache-Control: no-store
{
"data": {
"object": "sandbox_balance_history",
"bank_account_id": "0fb9dd42-2bd9-49c1-9c85-68872c5cee57",
"recorded": 91,
"from": "2026-08-01",
"to": "2026-10-30",
"payday_found": true
}
}
POST /v1/sandbox/debit-schedules/run
Take this merchant's scheduled debits that are due now, at its sandbox clock, whatever the hour
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Responses
| Status | Meaning |
|---|---|
200 | What the pass did |
Fields of data (200)
| Field | Notes |
|---|---|
objectstring = "scheduled_debit_run" | — |
merchantsinteger | — |
submittedinteger | — |
declinedinteger | — |
failedinteger | — |
missedinteger | — |
waitinginteger | — |
replannedinteger | — |
balances_recordedinteger | — |
Example
Take the debits due now
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/debit-schedules/run \
-H 'Authorization: Bearer sk_sandbox_…'
HTTP 200
Cache-Control: no-store
{
"data": {
"object": "scheduled_debit_run",
"merchants": 1,
"submitted": 1,
"declined": 0,
"failed": 0,
"missed": 0,
"waiting": 0,
"replanned": 0,
"balances_recorded": 1
}
}
POST /v1/sandbox/payer-invites/deliver
Send this merchant's queued invites to the sandbox outbox now (the 10-minute pass does it too)
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Responses
| Status | Meaning |
|---|---|
200 | Sent |
Fields of data (200)
| Field | Notes |
|---|---|
objectstring = "payer_invite_delivery" | — |
sentinteger | — |
heldinteger | — |
Example
Send the queued invites now
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/payer-invites/deliver \
-H 'Authorization: Bearer sk_sandbox_…'
HTTP 200
Cache-Control: no-store
{
"data": {
"object": "payer_invite_delivery",
"sent": 2,
"held": 0
}
}
GET /v1/sandbox/payer-invites/outbox
The invite emails the sandbox sent, newest first (template payer_relink_invite and its data, link included)
Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com
Responses
| Status | Meaning |
|---|---|
200 | The outbox |
Fields of each item of data (200)
| Field | Notes | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
objectstring = "sandbox_email" | — | ||||||||||||
invite_idstring | — | ||||||||||||
templatestring = "payer_relink_invite" | — | ||||||||||||
to_emailstring | — | ||||||||||||
created_atstring (date-time) | — | ||||||||||||
dataobject | 6 child fields
|
Example
The invite emails the sandbox sent
curl https://sandbox.socialmatterspay.com/v1/sandbox/payer-invites/outbox \
-H 'Authorization: Bearer sk_sandbox_…'
HTTP 200
Cache-Control: no-store
{
"data": [
{
"object": "sandbox_email",
"invite_id": "inv_6f0994b7-d21e-45af-86ec-8dcde15f88e4",
"template": "payer_relink_invite",
"to_email": "kai.moreno@example.com",
"data": {
"merchant_name": "Northwind Supply",
"payer_name": "Kai Moreno",
"incentive": "Save 5% when you pay by bank",
"cta_url": "https://sandbox.socialmatterspay.com/i/payer_invite_token",
"unsubscribe_url": "https://sandbox.socialmatterspay.com/i/payer_invite_token/unsubscribe",
"landing_url": "https://northwind.example/pay-by-bank"
},
"created_at": "2026-11-04T03:00:00.811Z"
},
{
"object": "sandbox_email",
"invite_id": "inv_74c3b994-310e-44ae-82b9-af1a873e734c",
"template": "payer_relink_invite",
"to_email": "ivy.chen@example.com",
"data": {
"merchant_name": "Northwind Supply",
"payer_name": "Ivy Chen",
"incentive": "Save 5% when you pay by bank",
"cta_url": "https://sandbox.socialmatterspay.com/i/payer_invite_token",
"unsubscribe_url": "https://sandbox.socialmatterspay.com/i/payer_invite_token/unsubscribe",
"landing_url": "https://northwind.example/pay-by-bank"
},
"created_at": "2026-11-04T03:00:00.811Z"
}
]
}
