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

Guide

Invoices paid by bank transfer

For large business payments: each invoice gets its own account number, and the money the customer sends there pays it — in part, in full or more.

Paid by push, matched by account

A debit pulls money from the payer's bank, within your per-payment limits. An invoice works the other way round: the customer sends the money from their own bank, by ACH credit or instant payment, to an account number that belongs to that one invoice. No debit limit applies, and the money that lands in that account is matched to the invoice: part of it, all of it, or more.

Create an invoice

Call POST /v1/invoices with an Idempotency-Key, the customer, the amount and a due date of today or later. Line items are optional; when you send them they must add up to amount_cents.

The response carries payment_instructions: the invoice's own account and routing number. Put them on the invoice you send. The full account number is returned here and by GET /v1/invoices/{id} only; lists show its last four digits.

Invoice a business customer

POST /v1/invoices
curl -X POST https://sandbox.socialmatterspay.com/v1/invoices \
  -H 'Idempotency-Key: inv_2026_0412' \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "customer_name": "Acme Wholesale Inc",
  "customer_email": "ap@acme.example",
  "amount_cents": 1850000,
  "due_date": "2026-11-27",
  "description": "October shop supplies",
  "external_id": "INV-2026-0412",
  "line_items": [
    {
      "description": "Shelving units",
      "quantity": 40,
      "unit_price_cents": 42500
    },
    {
      "description": "Delivery and installation",
      "quantity": 1,
      "unit_price_cents": 150000
    }
  ]
}'
The response · 201
Response · 201
HTTP 201
Cache-Control: no-store

{
  "data": {
    "id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
    "object": "invoice",
    "status": "sent",
    "amount_cents": 1850000,
    "paid_cents": 0,
    "remaining_cents": 1850000,
    "overpaid_cents": 0,
    "currency": "USD",
    "customer_name": "Acme Wholesale Inc",
    "customer_email": "ap@acme.example",
    "due_date": "2026-11-27",
    "description": "October shop supplies",
    "line_items": [
      {
        "description": "Shelving units",
        "quantity": 40,
        "unit_price_cents": 42500
      },
      {
        "description": "Delivery and installation",
        "quantity": 1,
        "unit_price_cents": 150000
      }
    ],
    "external_id": "INV-2026-0412",
    "funds": {
      "received_cents": 0,
      "booked_cents": 0,
      "held_at_bank_cents": 0,
      "status": "none"
    },
    "virtual_account_last_four": "6252",
    "paid_at": null,
    "cancelled_at": null,
    "overdue_at": null,
    "created_at": "2026-10-28T00:27:40.662Z",
    "payment_instructions": {
      "account_number": "9434316252",
      "routing_number": "110000000",
      "account_type": "checking",
      "reference": "69fcf9e0-a58f-4891-ac46-3f2a615e070d"
    }
  }
}

Where the money is

Money the customer sends stays in the invoice's account at the bank until it is booked into your balance. Until then it is not in your balance and not in a payout. funds on every invoice says how much was received, how much was booked and how much is still held at the bank.

Partly paid, the money held at the bank

The response · 200
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": {
    "id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
    "object": "invoice",
    "status": "partially_paid",
    "amount_cents": 1850000,
    "paid_cents": 1000000,
    "remaining_cents": 850000,
    "overpaid_cents": 0,
    "currency": "USD",
    "customer_name": "Acme Wholesale Inc",
    "customer_email": "ap@acme.example",
    "due_date": "2026-11-27",
    "description": "October shop supplies",
    "line_items": [
      {
        "description": "Shelving units",
        "quantity": 40,
        "unit_price_cents": 42500
      },
      {
        "description": "Delivery and installation",
        "quantity": 1,
        "unit_price_cents": 150000
      }
    ],
    "external_id": "INV-2026-0412",
    "funds": {
      "received_cents": 1000000,
      "booked_cents": 1000000,
      "held_at_bank_cents": 0,
      "status": "booked"
    },
    "virtual_account_last_four": "6252",
    "paid_at": null,
    "cancelled_at": null,
    "overdue_at": null,
    "created_at": "2026-10-28T00:27:40.662Z",
    "payment_instructions": {
      "account_number": "9434316252",
      "routing_number": "110000000",
      "account_type": "checking",
      "reference": "69fcf9e0-a58f-4891-ac46-3f2a615e070d"
    }
  }
}

