DRAFTThe sandbox is not live yet. Every example here was returned by the platform's code in a test run on 2026-10-28, priced with example fees: no fee amount in them is an SMP price. Paths and fields can change before launch. Live keys are issued only after our bank program is approved.Sandbox not live yet · examples from a test run on 2026-10-28 · example fees

Reference · 8 operations

Bank accounts

Link and manage payers' bank accounts. The API hosts forward these paths to the bank-linking service.

Sandboxhttps://sandbox.socialmatterspay.com
Livehttps://api.socialmatterspay.com
Bank linkinghttps://connect.socialmatterspay.com
GET /v1/bank-accounts

List bank accounts (newest 100)

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Parameters

FieldNotes
payer_idquery · string—

Responses

StatusMeaning
200Bank accounts

Fields of each item of data (200)

FieldNotes
idstring—
objectstring = "bank_account"—
payer_idstring—
account_typeenumone of checking, savings
bank_namestring—
last_fourstring—
owner_namestring—
link_methodenumone of plaid_instant, plaid_match, micro_deposit, manual, sandbox
available_balance_centsintegerA sandbox test account only: the balance the risk checks read
statusenumone of pending_verification, verified, disconnected, failed
identity_match_scoreinteger | null—
signal_scoreinteger | null—
verified_atstring | null (date-time)—
disconnected_atstring | null (date-time)—
is_tokenizedbooleanThe bank gave a tokenized account number, which stops working when the payer's consent ends
item_healthenumThe bank connection, from Plaid's item webhooks (bank_account.relink_recommended / relink_required). one of ok, login_required, consent_expiring, disconnect_pending, revoked
consent_expires_atstring | null (date-time)—
disconnect_atstring | null (date-time)—
debit_blockenumSet when a debit to this account would fail; POST /v1/payments answers 422 relink_required. one of access_revoked, consent_expired, disconnected,
owner_changed_fromstring | nullSet when this account's holder name matches none of the payer's earlier accounts: the most recent of them. The merchant also gets bank_account.owner_changed. Names are compared without case, accents, punctuation, initials or Jr/Sr, and one name's words inside the other's count as the same holder.
created_atstring (date-time)—
Example

List a payer's bank accounts

GET /v1/bank-accounts
curl https://sandbox.socialmatterspay.com/v1/bank-accounts?payer_id=6427de75-801c-4ac6-95fa-870665d10af3 \
  -H 'Authorization: Bearer sk_sandbox_…'
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": [
    {
      "id": "1357923a-53e2-4aa9-a547-a20155759d6c",
      "object": "bank_account",
      "payer_id": "6427de75-801c-4ac6-95fa-870665d10af3",
      "account_type": "checking",
      "bank_name": "Plaid Checking (sandbox)",
      "last_four": "9606",
      "owner_name": "Ana Lopez",
      "link_method": "sandbox",
      "status": "verified",
      "identity_match_score": null,
      "signal_score": null,
      "verified_at": "2026-10-28T00:22:35.485Z",
      "disconnected_at": null,
      "is_tokenized": false,
      "item_health": "ok",
      "consent_expires_at": null,
      "disconnect_at": null,
      "debit_block": null,
      "owner_changed_from": null,
      "created_at": "2026-10-28T00:22:35.485Z"
    }
  ]
}
POST /v1/bank-accounts/link-token

A Plaid Link token for one payer

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Give payer_id, or payer_email to create-or-find the payer. 503 when Plaid is not configured.

Request body

FieldNotes
payer_idstring—
payer_emailstring (email)—
payer_namestring—
payer_ipstringThe payer's IP at checkout; sets private_relay

Responses

StatusMeaning
201Link token
404Error — error shape and codes
503Error — error shape and codes

Fields of data (201)

FieldNotes
objectstring = "link_token"—
link_tokenstring—
expirationstring (date-time)—
payer_idstring—
private_relayboolean | nullTrue when payer_ip is an iCloud Private Relay address, which some banks' sign-in pages block; null when not given or unknown
Example

