StoreBay Developers
Billing

Create a payment

Bacs Direct Debit payments are not instant and not final: a payment is not terminal at `paid_out` and may later transition to `late_failure_settled` or `chargeback_settled`. See ADR 0017. When `invoice_id` is present, `currency` must equal the invoice's own currency and the invoice must be in a collectable status (`open`, `partially_paid`, `overdue`). For an offline recording (`rail=offline`) the `Idempotency-Key` header is REQUIRED — the recording settles synchronously, so a keyless duplicate has no later reconciliation point.

POST
/payments

Bacs Direct Debit payments are not instant and not final: a payment is not terminal at paid_out and may later transition to late_failure_settled or chargeback_settled. See ADR 0017. When invoice_id is present, currency must equal the invoice's own currency and the invoice must be in a collectable status (open, partially_paid, overdue). For an offline recording (rail=offline) the Idempotency-Key header is REQUIRED — the recording settles synchronously, so a keyless duplicate has no later reconciliation point.

Authorization

AuthorizationBearer <token>

Present an API key (sb_live_… / sb_test_…), an OAuth2 access token, or a static token as a Bearer credential. The operator is implied by the credential; it is never in the path. Only a SHA-256 hash of an API key is stored server-side.

In: header

Header Parameters

Idempotency-Key?string

A unique key that makes this mutation safe to retry. Repeats replay the stored response; reuse with a different body returns 409 idempotency_conflict.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/payments" \  -H "Content-Type: application/json" \  -d '{    "amount_minor": 0,    "currency": "str"  }'
{  "data": {    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",    "object": "payment",    "contact_id": "f245e2a3-e141-4d41-912c-b1c1f5bd5598",    "invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32",    "subscription_id": "aa11a4c2-a467-43db-b413-c4ab0f5cf627",    "payment_method_id": "ec18d2d7-d2e0-41e4-98e4-847f14422d8a",    "mandate_id": "e98a8906-c5df-4f83-89a8-e8197c5fddcb",    "provider": "stripe",    "rail": "card",    "direction": "inbound",    "amount_minor": 0,    "currency": "str",    "status": "pending",    "settled_final": true,    "paid_out_at": "2019-08-24T14:15:22Z",    "charged_at": "2019-08-24T14:15:22Z",    "failed_at": "2019-08-24T14:15:22Z",    "failure_reason": "string",    "provider_payment_ref": "string",    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  }}
{  "error": {    "code": "unauthorized",    "message": "Missing or invalid credential."  }}
{  "error": {    "code": "insufficient_scope",    "message": "The credential lacks a scope required by this endpoint."  }}
{  "error": {    "code": "conflict",    "message": "The request conflicts with current resource state."  }}
{  "error": {    "code": "validation_error",    "message": "One or more fields are invalid.",    "details": [      {        "field": "email",        "issue": "must be a valid email address"      }    ]  }}
{  "error": {    "code": "rate_limited",    "message": "Rate limit exceeded. Retry after 7s."  }}
{  "error": {    "code": "validation_error",    "message": "string",    "details": [      {        "field": "string",        "issue": "string"      }    ]  }}