API reference

Tenant API v1.1

Tenant API for A2A InstaPay (Fintechnology Asia Pacific Lanka Ltd, licensed to FINAP USA LLC). Companion to the A2A InstaPay PaaS Tenant Integration Specification v1.0 and the A2A InstaPay Tenant API Reference v1.1. Example values are illustrative and do not reflect pricing.

Sandbox base URLhttps://sandbox.a2ainstapay.com
AuthenticationOAuth 2.0 client credentials: POST /oauth/token, then Authorization: Bearer <access_token>
FormatJSON over HTTPS. Amounts are integers in cents (USD). Times are ISO 8601 in UTC.
Contract filesOpenAPI 3.1 (YAML) · OpenAPI 3.1 (JSON) · Postman collection

Conventions for idempotency, pagination, rate limits and versioning are in API conventions. Try any endpoint against your own workspace in the API explorer.

Errors#

Every error uses the same envelope. code is stable and meant for your code; message is for people and may change. Quote request_id when you contact support.

Field in errorTypeRequiredDescription
codestringYesStable error code from the error catalog. Code against this value.
Example: limit_exceeded
messagestringYesReadable description for logs and support. Do not show it to customers or parse it.
Example: The payment exceeds the daily amount limit for this customer.
paramstring or nullNoThe request field the error relates to, where there is one.
Example: amount
request_idstringYesIdentifier of the request, also returned in the A2A-Request-Id header. Quote it to support.
Example: req_4Hk8Lm2Np6
detailsobject or nullNoAdditional structured information for some errors, described in the catalog.
Example
{
  "error": {
    "code": "limit_exceeded",
    "message": "The amount exceeds the daily amount limit.",
    "param": "amount",
    "request_id": "req_8Hw2Kd9Lq4Zx7c",
    "details": {
      "limit": "daily_amount"
    }
  }
}

Authentication#

POST /oauth/token#

Obtain an access token

Exchanges the Tenant's client credentials for an access token. Send the body as application/x-www-form-urlencoded. Cache the token and request a new one shortly before it expires.

  • No access token; send the client credentials

Request body

FieldTypeRequiredDescription
grant_typestring, one of client_credentialsYesAlways client_credentials.
Example: client_credentials
client_idstringYesClient identifier for the environment.
Example: cli_sbx_example_01
client_secretstringYesClient secret for the environment.
Example: sk_sbx_redacted
Example request
curl -X POST "https://sandbox.a2ainstapay.com/oauth/token" \
  -d grant_type=client_credentials \
  -d client_id=$A2A_CLIENT_ID \
  -d client_secret=$A2A_CLIENT_SECRET

Response

200 OK, with a Token object.

Example response
{
  "access_token": "at_sbx_6c1f0e9b2a7d4e8f9a0b1c2d3e4f5a6b",
  "token_type": "Bearer",
  "expires_in": 900,
  "scope": "tenant"
}

Errors

StatusError codes
400parameter_missing
401invalid_client
429rate_limited
500internal_error

Customers#

POST /v1/customers#

Register a customer

Registers a consumer or merchant and returns the customer with an onboarding session. Open the session with the SDK to start verification.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
typestring, one of individual, businessYesindividual for a consumer, business for a merchant.
Example: individual
external_refstringYesThe Tenant's own reference, unique within the Tenant, up to 64 characters.
Example: member-10482
emailstringYesE-mail address.
Example: member@example.com
mobile_numberstringYesUS mobile number in E.164 format.
Example: +12025550148
prefillobject or nullNoOptional values to prefill the hosted screens: first_name, last_name, or for a business legal_name. Used for an existing operation.
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/customers" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"type":"individual","external_ref":"member-10482","email":"member@example.com","mobile_number":"+12025550148","prefill":{"first_name":"Avery","last_name":"Morgan"}}'

Response

201 Created, with a Customer object.