status 503 in this build: Plaid keys are not configured.

Start a Plaid bank sign-in

POST /v1/bank-accounts/link-token
curl -X POST https://sandbox.socialmatterspay.com/v1/bank-accounts/link-token \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "payer_id": "6427de75-801c-4ac6-95fa-870665d10af3"
}'
Response · 503
HTTP 503
Cache-Control: no-store

{
  "error": "plaid_not_configured",
  "message": "Plaid credentials are not configured on this deployment"
}
POST /v1/bank-accounts/exchange

Turn a Plaid public token into a verified bank account

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

The account and routing numbers are sealed (ECDH P-256 + AES-256-GCM) before they are stored.

Request body

FieldNotes
payer_id requiredstring—
public_token requiredstring—
account_id requiredstring—
payer_namestringUsed for Plaid Identity Match

Responses

StatusMeaning
201Bank account (BankAccount)
404Error — error shape and codes
503Error — error shape and codes

Fields of data (201)

The same fields as under listBankAccounts.

Example

status 503 in this build: Plaid keys are not configured.

Exchange Plaid's public token

POST /v1/bank-accounts/exchange
curl -X POST https://sandbox.socialmatterspay.com/v1/bank-accounts/exchange \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "payer_id": "6427de75-801c-4ac6-95fa-870665d10af3",
  "public_token": "public-sandbox-00000000-0000-0000-0000-000000000000",
  "account_id": "plaid-account-id"
}'
Response · 503
HTTP 503
Cache-Control: no-store

{
  "error": "plaid_not_configured",
  "message": "Plaid credentials are not configured on this deployment"
}
POST /v1/bank-accounts/micro-deposits

Link by account and routing number; SMP sends two small credits to confirm

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Request body

FieldNotes
payer_email requiredstring (email)—
account_number requiredstringpattern ^\d{4,17}$
routing_number requiredstringMust pass the ABA checksum. pattern ^\d{9}$
account_typeenumone of checking, savings. default "checking"
account_holder_name requiredstring—

Responses

StatusMeaning
201Bank account (BankAccount)
400Error — error shape and codes
502Error — error shape and codes
503Error — error shape and codes

Fields of data (201)

The same fields as under listBankAccounts.

Example

Start micro-deposit verification

POST /v1/bank-accounts/micro-deposits
curl -X POST https://sandbox.socialmatterspay.com/v1/bank-accounts/micro-deposits \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "payer_email": "sam.chen@example.com",
  "account_number": "000123456789",
  "routing_number": "110000000",
  "account_type": "checking",
  "account_holder_name": "Sam Chen"
}'
Response · 201
HTTP 201
Cache-Control: no-store

{
  "data": {
    "id": "88f55d73-0426-4ef9-bd68-319118670a30",
    "object": "bank_account",
    "payer_id": "459cd5c9-9b27-4f89-a937-22716591353e",
    "account_type": "checking",
    "bank_name": "Bank account",
    "last_four": "6789",
    "owner_name": "Sam Chen",
    "link_method": "micro_deposit",
    "status": "pending_verification",
    "identity_match_score": null,
    "signal_score": null,
    "verified_at": null,
    "disconnected_at": null,
    "is_tokenized": false,
    "item_health": "ok",
    "consent_expires_at": null,
    "disconnect_at": null,
    "debit_block": null,
    "owner_changed_from": null,
    "created_at": "2026-10-28T00:22:35.499Z"
  }
}
GET /v1/bank-accounts/{id}

Get a bank account

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Parameters

FieldNotes
id requiredpath · string—

Responses

StatusMeaning
200Bank account (BankAccount)
404Error — error shape and codes

Fields of data (200)

The same fields as under listBankAccounts.

Example

Get a bank account

