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

Update Merchant PATCH /api/merchant/update


Transaction Management

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

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.

Void Transaction PATCH /api/transaction/void


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