Example response
{
  "id": "cus_c9T2kXq4Lm",
  "object": "customer",
  "type": "individual",
  "external_ref": "member-10482",
  "email": "member@example.com",
  "mobile_number_last4": "4821",
  "business": null,
  "verification": {
    "status": "created",
    "updated_at": "2026-10-15T14:03:22Z",
    "retry_available_at": null
  },
  "account_id": null,
  "pin_locked": false,
  "onboarding_session": {
    "id": "ses_1Kd7Fg3Hj8",
    "flow": "onboarding",
    "token": "st_sbx_8a3c1e7f9b2d4a6c",
    "expires_at": "2026-10-15T14:33:22Z"
  },
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing, parameter_invalid, parameter_missing
401authentication_required
403flow_not_enabled
409duplicate_external_ref, duplicate_mobile_number
429rate_limited
500internal_error

GET /v1/customers#

Find a customer by external reference

Returns a list containing the customer with the given external_ref, or an empty list.

  • Requires an access token

Parameters

NameInRequiredDescription
external_refqueryYesThe Tenant's reference.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/customers" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a CustomerList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "cus_c9T2kXq4Lm",
      "object": "customer",
      "type": "individual",
      "external_ref": "member-10482",
      "email": "member@example.com",
      "mobile_number_last4": "4821",
      "business": null,
      "verification": {
        "status": "approved",
        "updated_at": "2026-10-15T14:04:10Z",
        "retry_available_at": null
      },
      "account_id": "acct_c3J8vN2Qe6",
      "pin_locked": false,
      "created_at": "2026-10-15T14:03:22Z",
      "updated_at": "2026-10-15T14:04:10Z",
      "version": 3
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
400parameter_missing
401authentication_required
429rate_limited
500internal_error

GET /v1/customers/{id}#

Retrieve a customer

Returns the customer, including verification status, account identifier and PIN lock status.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/customers/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Customer object.

Example response
{
  "id": "cus_c9T2kXq4Lm",
  "object": "customer",
  "type": "individual",
  "external_ref": "member-10482",
  "email": "member@example.com",
  "mobile_number_last4": "4821",
  "business": null,
  "verification": {
    "status": "approved",
    "updated_at": "2026-10-15T14:04:10Z",
    "retry_available_at": null
  },
  "account_id": "acct_c3J8vN2Qe6",
  "pin_locked": false,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:04:10Z",
  "version": 3
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

GET /v1/customers/{id}/owners#

List owners of a business

Returns the owners and control person of a business customer, with their verification status.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesBusiness customer identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/customers/{id}/owners" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a OwnerList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "own_2Lp9Vc4Mz7",
      "object": "owner",
      "customer_id": "cus_m7R5pWz1Hd",
      "name": "Jordan Ellis",
      "role": "owner_and_control_person",
      "ownership_percent": 60,
      "verification_status": "approved",
      "invited_at": "2026-10-15T14:03:22Z",
      "updated_at": "2026-10-15T14:04:10Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
401authentication_required
404not_found
409invalid_state
429rate_limited
500internal_error

GET /v1/customers/{id}/documents#

List accepted customer documents

Returns the customer documents the customer has accepted or must accept, with versions and times.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/customers/{id}/documents" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a DocumentAcceptanceList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "dacc_3Nb6Vc9Xz2",
      "object": "document_acceptance",
      "customer_id": "cus_c9T2kXq4Lm",
      "document_type": "digital_account_terms",
      "version": "2026.10",
      "status": "accepted",
      "accepted_at": "2026-10-15T14:03:22Z",
      "channel": "onboarding"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

POST /v1/customers/{id}/close#

Request account closure

Requests closure of the customer's Digital Account. The account moves to closing; the remaining balance is paid to the customer's linked account, or held where a legal or compliance hold applies. account.closed follows.

  • Requires an access token
  • Requires an Idempotency-Key header

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.

Request body

FieldTypeRequiredDescription
reasonstring, one of customer_request, tenant_requestYesWho requested the closure.
Example: customer_request
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/customers/{id}/close" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"customer_request"}'

Response

202 Accepted, with a Customer object.

Example response
{
  "id": "cus_c9T2kXq4Lm",
  "object": "customer",
  "type": "individual",
  "external_ref": "member-10482",
  "email": "member@example.com",
  "mobile_number_last4": "4821",
  "business": null,
  "verification": {
    "status": "approved",
    "updated_at": "2026-10-15T14:04:10Z",
    "retry_available_at": null
  },
  "account_id": "acct_c3J8vN2Qe6",
  "pin_locked": false,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:04:10Z",
  "version": 7
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
404not_found
409invalid_state
429rate_limited
500internal_error

Hosted sessions#

POST /v1/sessions#

Create a hosted session

Creates a single-use session for a hosted flow. Use it to start pin_reset, contact_change or terms_acceptance, or to replace an onboarding or payment_confirm session that expired before the customer finished.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
flowstring, one of onboarding, payment_confirm, pin_reset, contact_change, terms_acceptanceYesHosted flow.
Example: pin_reset
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
targetTarget or nullNoRecord to confirm. Required for payment_confirm.
return_urlstring or nullNoRegistered return address, for mobile browsers.
Example: https://app.example.com/a2a/return
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/sessions" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"flow":"pin_reset","customer_id":"cus_c9T2kXq4Lm"}'

Response

201 Created, with a Session object.

Example response
{
  "id": "ses_6Yt2Rw9Qe4",
  "object": "session",
  "flow": "pin_reset",
  "customer_id": "cus_c9T2kXq4Lm",
  "target": null,
  "status": "created",
  "token": "st_sbx_5e1a9c3f7b2d8a4c",
  "return_url": "https://app.example.com/a2a/return",
  "expires_at": "2026-10-15T14:18:22Z",
  "created_at": "2026-10-15T14:03:22Z"
}

Errors

StatusError codes
400idempotency_key_missing, parameter_missing
401authentication_required
409invalid_state
422account_restricted, session_invalid
429rate_limited
500internal_error

POST /v1/sessions/exchange#

Exchange a result token

Exchanges the result token returned by the SDK for the outcome of the flow. Call it from the Tenant's server. A result token can be exchanged once. The webhook for the underlying record remains the source of truth.

  • Requires an access token

Request body

FieldTypeRequiredDescription
result_tokenstringYesResult token from the SDK.
Example: rt_sbx_7d2e9f1a3c5b
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/sessions/exchange" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"result_token":"rt_sbx_7d2e9f1a3c5b"}'

Response

200 OK, with a SessionOutcome object.

Example response
{
  "object": "session_outcome",
  "session_id": "ses_8Qw3Ez5Rt2",
  "flow": "payment_confirm",
  "status": "completed",
  "customer_id": "cus_c9T2kXq4Lm",
  "verification_status": null,
  "target": {
    "type": "payment",
    "id": "pay_3As6Df9Gh2"
  },
  "target_status": "completed",
  "terms_decision": null
}

Errors

StatusError codes
400parameter_missing
401authentication_required
422result_token_invalid
429rate_limited
500internal_error

Bank linking#

POST /v1/customers/{id}/linked-accounts#

Submit a Plaid public token

Submits the public token returned by Plaid. A2A InstaPay retrieves the account, runs the ownership, account type, RTP and Request for Payment checks, and returns the linked account with status pending. linked_account.verified or linked_account.failed follows.

  • Requires an access token
  • Requires an Idempotency-Key header

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.

Request body

FieldTypeRequiredDescription
public_tokenstringYesPublic token from Plaid.
Example: public-sandbox-5a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d
plaid_account_idstring or nullNoAccount selected in Plaid, where the customer had several.
Example: vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/customers/{id}/linked-accounts" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"public_token":"public-sandbox-5a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d","plaid_account_id":"vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D"}'

Response

201 Created, with a LinkedAccount object.

Example response
{
  "id": "la_5Gh2Xw8Pq1",
  "object": "linked_account",
  "customer_id": "cus_c9T2kXq4Lm",
  "status": "pending",
  "institution_name": "First Community Bank",
  "account_type": "checking",
  "account_mask": "6623",
  "capabilities": {
    "withdrawal": false,
    "load": false,
    "pay_by_bank": false
  },
  "withdrawal_hold_until": null,
  "failure_code": null,
  "created_at": "2026-10-15T14:05:41Z",
  "updated_at": "2026-10-15T14:05:41Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
404not_found
409linked_account_exists
422customer_not_verified, link_token_mismatch
429rate_limited
500internal_error

GET /v1/customers/{id}/linked-accounts#

List linked accounts

Returns the customer's linked accounts, including removed ones, newest first.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/customers/{id}/linked-accounts" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a LinkedAccountList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "la_5Gh2Xw8Pq1",
      "object": "linked_account",
      "customer_id": "cus_c9T2kXq4Lm",
      "status": "verified",
      "institution_name": "First Community Bank",
      "account_type": "checking",
      "account_mask": "6623",
      "capabilities": {
        "withdrawal": true,
        "load": true,
        "pay_by_bank": true
      },
      "withdrawal_hold_until": "2026-10-16T14:05:41Z",
      "failure_code": null,
      "created_at": "2026-10-15T14:05:41Z",
      "updated_at": "2026-10-15T14:05:41Z",
      "version": 2
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

DELETE /v1/customers/{id}/linked-accounts/{linked_account_id}#

Remove a linked account

Removes the linked account. Pending withdrawals to it are not affected. linked_account.removed follows.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesCustomer identifier.
linked_account_idpathYesLinked account identifier.
Example request
curl -X DELETE "https://sandbox.a2ainstapay.com/v1/customers/{id}/linked-accounts/{linked_account_id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a LinkedAccount object.

Example response
{
  "id": "la_5Gh2Xw8Pq1",
  "object": "linked_account",
  "customer_id": "cus_c9T2kXq4Lm",
  "status": "removed",
  "institution_name": "First Community Bank",
  "account_type": "checking",
  "account_mask": "6623",
  "capabilities": {
    "withdrawal": false,
    "load": false,
    "pay_by_bank": false
  },
  "withdrawal_hold_until": null,
  "failure_code": null,
  "created_at": "2026-10-15T14:05:41Z",
  "updated_at": "2026-10-15T14:05:41Z",
  "version": 3
}

Errors

StatusError codes
401authentication_required
404not_found
409invalid_state
429rate_limited
500internal_error

Accounts#

GET /v1/accounts#

Find a customer's Digital Account

Returns a list containing the customer's Digital Account.

  • Requires an access token

Parameters

NameInRequiredDescription
customer_idqueryYesCustomer identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/accounts" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a AccountList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "acct_c3J8vN2Qe6",
      "object": "account",
      "customer_id": "cus_c9T2kXq4Lm",
      "type": "consumer",
      "status": "active",
      "currency": "USD",
      "opened_at": "2026-10-15T14:04:10Z",
      "closed_at": null,
      "updated_at": "2026-10-15T14:04:10Z",
      "version": 1
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
400parameter_missing
401authentication_required
429rate_limited
500internal_error

GET /v1/accounts/{id}/balance#

Retrieve a balance

Returns the ledger, available, earmarked and pending outgoing amounts.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesDigital Account identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/accounts/{id}/balance" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Balance object.

Example response
{
  "object": "balance",
  "account_id": "acct_c3J8vN2Qe6",
  "currency": "USD",
  "ledger": 15000,
  "available": 12000,
  "earmarked": 2000,
  "pending_outgoing": 1000,
  "as_of": "2026-10-15T14:05:41Z"
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

GET /v1/accounts/{id}/transactions#

List transactions

Returns the account's transactions, newest first.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesDigital Account identifier.
fromqueryNoEarliest creation time.
toqueryNoLatest creation time.
typequeryNoTransaction type filter.
limitqueryNoPage size, 1 to 100, default 25.
cursorqueryNonext_cursor from the previous page.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/accounts/{id}/transactions" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a TransactionList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "txn_2Qa5Ws8Ed1",
      "object": "transaction",
      "account_id": "acct_c3J8vN2Qe6",
      "type": "payment_sent",
      "direction": "debit",
      "amount": 2500,
      "fee_amount": 0,
      "net_amount": 2500,
      "currency": "USD",
      "status": "posted",
      "counterparty": {
        "type": "merchant",
        "customer_id": "cus_m7R5pWz1Hd",
        "display_name": "Riverside Coffee"
      },
      "source_type": "payment",
      "source_id": "pay_3As6Df9Gh2",
      "description": "Order 55120",
      "created_at": "2026-10-15T14:04:10Z",
      "posted_at": "2026-10-15T14:04:10Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
400parameter_invalid
401authentication_required
404not_found
429rate_limited
500internal_error

GET /v1/accounts/{id}/statements#

List statements

Returns the account's periodic statements, newest first.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesDigital Account identifier.
limitqueryNoPage size, 1 to 100, default 25.
cursorqueryNonext_cursor from the previous page.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/accounts/{id}/statements" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a StatementList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "stmt_7Rf4Tg1Yh6",
      "object": "statement",
      "account_id": "acct_c3J8vN2Qe6",
      "period_start": "2026-09-01",
      "period_end": "2026-09-30",
      "opening_balance": 0,
      "closing_balance": 15000,
      "currency": "USD",
      "download_url": "https://files.example-a2a.test/statements/stmt_7Rf4Tg1Yh6.pdf?sig=redacted",
      "download_url_expires_at": "2026-10-15T14:20:22Z",
      "available_at": "2026-10-01T09:00:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

Loads#

POST /v1/loads#

Create a load

Creates a load into the customer's Digital Account by Request for Payment to the customer's linked account. The load is returned with status requires_confirmation and a payment_confirm session. Open the session with the SDK; the customer confirms with the PIN or a passkey. A load that is not confirmed before the session expires fails with failure_code confirmation_expired.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
amountintegerYesAmount in cents.
Example: 10000
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/loads" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":"cus_c9T2kXq4Lm","amount":10000}'

Response

201 Created, with a Load object.

Example response
{
  "id": "load_7Ty4Ui2Op9",
  "object": "load",
  "customer_id": "cus_c9T2kXq4Lm",
  "account_id": "acct_c3J8vN2Qe6",
  "linked_account_id": "la_5Gh2Xw8Pq1",
  "amount": 10000,
  "currency": "USD",
  "status": "requires_confirmation",
  "failure_code": null,
  "confirmation_session": {
    "id": "ses_3Lm8Nb2Vc6",
    "flow": "payment_confirm",
    "token": "st_sbx_2f9c7a1e5b8d4c3a",
    "expires_at": "2026-10-15T14:08:22Z"
  },
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "settled_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
403flow_not_enabled
422account_restricted, capability_unavailable, customer_not_verified, limit_exceeded, linked_account_required
429rate_limited
500internal_error

GET /v1/loads/{id}#

Retrieve a load

Returns the load.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesLoad identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/loads/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Load object.

Example response
{
  "id": "load_7Ty4Ui2Op9",
  "object": "load",
  "customer_id": "cus_c9T2kXq4Lm",
  "account_id": "acct_c3J8vN2Qe6",
  "linked_account_id": "la_5Gh2Xw8Pq1",
  "amount": 10000,
  "currency": "USD",
  "status": "requires_confirmation",
  "failure_code": null,
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "settled_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

Payment requests#

POST /v1/payment-requests#

Create a payment request

Creates a dynamic request with an amount, paid once, or a static request for a collection point, on which the payer enters the amount. Encode qr_payload in a QR code or in the Tenant's Link-to-Pay link.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
typestring, one of dynamic, staticYesRequest type.
Example: dynamic
merchant_customer_idstringYesMerchant to be paid.
Example: cus_m7R5pWz1Hd
amountinteger or nullNoAmount in cents. Required for dynamic requests.
Example: 2500
order_referencestring or nullNoThe Tenant's order reference.
Example: ORD-55120
collection_pointCollectionPoint or nullNoRequired for static requests.
expires_ininteger or nullNoValidity of a dynamic request in seconds, up to 604800 (seven days). Defaults to the Tenant configuration.
Example: 900
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/payment-requests" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"type":"dynamic","merchant_customer_id":"cus_m7R5pWz1Hd","amount":2500,"order_reference":"ORD-55120","expires_in":900}'

Response

201 Created, with a PaymentRequest object.

Example response
{
  "id": "pr_1Zx4Cv7Bn5",
  "object": "payment_request",
  "type": "dynamic",
  "merchant_customer_id": "cus_m7R5pWz1Hd",
  "amount": 2500,
  "currency": "USD",
  "order_reference": "ORD-55120",
  "collection_point": null,
  "status": "open",
  "qr_payload": "A2AQR1.pr_1Zx4Cv7Bn5.MEUCIQDf3k9sample",
  "expires_at": "2026-10-15T14:18:22Z",
  "paid_payment_id": null,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing, parameter_missing
401authentication_required
403flow_not_enabled
422payee_not_eligible
429rate_limited
500internal_error

GET /v1/payment-requests/{id}#

Retrieve a payment request

Returns the payment request.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesPayment request identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/payment-requests/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a PaymentRequest object.

Example response
{
  "id": "pr_1Zx4Cv7Bn5",
  "object": "payment_request",
  "type": "dynamic",
  "merchant_customer_id": "cus_m7R5pWz1Hd",
  "amount": 2500,
  "currency": "USD",
  "order_reference": "ORD-55120",
  "collection_point": null,
  "status": "open",
  "qr_payload": "A2AQR1.pr_1Zx4Cv7Bn5.MEUCIQDf3k9sample",
  "expires_at": "2026-10-22T14:03:22Z",
  "paid_payment_id": null,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

POST /v1/payment-requests/{id}/cancel#

Cancel a payment request

Cancels an open payment request. payment_request.canceled follows.

  • Requires an access token
  • Requires an Idempotency-Key header

Parameters

NameInRequiredDescription
idpathYesPayment request identifier.
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/payment-requests/{id}/cancel" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Response

200 OK, with a PaymentRequest object.

Example response
{
  "id": "pr_1Zx4Cv7Bn5",
  "object": "payment_request",
  "type": "dynamic",
  "merchant_customer_id": "cus_m7R5pWz1Hd",
  "amount": 2500,
  "currency": "USD",
  "order_reference": "ORD-55120",
  "collection_point": null,
  "status": "canceled",
  "qr_payload": "A2AQR1.pr_1Zx4Cv7Bn5.MEUCIQDf3k9sample",
  "expires_at": "2026-10-22T14:03:22Z",
  "paid_payment_id": null,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 2
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
404not_found
409invalid_state
429rate_limited
500internal_error

Payments#

POST /v1/payments#

Create a payment

Creates a consumer-to-merchant payment from balance or by bank, or a merchant-to-merchant payment from balance. Give either payee_customer_id or qr_payload. The payment is returned with status requires_confirmation and a payment_confirm session for the payer. A payment that is not confirmed before the session expires is canceled.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
payer_customer_idstringYesPayer.
Example: cus_c9T2kXq4Lm
payee_customer_idstring or nullNoMerchant to pay. Required unless qr_payload is given.
Example: cus_m7R5pWz1Hd
qr_payloadstring or nullNoPayload from a QR code or Link-to-Pay link.
amountinteger or nullNoAmount in cents. Required unless a dynamic qr_payload sets it; may be lower than a requested amount but never higher.
Example: 2500
sourcestring, one of balance, bank_accountYesSource of funds. bank_account is pay by bank.
Example: balance
order_referencestring or nullNoThe Tenant's order reference.
Example: ORD-55120
invoice_referencestring or nullNoRequired for merchant-to-merchant payments.
descriptionstring or nullNoDescription shown to both parties, up to 140 characters.
Example: Order 55120
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/payments" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"payer_customer_id":"cus_c9T2kXq4Lm","payee_customer_id":"cus_m7R5pWz1Hd","amount":2500,"source":"balance","order_reference":"ORD-55120","description":"Order 55120"}'

Response

201 Created, with a Payment object.

Example response
{
  "id": "pay_3As6Df9Gh2",
  "object": "payment",
  "type": "consumer_to_merchant",
  "source": "balance",
  "payer_customer_id": "cus_c9T2kXq4Lm",
  "payee_customer_id": "cus_m7R5pWz1Hd",
  "payment_request_id": "pr_1Zx4Cv7Bn5",
  "amount": 2500,
  "currency": "USD",
  "fees": [
    {
      "type": "platform",
      "amount": 50,
      "paid_by": "payee"
    }
  ],
  "net_amount": 2450,
  "refunded_amount": 0,
  "status": "requires_confirmation",
  "failure_code": null,
  "order_reference": "ORD-55120",
  "invoice_reference": null,
  "description": "Order 55120",
  "confirmation_session": {
    "id": "ses_8Qw3Ez5Rt2",
    "flow": "payment_confirm",
    "token": "st_sbx_2f9c7a1e5b8d4c3a",
    "expires_at": "2026-10-15T14:08:22Z"
  },
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "completed_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing, parameter_missing
401authentication_required
403flow_not_enabled
422account_restricted, amount_mismatch, capability_unavailable, customer_not_verified, insufficient_funds, limit_exceeded, payee_not_eligible, payment_request_expired, payment_request_invalid, payment_request_paid
429rate_limited
500internal_error

GET /v1/payments/{id}#

Retrieve a payment

Returns the payment.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesPayment identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/payments/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Payment object.

Example response
{
  "id": "pay_3As6Df9Gh2",
  "object": "payment",
  "type": "consumer_to_merchant",
  "source": "balance",
  "payer_customer_id": "cus_c9T2kXq4Lm",
  "payee_customer_id": "cus_m7R5pWz1Hd",
  "payment_request_id": "pr_1Zx4Cv7Bn5",
  "amount": 2500,
  "currency": "USD",
  "fees": [
    {
      "type": "platform",
      "amount": 50,
      "paid_by": "payee"
    }
  ],
  "net_amount": 2450,
  "refunded_amount": 0,
  "status": "requires_confirmation",
  "failure_code": null,
  "order_reference": "ORD-55120",
  "invoice_reference": null,
  "description": "Order 55120",
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "completed_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

POST /v1/payments/{id}/cancel#

Cancel a payment

Cancels a payment that has not been confirmed. payment.canceled follows.

  • Requires an access token
  • Requires an Idempotency-Key header

Parameters

NameInRequiredDescription
idpathYesPayment identifier.
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/payments/{id}/cancel" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Response

200 OK, with a Payment object.

Example response
{
  "id": "pay_3As6Df9Gh2",
  "object": "payment",
  "type": "consumer_to_merchant",
  "source": "balance",
  "payer_customer_id": "cus_c9T2kXq4Lm",
  "payee_customer_id": "cus_m7R5pWz1Hd",
  "payment_request_id": "pr_1Zx4Cv7Bn5",
  "amount": 2500,
  "currency": "USD",
  "fees": [
    {
      "type": "platform",
      "amount": 50,
      "paid_by": "payee"
    }
  ],
  "net_amount": 2450,
  "refunded_amount": 0,
  "status": "canceled",
  "failure_code": null,
  "order_reference": "ORD-55120",
  "invoice_reference": null,
  "description": "Order 55120",
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "completed_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 2
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
404not_found
409invalid_state
429rate_limited
500internal_error

Withdrawals#

POST /v1/withdrawals#

Create a withdrawal

Creates a withdrawal to the customer's own verified linked account. The withdrawal is returned with status requires_confirmation and a payment_confirm session. A withdrawal that is not confirmed before the session expires fails with failure_code confirmation_expired.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
customer_idstringYesCustomer identifier.
Example: cus_m7R5pWz1Hd
amountintegerYesAmount in cents.
Example: 50000
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/withdrawals" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":"cus_m7R5pWz1Hd","amount":50000}'

Response

201 Created, with a Withdrawal object.

Example response
{
  "id": "wd_6Mn3Bv8Cx1",
  "object": "withdrawal",
  "customer_id": "cus_m7R5pWz1Hd",
  "account_id": "acct_m4K1sB7Yt9",
  "linked_account_id": "la_9Kj3Hg6Fd2",
  "amount": 50000,
  "currency": "USD",
  "status": "requires_confirmation",
  "failure_code": null,
  "confirmation_session": {
    "id": "ses_9Wq4Er7Ty1",
    "flow": "payment_confirm",
    "token": "st_sbx_2f9c7a1e5b8d4c3a",
    "expires_at": "2026-10-15T14:08:22Z"
  },
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "settled_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
422account_restricted, customer_not_verified, insufficient_funds, limit_exceeded, linked_account_required, withdrawal_hold
429rate_limited
500internal_error

GET /v1/withdrawals/{id}#

Retrieve a withdrawal

Returns the withdrawal.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesWithdrawal identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/withdrawals/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Withdrawal object.

Example response
{
  "id": "wd_6Mn3Bv8Cx1",
  "object": "withdrawal",
  "customer_id": "cus_m7R5pWz1Hd",
  "account_id": "acct_m4K1sB7Yt9",
  "linked_account_id": "la_9Kj3Hg6Fd2",
  "amount": 50000,
  "currency": "USD",
  "status": "requires_confirmation",
  "failure_code": null,
  "created_at": "2026-10-15T14:03:22Z",
  "confirmed_at": null,
  "settled_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

Refunds#

POST /v1/refund-requests#

Request a refund

Requests a refund of a completed payment to the original payer. The refund is returned with status requested and a payment_confirm session for the merchant's authorized user. A refund that is not confirmed before the session expires fails with failure_code confirmation_expired.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
payment_idstringYesPayment to refund.
Example: pay_3As6Df9Gh2
amountintegerYesRefund amount in cents.
Example: 1000
reasonstring, one of requested_by_customer, duplicate, goods_not_received, otherYesReason.
Example: requested_by_customer
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/refund-requests" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"payment_id":"pay_3As6Df9Gh2","amount":1000,"reason":"requested_by_customer"}'

Response

201 Created, with a Refund object.

Example response
{
  "id": "rf_4Lk7Jh2Gf9",
  "object": "refund",
  "payment_id": "pay_3As6Df9Gh2",
  "merchant_customer_id": "cus_m7R5pWz1Hd",
  "payer_customer_id": "cus_c9T2kXq4Lm",
  "amount": 1000,
  "currency": "USD",
  "reason": "requested_by_customer",
  "destination": "balance",
  "status": "requested",
  "failure_code": null,
  "confirmation_session": {
    "id": "ses_2Zx8Cv5Bn3",
    "flow": "payment_confirm",
    "token": "st_sbx_2f9c7a1e5b8d4c3a",
    "expires_at": "2026-10-15T14:08:22Z"
  },
  "created_at": "2026-10-15T14:03:22Z",
  "completed_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing
401authentication_required
404not_found
409invalid_state
422account_restricted, refund_exceeds_payment, refund_window_closed
429rate_limited
500internal_error

GET /v1/refund-requests/{id}#

Retrieve a refund

Returns the refund.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesRefund identifier.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/refund-requests/{id}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a Refund object.

Example response
{
  "id": "rf_4Lk7Jh2Gf9",
  "object": "refund",
  "payment_id": "pay_3As6Df9Gh2",
  "merchant_customer_id": "cus_m7R5pWz1Hd",
  "payer_customer_id": "cus_c9T2kXq4Lm",
  "amount": 1000,
  "currency": "USD",
  "reason": "requested_by_customer",
  "destination": "balance",
  "status": "requested",
  "failure_code": null,
  "created_at": "2026-10-15T14:03:22Z",
  "completed_at": null,
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

Disputes#

POST /v1/disputes#

Forward a customer notice

Forwards a customer's notice of an error, an unauthorized transfer or a purchase dispute. Forward every notice within one business day of receiving it, with the time the customer gave it.

  • Requires an access token
  • Requires an Idempotency-Key header

Request body

FieldTypeRequiredDescription
customer_idstringYesCustomer who gave notice.
Example: cus_c9T2kXq4Lm
typestring, one of error, unauthorized_transfer, purchase_disputeYesType of notice.
Example: unauthorized_transfer
payment_idstring or nullNoPayment concerned.
Example: pay_3As6Df9Gh2
transaction_idstring or nullNoTransaction concerned, where there is no payment.
descriptionstringYesThe customer's description, as given, up to 2,000 characters.
Example: I did not make this payment.
notice_received_atstring (date-time)YesWhen the customer gave notice to the Tenant.
Example: 2026-10-15T13:40:00Z
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/disputes" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":"cus_c9T2kXq4Lm","type":"unauthorized_transfer","payment_id":"pay_3As6Df9Gh2","description":"I did not make this payment.","notice_received_at":"2026-10-15T13:40:00Z"}'

Response

201 Created, with a Dispute object.

Example response
{
  "id": "dsp_9Po2Iu5Yt3",
  "object": "dispute",
  "customer_id": "cus_c9T2kXq4Lm",
  "type": "unauthorized_transfer",
  "payment_id": "pay_3As6Df9Gh2",
  "transaction_id": null,
  "description": "I did not make this payment.",
  "regulation_e": true,
  "notice_received_at": "2026-10-15T13:40:00Z",
  "status": "received",
  "provisional_credit_amount": null,
  "outcome": null,
  "resolved_at": null,
  "created_at": "2026-10-15T14:03:22Z",
  "updated_at": "2026-10-15T14:03:22Z",
  "version": 1
}

Errors

StatusError codes
400idempotency_key_missing, parameter_missing
401authentication_required
404not_found
429rate_limited
500internal_error

GET /v1/disputes#

List disputes

Returns disputes, newest first.

  • Requires an access token

Parameters

NameInRequiredDescription
customer_idqueryNoFilter by customer.
statusqueryNoFilter by status.
limitqueryNoPage size, 1 to 100, default 25.
cursorqueryNonext_cursor from the previous page.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/disputes" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a DisputeList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "dsp_9Po2Iu5Yt3",
      "object": "dispute",
      "customer_id": "cus_c9T2kXq4Lm",
      "type": "unauthorized_transfer",
      "payment_id": "pay_3As6Df9Gh2",
      "transaction_id": null,
      "description": "I did not make this payment.",
      "regulation_e": true,
      "notice_received_at": "2026-10-15T13:40:00Z",
      "status": "received",
      "provisional_credit_amount": null,
      "outcome": null,
      "resolved_at": null,
      "created_at": "2026-10-15T14:03:22Z",
      "updated_at": "2026-10-15T14:03:22Z",
      "version": 1
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
400parameter_invalid
401authentication_required
429rate_limited
500internal_error

Webhook events#

GET /v1/webhook-events#

List webhook events

Returns events with their delivery status, newest first. Events are kept for 30 days.

  • Requires an access token

Parameters

NameInRequiredDescription
typequeryNoFilter by event type.
delivery_statusqueryNoFilter by delivery status.
fromqueryNoEarliest event time.
limitqueryNoPage size, 1 to 100, default 25.
cursorqueryNonext_cursor from the previous page.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/webhook-events" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a WebhookEventList object.

Example response
{
  "object": "list",
  "data": [
    {
      "id": "evt_18Uj8Ik2Ol4",
      "object": "event",
      "type": "payment.completed",
      "api_version": "v1",
      "environment": "sandbox",
      "created_at": "2026-10-15T14:04:10Z",
      "data": {
        "object": {
          "id": "pay_3As6Df9Gh2",
          "object": "payment",
          "type": "consumer_to_merchant",
          "source": "balance",
          "payer_customer_id": "cus_c9T2kXq4Lm",
          "payee_customer_id": "cus_m7R5pWz1Hd",
          "payment_request_id": "pr_1Zx4Cv7Bn5",
          "amount": 2500,
          "currency": "USD",
          "fees": [
            {
              "type": "platform",
              "amount": 50,
              "paid_by": "payee"
            }
          ],
          "net_amount": 2450,
          "refunded_amount": 0,
          "status": "completed",
          "failure_code": null,
          "order_reference": "ORD-55120",
          "invoice_reference": null,
          "description": "Order 55120",
          "created_at": "2026-10-15T14:03:22Z",
          "confirmed_at": "2026-10-15T14:04:10Z",
          "completed_at": "2026-10-15T14:04:10Z",
          "updated_at": "2026-10-15T14:04:10Z",
          "version": 2
        },
        "previous_attributes": {
          "status": "requires_confirmation"
        }
      },
      "delivery": {
        "status": "delivered",
        "attempts": 1,
        "last_attempt_at": "2026-10-15T14:04:10Z",
        "last_response_status": 200,
        "next_attempt_at": null
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

StatusError codes
400parameter_invalid
401authentication_required
429rate_limited
500internal_error

POST /v1/webhook-events/{id}/resend#

Resend a webhook event

Queues the event for delivery again with a fresh signature timestamp. The event identifier is unchanged.

  • Requires an access token

Parameters

NameInRequiredDescription
idpathYesEvent identifier.
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/webhook-events/{id}/resend" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Response

202 Accepted, with a WebhookEvent object.

Example response
{
  "id": "evt_18Uj8Ik2Ol4",
  "object": "event",
  "type": "payment.completed",
  "api_version": "v1",
  "environment": "sandbox",
  "created_at": "2026-10-15T14:04:10Z",
  "data": {
    "object": {
      "id": "pay_3As6Df9Gh2",
      "object": "payment",
      "type": "consumer_to_merchant",
      "source": "balance",
      "payer_customer_id": "cus_c9T2kXq4Lm",
      "payee_customer_id": "cus_m7R5pWz1Hd",
      "payment_request_id": "pr_1Zx4Cv7Bn5",
      "amount": 2500,
      "currency": "USD",
      "fees": [
        {
          "type": "platform",
          "amount": 50,
          "paid_by": "payee"
        }
      ],
      "net_amount": 2450,
      "refunded_amount": 0,
      "status": "completed",
      "failure_code": null,
      "order_reference": "ORD-55120",
      "invoice_reference": null,
      "description": "Order 55120",
      "created_at": "2026-10-15T14:03:22Z",
      "confirmed_at": "2026-10-15T14:04:10Z",
      "completed_at": "2026-10-15T14:04:10Z",
      "updated_at": "2026-10-15T14:04:10Z",
      "version": 2
    },
    "previous_attributes": {
      "status": "requires_confirmation"
    }
  },
  "delivery": {
    "status": "pending",
    "attempts": 3,
    "last_attempt_at": "2026-10-15T14:05:41Z",
    "last_response_status": 500,
    "next_attempt_at": "2026-10-15T14:06:00Z"
  }
}

Errors

StatusError codes
401authentication_required
404not_found
429rate_limited
500internal_error

Reports#

GET /v1/reports/reconciliation#

Retrieve the daily reconciliation report

Returns the summary for a business date and a time-limited address of the posting-level file. Reports are available from 06:00 Eastern Time the next day.

  • Requires an access token

Parameters

NameInRequiredDescription
datequeryYesBusiness date (Eastern Time), YYYY-MM-DD.
Example request
curl -X GET "https://sandbox.a2ainstapay.com/v1/reports/reconciliation" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN"

Response

200 OK, with a ReconciliationReport object.

Example response
{
  "object": "reconciliation_report",
  "date": "2026-10-14",
  "account_structure": "dedicated_fbo",
  "currency": "USD",
  "opening_balance": 1250000,
  "closing_balance": 1301800,
  "totals": {
    "loads": 250000,
    "payments": 410000,
    "withdrawals": 180000,
    "refunds": 12000,
    "fees": 8200,
    "adjustments": 0
  },
  "fee_clearing_swept": 8200,
  "postings_count": 1342,
  "file": {
    "format": "csv",
    "download_url": "https://files.example-a2a.test/recon/2026-10-14.csv?sig=redacted",
    "expires_at": "2026-10-15T14:20:22Z"
  },
  "generated_at": "2026-10-15T06:00:00Z"
}

Errors

StatusError codes
400parameter_missing
401authentication_required
404not_found
429rate_limited
500internal_error

Sandbox#

POST /v1/sandbox/simulate/{event}#

Simulate an event (sandbox only)

Moves a sandbox record as if the bank, a provider or a reviewer had acted, and sends the resulting webhook.

  • Requires an access token
  • Sandbox only

Parameters

NameInRequiredDescription
eventpathYesEvent to simulate. See the list in section 11.

Request body

FieldTypeRequiredDescription
object_idstringYesRecord to act on.
Example: pay_3As6Df9Gh2
failure_codestring or nullNoFor failure events, the failure code to apply.
Example request
curl -X POST "https://sandbox.a2ainstapay.com/v1/sandbox/simulate/{event}" \
  -H "Authorization: Bearer $A2A_ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"object_id":"pay_3As6Df9Gh2"}'

Response

202 Accepted, with a SimulationResult object.

Example response
{
  "object": "simulation",
  "event": "payment.completed",
  "object_id": "pay_3As6Df9Gh2",
  "status": "accepted"
}

Errors

StatusError codes
401authentication_required
403sandbox_only
404not_found
409invalid_state
429rate_limited
500internal_error

Objects#

Error#

FieldTypeRequiredDescription
codestringYesStable error code from the error catalog. Code against this value.
Example: limit_exceeded
messagestringYesReadable description for logs and support. Do not show it to customers or parse it.
Example: The payment exceeds the daily amount limit for this customer.
paramstring or nullNoThe request field the error relates to, where there is one.
Example: amount
request_idstringYesIdentifier of the request, also returned in the A2A-Request-Id header. Quote it to support.
Example: req_4Hk8Lm2Np6
detailsobject or nullNoAdditional structured information for some errors, described in the catalog.

Token#

FieldTypeRequiredDescription
access_tokenstringYesBearer token for the Authorization header.
Example: at_sbx_6c1f0e9b2a7d4e8f9a0b1c2d3e4f5a6b
token_typestring, one of BearerYesAlways Bearer.
Example: Bearer
expires_inintegerYesLifetime of the token in seconds.
Example: 900
scopestringYesScope granted to the client.
Example: tenant

ConfirmationSession#

FieldTypeRequiredDescription
idstringYesSession identifier.
Example: ses_8Qw3Ez5Rt2
flowstring, one of onboarding, payment_confirm, pin_reset, contact_change, terms_acceptanceYesHosted flow the session opens.
Example: payment_confirm
tokenstringNoSingle-use session token to pass to the SDK. Treat it as a secret and do not log it.
Example: st_sbx_2f9c7a1e5b8d4c3a
expires_atstring (date-time)YesTime after which the token can no longer be opened.
Example: 2026-10-15T14:08:22Z

Target#

FieldTypeRequiredDescription
typestring, one of payment, load, withdrawal, refundYesType of record the customer confirms.
Example: payment
idstringYesIdentifier of that record.
Example: pay_3As6Df9Gh2

Session#

FieldTypeRequiredDescription
idstringYesSession identifier.
Example: ses_8Qw3Ez5Rt2
objectstring, one of sessionYesObject type.
Example: session
flowstring, one of onboarding, payment_confirm, pin_reset, contact_change, terms_acceptanceYesHosted flow.
Example: payment_confirm
customer_idstringYesCustomer the session is bound to.
Example: cus_c9T2kXq4Lm
targetTarget or nullNoRecord to confirm. Present for payment_confirm only.
statusstring, one of created, completed, canceled, expiredYesSession status.
Example: created
tokenstring or nullNoSingle-use session token. Returned only when the session is created.
Example: st_sbx_2f9c7a1e5b8d4c3a
return_urlstring or nullNoRegistered return address used for redirects on mobile browsers.
Example: https://app.example.com/a2a/return
expires_atstring (date-time)YesExpiry of the session token.
Example: 2026-10-15T14:08:22Z
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z

SessionOutcome#

FieldTypeRequiredDescription
objectstring, one of session_outcomeYesObject type.
Example: session_outcome
session_idstringYesSession identifier.
Example: ses_8Qw3Ez5Rt2
flowstring, one of onboarding, payment_confirm, pin_reset, contact_change, terms_acceptanceYesHosted flow.
Example: payment_confirm
statusstring, one of completed, canceled, expiredYesHow the customer left the flow.
Example: completed
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
verification_statusstring or nullNoFor onboarding: the customer's verification status when the flow ended.
targetTarget or nullNoFor payment_confirm: the confirmed record.
target_statusstring or nullNoFor payment_confirm: status of the confirmed record after confirmation, for example processing or completed.
Example: completed
terms_decisionstring or nullNoFor terms_acceptance: the customer's decision.

Verification#

FieldTypeRequiredDescription
statusstring, one of created, pending, in_review, approved, rejectedYesVerification status. See the Tenant Integration Specification, section 9.
Example: approved
updated_atstring (date-time)YesTime of the last status change.
Example: 2026-10-15T14:04:10Z
retry_available_atstring or nullNoFor rejected customers: when a new application may be started.

BusinessProfile#

FieldTypeRequiredDescription
legal_namestring or nullNoVerified legal name. Present once captured on the hosted screen.
Example: Riverside Coffee Co LLC
trading_namestring or nullNoTrading name shown to payers.
Example: Riverside Coffee
industrystring or nullNoIndustry from the program's industry list.
Example: Coffee shops and cafes
owners_statusstring, one of not_started, pending, completeYesProgress of owner and control person verification.
Example: complete

Customer#

FieldTypeRequiredDescription
idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
objectstring, one of customerYesObject type.
Example: customer
typestring, one of individual, businessYesConsumer (individual) or merchant (business).
Example: individual
external_refstringYesThe Tenant's own reference for the customer, unique within the Tenant.
Example: member-10482
emailstringYesE-mail address supplied by the Tenant, or as changed on the contact_change screen.
Example: member@example.com
mobile_number_last4stringYesLast four digits of the verified mobile number.
Example: 4821
businessBusinessProfile or nullNoBusiness details. Present for business customers only.
verificationVerificationYesVerification status.
account_idstring or nullNoDigital Account identifier. Present once the customer is approved.
Example: acct_c3J8vN2Qe6
pin_lockedbooleanYesTrue while the PIN is locked after failed attempts.
Example: false
onboarding_sessionConfirmationSession or nullNoOnboarding session. Returned only when the customer is created.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:04:10Z
versionintegerYesIncreases by one on every change. Use it to discard out-of-date webhook events.
Example: 3

Owner#

FieldTypeRequiredDescription
idstringYesOwner identifier.
Example: own_2Lp9Vc4Mz7
objectstring, one of ownerYesObject type.
Example: owner
customer_idstringYesBusiness customer the person belongs to.
Example: cus_m7R5pWz1Hd
namestringYesName of the person as entered by the merchant.
Example: Jordan Ellis
rolestring, one of owner, control_person, owner_and_control_personYesRole in the business.
Example: owner_and_control_person
ownership_percentinteger or nullNoOwnership percentage, for owners.
Example: 60
verification_statusstring, one of invited, pending, in_review, approved, rejectedYesVerification status of the person.
Example: approved
invited_atstring or nullNoWhen a verification link was sent to the person.
Example: 2026-10-15T14:03:22Z
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:04:10Z

DocumentAcceptance#

FieldTypeRequiredDescription
idstringYesAcceptance record identifier.
Example: dacc_3Nb6Vc9Xz2
objectstring, one of document_acceptanceYesObject type.
Example: document_acceptance
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
document_typestring, one of digital_account_terms, esign_consent, privacy_notice, cip_notice, merchant_services_agreement, acceptable_use_policyYesCustomer document.
Example: digital_account_terms
versionstringYesDocument version accepted.
Example: 2026.10
statusstring, one of accepted, superseded, pending_acceptanceYesStatus of the acceptance. pending_acceptance means a new version awaits acceptance on the terms_acceptance screen.
Example: accepted
accepted_atstring or nullNoTime of acceptance.
Example: 2026-10-15T14:03:22Z
channelstring or nullNoHosted flow in which the document was accepted.
Example: onboarding

LinkToken#

FieldTypeRequiredDescription
objectstring, one of link_tokenYesObject type.
Example: link_token
link_tokenstringYesPlaid link token to open Plaid in the Tenant's application.
Example: link-sandbox-7c1f2e3d-4b5a-6c7d-8e9f-0a1b2c3d4e5f
expirationstring (date-time)YesExpiry of the link token.
Example: 2026-10-15T18:03:22Z

Capabilities#

FieldTypeRequiredDescription
withdrawalbooleanYesThe bank can receive RTP credit transfers, so withdrawals are available.
Example: true
loadbooleanYesThe bank can receive a Request for Payment, so loads are available.
Example: true
pay_by_bankbooleanYesThe bank can receive a Request for Payment, so pay by bank is available.
Example: true

LinkedAccount#

FieldTypeRequiredDescription
idstringYesLinked account identifier.
Example: la_5Gh2Xw8Pq1
objectstring, one of linked_accountYesObject type.
Example: linked_account
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
statusstring, one of pending, held_for_review, verified, failed, removedYesStatus of the link.
Example: verified
institution_namestringYesName of the bank.
Example: First Community Bank
account_typestring, one of checking, savingsYesAccount type.
Example: checking
account_maskstringYesLast four digits of the account number.
Example: 6623
capabilitiesCapabilitiesYesWhat the account can be used for. All false until verified.
withdrawal_hold_untilstring or nullNoWithdrawals to a newly linked account are held until this time.
Example: 2026-10-16T14:05:41Z
failure_codestring or nullNoReason for a failed link.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:05:41Z
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:05:41Z
versionintegerYesIncreases by one on every change.
Example: 2

Account#

FieldTypeRequiredDescription
idstringYesDigital Account identifier.
Example: acct_c3J8vN2Qe6
objectstring, one of accountYesObject type.
Example: account
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
typestring, one of consumer, merchantYesAccount type.
Example: consumer
statusstring, one of active, suspended, dormant, closing, closedYesAccount status.
Example: active
currencystring, one of USDYesCurrency.
Example: USD
opened_atstring (date-time)YesOpening time.
Example: 2026-10-15T14:04:10Z
closed_atstring or nullNoClosing time.
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:04:10Z
versionintegerYesIncreases by one on every change.
Example: 1

Balance#

FieldTypeRequiredDescription
objectstring, one of balanceYesObject type.
Example: balance
account_idstringYesDigital Account identifier.
Example: acct_c3J8vN2Qe6
currencystring, one of USDYesCurrency.
Example: USD
ledgerintegerYesTotal balance in cents.
Example: 15000
availableintegerYesAmount that can be spent or withdrawn now: ledger less earmarked and pending outgoing amounts.
Example: 12000
earmarkedintegerYesAmount reserved for open refunds or disputes.
Example: 2000
pending_outgoingintegerYesAmount reserved for payments and withdrawals in progress.
Example: 1000
as_ofstring (date-time)YesTime of the balance.
Example: 2026-10-15T14:05:41Z

Counterparty#

FieldTypeRequiredDescription
typestring, one of consumer, merchant, bank_accountYesCounterparty type.
Example: merchant
customer_idstring or nullNoCounterparty customer identifier, for consumers and merchants of the same Tenant.
Example: cus_m7R5pWz1Hd
display_namestringYesName to show in the transaction history.
Example: Riverside Coffee

Transaction#

FieldTypeRequiredDescription
idstringYesTransaction identifier.
Example: txn_2Qa5Ws8Ed1
objectstring, one of transactionYesObject type.
Example: transaction
account_idstringYesDigital Account identifier.
Example: acct_c3J8vN2Qe6
typestring, one of load, payment_sent, payment_received, withdrawal, refund_sent, refund_received, dispute_credit, dispute_reversal, adjustmentYesTransaction type.
Example: payment_sent
directionstring, one of credit, debitYesEffect on the account.
Example: debit
amountintegerYesGross amount in cents.
Example: 2500
fee_amountintegerYesFees deducted from this account for the transaction, in cents.
Example: 0
net_amountintegerYesAmount credited or debited after fees, in cents.
Example: 2500
currencystring, one of USDYesCurrency.
Example: USD
statusstring, one of pending, posted, reversedYesPosting status.
Example: posted
counterpartyCounterparty or nullNoThe other party.
source_typestring, one of load, payment, withdrawal, refund, dispute, adjustmentYesRecord that created the transaction.
Example: payment
source_idstringYesIdentifier of that record.
Example: pay_3As6Df9Gh2
descriptionstring or nullNoDescription shown to the customer.
Example: Order 55120
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:04:10Z
posted_atstring or nullNoPosting time.
Example: 2026-10-15T14:04:10Z

Statement#

FieldTypeRequiredDescription
idstringYesStatement identifier.
Example: stmt_7Rf4Tg1Yh6
objectstring, one of statementYesObject type.
Example: statement
account_idstringYesDigital Account identifier.
Example: acct_c3J8vN2Qe6
period_startstring (date)YesFirst day of the period.
Example: 2026-09-01
period_endstring (date)YesLast day of the period.
Example: 2026-09-30
opening_balanceintegerYesOpening balance in cents.
Example: 0
closing_balanceintegerYesClosing balance in cents.
Example: 15000
currencystring, one of USDYesCurrency.
Example: USD
download_urlstringYesTime-limited address of the PDF statement. Request the statement again for a fresh address.
Example: https://files.example-a2a.test/statements/stmt_7Rf4Tg1Yh6.pdf?sig=redacted
download_url_expires_atstring (date-time)YesExpiry of the download address.
Example: 2026-10-15T14:20:22Z
available_atstring (date-time)YesWhen the statement became available.
Example: 2026-10-01T09:00:00Z

Load#

FieldTypeRequiredDescription
idstringYesLoad identifier.
Example: load_7Ty4Ui2Op9
objectstring, one of loadYesObject type.
Example: load
customer_idstringYesCustomer identifier.
Example: cus_c9T2kXq4Lm
account_idstringYesDigital Account credited.
Example: acct_c3J8vN2Qe6
linked_account_idstringYesBank account the Request for Payment is sent to.
Example: la_5Gh2Xw8Pq1
amountintegerYesAmount in cents.
Example: 10000
currencystring, one of USDYesCurrency.
Example: USD
statusstring, one of requires_confirmation, processing, settled, failedYesLoad status.
Example: requires_confirmation
failure_codestring or nullNoReason for a failed load.
confirmation_sessionConfirmationSession or nullNopayment_confirm session. Returned only when the load is created.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
confirmed_atstring or nullNoTime the customer confirmed.
settled_atstring or nullNoTime the funds were credited.
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

CollectionPoint#

FieldTypeRequiredDescription
referencestringYesThe Tenant's reference for the store, counter or machine.
Example: store-12-counter-2
namestringYesName shown to the payer on the confirmation screen.
Example: Riverside Coffee, Main St counter 2

PaymentRequest#

FieldTypeRequiredDescription
idstringYesPayment request identifier.
Example: pr_1Zx4Cv7Bn5
objectstring, one of payment_requestYesObject type.
Example: payment_request
typestring, one of dynamic, staticYesdynamic carries an amount and is paid once; static identifies a collection point and the payer enters the amount.
Example: dynamic
merchant_customer_idstringYesMerchant to be paid.
Example: cus_m7R5pWz1Hd
amountinteger or nullNoRequested amount in cents. Present for dynamic requests.
Example: 2500
currencystring, one of USDYesCurrency.
Example: USD
order_referencestring or nullNoThe Tenant's order reference.
Example: ORD-55120
collection_pointCollectionPoint or nullNoCollection point. Present for static requests.
statusstring, one of open, paid, expired, canceledYesRequest status. A static request stays open until canceled.
Example: open
qr_payloadstringYesPayload signed by A2A InstaPay, to encode in the QR code or in the Tenant's Link-to-Pay link.
Example: A2AQR1.pr_1Zx4Cv7Bn5.MEUCIQDf3k9sample
expires_atstring or nullNoExpiry of a dynamic request.
Example: 2026-10-22T14:03:22Z
paid_payment_idstring or nullNoPayment that paid a dynamic request.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

Fee#

FieldTypeRequiredDescription
typestring, one of platform, tenantYesFee type.
Example: platform
amountintegerYesFee in cents.
Example: 50
paid_bystring, one of payer, payeeYesParty whose amount the fee is taken from.
Example: payee

Payment#

FieldTypeRequiredDescription
idstringYesPayment identifier.
Example: pay_3As6Df9Gh2
objectstring, one of paymentYesObject type.
Example: payment
typestring, one of consumer_to_merchant, merchant_to_merchantYesPayment type.
Example: consumer_to_merchant
sourcestring, one of balance, bank_accountYesSource of funds.
Example: balance
payer_customer_idstringYesPayer.
Example: cus_c9T2kXq4Lm
payee_customer_idstringYesMerchant paid.
Example: cus_m7R5pWz1Hd
payment_request_idstring or nullNoPayment request paid, where the payment came from a QR code or link.
Example: pr_1Zx4Cv7Bn5
amountintegerYesAmount in cents.
Example: 2500
currencystring, one of USDYesCurrency.
Example: USD
feesarray of FeeYesFees on the payment.
net_amountintegerYesAmount credited to the merchant after fees, in cents.
Example: 2450
refunded_amountintegerYesTotal refunded so far, in cents.
Example: 0
statusstring, one of requires_confirmation, processing, completed, failed, canceled, refunded, partially_refundedYesPayment status.
Example: requires_confirmation
failure_codestring or nullNoReason for a failed payment.
order_referencestring or nullNoThe Tenant's order reference.
Example: ORD-55120
invoice_referencestring or nullNoInvoice reference. Required for merchant-to-merchant payments.
descriptionstring or nullNoDescription shown to both parties.
Example: Order 55120
confirmation_sessionConfirmationSession or nullNopayment_confirm session. Returned only when the payment is created.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
confirmed_atstring or nullNoTime the payer confirmed.
completed_atstring or nullNoTime the merchant was credited.
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

Withdrawal#

FieldTypeRequiredDescription
idstringYesWithdrawal identifier.
Example: wd_6Mn3Bv8Cx1
objectstring, one of withdrawalYesObject type.
Example: withdrawal
customer_idstringYesCustomer identifier.
Example: cus_m7R5pWz1Hd
account_idstringYesDigital Account debited.
Example: acct_m4K1sB7Yt9
linked_account_idstringYesBank account credited.
Example: la_9Kj3Hg6Fd2
amountintegerYesAmount in cents.
Example: 50000
currencystring, one of USDYesCurrency.
Example: USD
statusstring, one of requires_confirmation, processing, settled, failedYesWithdrawal status.
Example: requires_confirmation
failure_codestring or nullNoReason for a failed withdrawal. A failed withdrawal releases the reserved amount.
confirmation_sessionConfirmationSession or nullNopayment_confirm session. Returned only when the withdrawal is created.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
confirmed_atstring or nullNoTime the customer confirmed.
settled_atstring or nullNoTime the transfer was final.
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

Refund#

FieldTypeRequiredDescription
idstringYesRefund identifier.
Example: rf_4Lk7Jh2Gf9
objectstring, one of refundYesObject type.
Example: refund
payment_idstringYesPayment refunded.
Example: pay_3As6Df9Gh2
merchant_customer_idstringYesMerchant issuing the refund.
Example: cus_m7R5pWz1Hd
payer_customer_idstringYesConsumer refunded.
Example: cus_c9T2kXq4Lm
amountintegerYesRefund amount in cents.
Example: 1000
currencystring, one of USDYesCurrency.
Example: USD
reasonstring, one of requested_by_customer, duplicate, goods_not_received, otherYesReason given by the merchant.
Example: requested_by_customer
destinationstring, one of balance, bank_accountYesWhere the refund is sent: the consumer's Digital Account, or the consumer's linked account for pay by bank.
Example: balance
statusstring, one of requested, pending_funds, processing, completed, failedYesRefund status.
Example: requested
failure_codestring or nullNoReason for a failed refund.
confirmation_sessionConfirmationSession or nullNopayment_confirm session for the merchant. Returned only when the refund is requested.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
completed_atstring or nullNoTime the refund was applied.
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

Dispute#

FieldTypeRequiredDescription
idstringYesDispute identifier.
Example: dsp_9Po2Iu5Yt3
objectstring, one of disputeYesObject type.
Example: dispute
customer_idstringYesCustomer who gave notice.
Example: cus_c9T2kXq4Lm
typestring, one of error, unauthorized_transfer, purchase_disputeYesType of notice.
Example: unauthorized_transfer
payment_idstring or nullNoPayment concerned, where there is one.
Example: pay_3As6Df9Gh2
transaction_idstring or nullNoTransaction concerned, where there is one.
descriptionstringYesThe customer's description, as given.
Example: I did not make this payment.
regulation_ebooleanYesTrue where the notice is handled under Regulation E error resolution.
Example: true
notice_received_atstring (date-time)YesWhen the customer first gave notice, to the Tenant or to A2A InstaPay.
Example: 2026-10-15T13:40:00Z
statusstring, one of received, investigating, provisional_credit, resolved, closedYesDispute status.
Example: received
provisional_credit_amountinteger or nullNoProvisional credit given, in cents.
outcomestring or nullNoResult of the investigation.
resolved_atstring or nullNoTime the investigation was completed.
created_atstring (date-time)YesCreation time.
Example: 2026-10-15T14:03:22Z
updated_atstring (date-time)YesTime of the last change.
Example: 2026-10-15T14:03:22Z
versionintegerYesIncreases by one on every change.
Example: 1

EventData#

FieldTypeRequiredDescription
objectobjectYesThe full object after the change, in the same form the API returns.
previous_attributesobject or nullNoValues of the changed fields before the change.

Event#

FieldTypeRequiredDescription
idstringYesUnique event identifier. Use it to discard duplicate deliveries.
Example: evt_5Ujm8Ik2Ol4
objectstring, one of eventYesObject type.
Example: event
typestringYesEvent type, from the event catalog.
Example: payment.completed
api_versionstring, one of v1YesAPI version of the object in data.
Example: v1
environmentstring, one of sandbox, productionYesEnvironment that sent the event.
Example: sandbox
created_atstring (date-time)YesTime of the change.
Example: 2026-10-15T14:04:10Z
dataEventDataYesThe changed object.

Delivery#

FieldTypeRequiredDescription
statusstring, one of pending, delivered, retrying, failedYesDelivery status to the Tenant's endpoint.
Example: delivered
attemptsintegerYesNumber of delivery attempts.
Example: 1
last_attempt_atstring or nullNoTime of the last attempt.
Example: 2026-10-15T14:04:10Z
last_response_statusinteger or nullNoHTTP status returned by the Tenant on the last attempt.
Example: 200
next_attempt_atstring or nullNoTime of the next attempt, while retrying.

WebhookEvent#

FieldTypeRequiredDescription
idstringYesUnique event identifier. Use it to discard duplicate deliveries.
Example: evt_5Ujm8Ik2Ol4
objectstring, one of eventYesObject type.
Example: event
typestringYesEvent type, from the event catalog.
Example: payment.completed
api_versionstring, one of v1YesAPI version of the object in data.
Example: v1
environmentstring, one of sandbox, productionYesEnvironment that sent the event.
Example: sandbox
created_atstring (date-time)YesTime of the change.
Example: 2026-10-15T14:04:10Z
dataEventDataYesThe changed object.
deliveryDeliveryYesDelivery record.

ReconTotals#

FieldTypeRequiredDescription
loadsintegerYesTotal loads credited, in cents.
Example: 250000
paymentsintegerYesTotal payments between Digital Accounts and by bank, in cents.
Example: 410000
withdrawalsintegerYesTotal withdrawals, in cents.
Example: 180000
refundsintegerYesTotal refunds, in cents.
Example: 12000
feesintegerYesTotal fees posted to the fee clearing position, in cents.
Example: 8200
adjustmentsintegerYesTotal dispute credits, reversals and other adjustments, in cents.
Example: 0

ReconciliationReport#

FieldTypeRequiredDescription
objectstring, one of reconciliation_reportYesObject type.
Example: reconciliation_report
datestring (date)YesBusiness date (Eastern Time).
Example: 2026-10-14
account_structurestring, one of dedicated_fbo, tenant_schemeYesAccount structure of the Tenant.
Example: dedicated_fbo
currencystring, one of USDYesCurrency.
Example: USD
opening_balanceintegerYesSum of the Tenant's customer balances at the start of the day, in cents.
Example: 1250000
closing_balanceintegerYesSum of the Tenant's customer balances at the end of the day, in cents.
Example: 1301800
totalsReconTotalsYesTotals by movement type.
fee_clearing_sweptintegerYesFees swept from the fee clearing position to operating accounts during the day, in cents.
Example: 8200
postings_countintegerYesNumber of postings in the file.
Example: 1342
fileFileLinkYesThe posting-level file.
generated_atstring (date-time)YesTime the report was produced.
Example: 2026-10-15T06:00:00Z

SimulationResult#

FieldTypeRequiredDescription
objectstring, one of simulationYesObject type.
Example: simulation
eventstringYesSimulated event.
Example: payment.completed
object_idstringYesRecord the simulation acted on.
Example: pay_3As6Df9Gh2
statusstring, one of acceptedYesThe simulation was accepted; the resulting webhook follows.
Example: accepted