GET /v1/bank-accounts/1357923a-53e2-4aa9-a547-a20155759d6c
curl https://sandbox.socialmatterspay.com/v1/bank-accounts/1357923a-53e2-4aa9-a547-a20155759d6c \
  -H 'Authorization: Bearer sk_sandbox_…'
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": {
    "id": "1357923a-53e2-4aa9-a547-a20155759d6c",
    "object": "bank_account",
    "payer_id": "6427de75-801c-4ac6-95fa-870665d10af3",
    "account_type": "checking",
    "bank_name": "Plaid Checking (sandbox)",
    "last_four": "9606",
    "owner_name": "Ana Lopez",
    "link_method": "sandbox",
    "status": "verified",
    "identity_match_score": null,
    "signal_score": null,
    "verified_at": "2026-10-28T00:22:35.485Z",
    "disconnected_at": null,
    "is_tokenized": false,
    "item_health": "ok",
    "consent_expires_at": null,
    "disconnect_at": null,
    "debit_block": null,
    "owner_changed_from": null,
    "created_at": "2026-10-28T00:22:35.485Z"
  }
}
DELETE /v1/bank-accounts/{id}

Disconnect a bank account (no further debits)

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Parameters

FieldNotes
id requiredpath · string—

Responses

StatusMeaning
200Bank account (BankAccount)
404Error — error shape and codes
409Error — error shape and codes

Fields of data (200)

The same fields as under listBankAccounts.

Example

Disconnect a bank account

DELETE /v1/bank-accounts/88f55d73-0426-4ef9-bd68-319118670a30
curl -X DELETE https://sandbox.socialmatterspay.com/v1/bank-accounts/88f55d73-0426-4ef9-bd68-319118670a30 \
  -H 'Authorization: Bearer sk_sandbox_…'
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": {
    "id": "88f55d73-0426-4ef9-bd68-319118670a30",
    "object": "bank_account",
    "payer_id": "459cd5c9-9b27-4f89-a937-22716591353e",
    "account_type": "checking",
    "bank_name": "Bank account",
    "last_four": "6789",
    "owner_name": "Sam Chen",
    "link_method": "micro_deposit",
    "status": "disconnected",
    "identity_match_score": null,
    "signal_score": null,
    "verified_at": "2026-10-28T00:22:35.507Z",
    "disconnected_at": "2026-10-28T00:22:37.694Z",
    "is_tokenized": false,
    "item_health": "ok",
    "consent_expires_at": null,
    "disconnect_at": null,
    "debit_block": null,
    "owner_changed_from": null,
    "created_at": "2026-10-28T00:22:35.499Z"
  }
}
POST /v1/bank-accounts/{id}/verify

Confirm the two micro-deposit amounts; three wrong tries fail the account

Secret key

Host https://api.socialmatterspay.com · https://sandbox.socialmatterspay.com · https://connect.socialmatterspay.com

Parameters

FieldNotes
id requiredpath · string—

Request body

FieldNotes
amounts requiredarray of integerat least 2 items. at most 2 items

Responses

StatusMeaning
200Bank account (BankAccount)
404Error — error shape and codes
409Error — error shape and codes
422Error — error shape and codes

Fields of data (200)

The same fields as under listBankAccounts.

Example

Confirm the two amounts

POST /v1/bank-accounts/88f55d73-0426-4ef9-bd68-319118670a30/verify
curl -X POST https://sandbox.socialmatterspay.com/v1/bank-accounts/88f55d73-0426-4ef9-bd68-319118670a30/verify \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "amounts": [
    45,
    89
  ]
}'
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": {
    "id": "88f55d73-0426-4ef9-bd68-319118670a30",
    "object": "bank_account",
    "payer_id": "459cd5c9-9b27-4f89-a937-22716591353e",
    "account_type": "checking",
    "bank_name": "Bank account",
    "last_four": "6789",
    "owner_name": "Sam Chen",
    "link_method": "micro_deposit",
    "status": "verified",
    "identity_match_score": null,
    "signal_score": null,
    "verified_at": "2026-10-28T00:22:35.507Z",
    "disconnected_at": null,
    "is_tokenized": false,
    "item_health": "ok",
    "consent_expires_at": null,
    "disconnect_at": null,
    "debit_block": null,
    "owner_changed_from": null,
    "created_at": "2026-10-28T00:22:35.499Z"
  }
}