Cancel an invoice

Cancel an invoice nothing has been paid on with POST /v1/invoices/{id}/cancel; once money has landed, cancelling answers 422. If the customer still sends money to a cancelled invoice, it is recorded on the invoice, which stays cancelled and sends no event, so you can see it and send it back.

Cancel an unpaid invoice

The response · 200
Response · 200
HTTP 200
Cache-Control: no-store

{
  "data": {
    "id": "9e80b109-af15-4764-9a39-0d09aa053140",
    "object": "invoice",
    "status": "cancelled",
    "amount_cents": 64000,
    "paid_cents": 0,
    "remaining_cents": 64000,
    "overpaid_cents": 0,
    "currency": "USD",
    "customer_name": "Acme Wholesale Inc",
    "customer_email": "ap@acme.example",
    "due_date": "2026-11-27",
    "description": null,
    "line_items": null,
    "external_id": "INV-2026-0413",
    "funds": {
      "received_cents": 0,
      "booked_cents": 0,
      "held_at_bank_cents": 0,
      "status": "none"
    },
    "virtual_account_last_four": "8494",
    "paid_at": null,
    "cancelled_at": "2026-10-28T00:28:41.700Z",
    "overdue_at": null,
    "created_at": "2026-10-28T00:28:41.695Z"
  }
}

In the sandbox

Play the customer with POST /v1/sandbox/invoices/{id}/push. An ACH credit lands after the sandbox settle delay, so move the clock with POST /v1/sandbox/advance and read the invoice; an instant payment lands at once.

The customer sends part by ACH

POST /v1/sandbox/invoices/69fcf9e0-a58f-4891-ac46-3f2a615e070d/push
curl -X POST https://sandbox.socialmatterspay.com/v1/sandbox/invoices/69fcf9e0-a58f-4891-ac46-3f2a615e070d/push \
  -H 'Authorization: Bearer sk_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
  "amount_cents": 1000000,
  "rail": "ach"
}'
The response · 202
Response · 202
HTTP 202
Cache-Control: no-store

{
  "data": {
    "object": "sandbox_incoming_credit",
    "invoice_id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
    "amount_cents": 1000000,
    "rail": "ach",
    "bank_status": "pending",
    "lands_at": "2026-10-28T00:28:40.666Z",
    "invoice": {
      "id": "69fcf9e0-a58f-4891-ac46-3f2a615e070d",
      "object": "invoice",
      "status": "sent",
      "amount_cents": 1850000,
      "paid_cents": 0,
      "remaining_cents": 1850000,
      "overpaid_cents": 0,
      "currency": "USD",
      "customer_name": "Acme Wholesale Inc",
      "customer_email": "ap@acme.example",
      "due_date": "2026-11-27",
      "description": "October shop supplies",
      "line_items": [
        {
          "description": "Shelving units",
          "quantity": 40,
          "unit_price_cents": 42500
        },
        {
          "description": "Delivery and installation",
          "quantity": 1,
          "unit_price_cents": 150000
        }
      ],
      "external_id": "INV-2026-0412",
      "funds": {
        "received_cents": 0,
        "booked_cents": 0,
        "held_at_bank_cents": 0,
        "status": "none"
      },
      "virtual_account_last_four": "6252",
      "paid_at": null,
      "cancelled_at": null,
      "overdue_at": null,
      "created_at": "2026-10-28T00:27:40.662Z"
    }
  }
}