Skip to main content

How responses are structured

The API returns errors in two general shapes: Validation errors — for most endpoints, a top-level errors object keyed by field name:
Message errors — a message string, either at the top level or nested under data:
Success responses — a data object or array containing the resource, or a confirmation message for actions like void, refund, and delete.
Address endpoints are the exception to the validation shape. The five /api/address/* endpoints return their validation bag under a top-level message key, not under errors. A shared error handler written only for errors will silently miss every address validation failure. See Addresses below.
Message placement is inconsistent across endpoints — sometimes message, sometimes data.message, and permission denials differ too (see Permission denials). Error wording also varies slightly between endpoints. The tables below reflect the API exactly as it behaves.Pagination: every list endpoint uses cursor pagination and returns up to 500 records per page, not just the customer list.

Permission denials

Permission-denied responses are not uniform across the API: Handle both shapes when checking for authorization failures.

Common messages

These appear across multiple endpoints.

Merchant Management

List Merchants GET /api/merchant/list

Show Merchant GET /api/merchant/show

Create Merchant POST /api/merchant/create

The 409 means a merchant you already have looks like the one you’re creating. Check whether it’s the same business before creating another.

Update Merchant PATCH /api/merchant/update

Get Application Status GET /api/merchant/application-status

boarded is the field that tells you whether the merchant can take money. A merchant can be live without application_status being approved, because declines and holds are sometimes resolved directly with underwriting.

Transaction Management

Idempotency keys. The charge, authorize, capture, refund and void endpoints accept an optional Idempotency-Key header. A reused key can also return 400 (malformed key), 409 (the first request with that key is still in progress) or 422 (the key was used for a different request), and a replayed response carries Idempotent-Replayed: true. See Retrying Safely.

List Transactions GET /api/transactions

Charge a Credit Card POST /api/transaction/charge-card

status_code and status_text are passed through from the processor. 00 / APPROVAL and 05 / DECLINE are the most common but other processor codes are possible.

Charge a Bank Account (ACH) POST /api/transaction/charge-ach

Tokenize a Credit Card POST /api/transaction/tokenize-card

Show Transaction GET /api/transaction

Authorize a Credit Card POST /api/transaction/authorize

Capture an Authorized Credit Card POST /api/transaction/capture

See Authorize and Capture for the full flow.

Refund Transaction POST /api/transaction/refund

The ACH hold message includes a live countdown (N day(s) remaining). You can surface that number directly in your own UI. The 7-day ACH refund hold is explained for merchants in ACH Refund Hold.
Refunding inside the ACH hold. Send override_ach_settlement_wait: true to refund an ACH payment before the 7 days are up. It has no scope of its own: any token that can refund (transaction:charge-card-token) can send it. Use it only for cases like a duplicate charge or confirmed fraud. If the customer’s bank later returns the original payment, the merchant is out that amount with nothing left to recover it from. The flag has no effect on card refunds or on ACH payments that have already settled.
Refunding a card payment that hasn’t settled yet voids it instead. The response is "message": "void" rather than "refund", and the Credit Card Void webhook fires instead of Credit Card Refund.

Void Transaction PATCH /api/transaction/void


Chargeback Management

List / Show Chargebacks GET /api/chargeback/list GET /api/chargeback/show

Chargeback data is imported once a day. See Disputes.

Document Management

Upload Documents POST /api/document/upload

This endpoint is multipart/form-data, not JSON. A 403 here almost always means the fields weren’t named data[sid], data[doc_type], and files[]. See Uploading evidence via API.

List Documents GET /api/document/list


Held Funds

Get Balance / List Releasable Transactions GET /api/funds/balance GET /api/funds/transactions

Release Held Funds POST /api/funds/release

See Held Funds for idempotency and the unknown status.

Addresses

List / Show / Create / Update / Delete GET /api/address/*

Address validation errors are shaped differently from the rest of the API. They come back as { "message": { ... } } — the field-keyed validation bag lives under message, not under a top-level errors object. Create returns 200, not 201.

Customer Management

List / Show / Create / Update / Delete GET|POST|PATCH /api/customer/*

Deleting a customer also cancels any recurring payments associated with that customer.

Deposit Management

List Deposits GET /api/deposit/list

List with Transactions / Show Deposit GET /api/deposit/list-with-trans GET /api/deposit/show


Payment Method Management

List / Show / Create / Update / Delete GET|POST|PATCH /api/payment-method/*

To delete a payment method that has active recurring payments, cancel or reassign those recurring payments first.

Recurring Payments

All Recurring Payment endpoints GET|POST|PATCH /api/recurring-payment/*

Notable fields in success responses: last_run_status (Success or Failed), last_run_failed_count, and error — a processor-provided reason such as EXPIRED CARD when the last attempt failed. Pause defaults paused_until_date to 2099-12-31 if no date is provided.

Invoice Management

Invoice endpoints share a common error pattern. Beyond validation and auth, most return 404 Invalid sid when data.sid does not match an accessible merchant, and several return 422 for state-specific conflicts.

Shared error pattern GET|POST|PATCH /api/invoice*

Endpoint-specific conflicts (422)

POST /api/invoice/pay can return 500 Captured but not recorded. This means the customer was charged but the invoice record did not update. Do not blindly retry — confirm the payment in the transaction record first to avoid double-charging.

Recurring Invoices

All recurring-invoice endpoints GET|POST|PATCH /api/recurring-invoice*

Subscription Plans

All subscription-plan endpoints GET|POST|PATCH /api/subscription-plan/*

POST /api/subscription-plan/subscribe charges the customer’s saved payment method for the first period and enrolls them. A declined first charge returns 422 Charge failed. On success it returns 201 and fires the Subscription Created webhook. A plan cannot be deleted while it still has subscribers (422 Has subscribers) — archive it instead.

Subscriptions

All subscription endpoints GET|PATCH /api/subscription/*

Lifecycle actions (pause, resume, cancel) each fire the matching subscription webhook on success. See Webhooks.

Zapier Endpoints

For the transactions by phone endpoint, the request body must use either last_days or start_date + end_date — not both.

Troubleshooting