📋 Billing & SubscriptionsInvoices

Send an invoice

Sends an invoice to the customer via the specified channel (email, SMS, or WhatsApp). A draft is approved first; a finalized invoice becomes sent. The send is refused, and nothing changes, when the invoice has no customer, the customer has no address for the channel, or nothing is due.

POST/invoices/{id}/send

Sends an invoice to the customer via the specified channel (email, SMS, or WhatsApp). A draft is approved first; a finalized invoice becomes sent. The send is refused, and nothing changes, when the invoice has no customer, the customer has no address for the channel, or nothing is due.


Related endpoints

  • GET /invoices/{id}/usage-explain — Explain invoice usage charges
  • GET /invoices — List invoices
  • POST /invoices — Create invoice
  • GET /invoices/{id} — Get invoice
  • PATCH /invoices/{id} — Update invoice
  • GET /invoices/{id}/pdf — Get invoice PDF link
  • POST /invoices/{id}/finalize — Finalize an invoice
  • POST /invoices/{id}/void — Void an invoice

Common errors

  • 400 invalid_request — malformed payload or failed validation.
  • 404 resource_missing — the referenced resource does not exist or is not visible to your key.
  • 409 conflict — Idempotency-Key collision with a different body, or a concurrent state-transition conflict.

Idempotency

Pass an Idempotency-Key header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see the idempotency guide.

x-api-key<token>

Your RevKeen merchant API key. Create and manage keys in Dashboard → Settings → Developer. Use rk_sandbox_* for staging/test and rk_live_* for production. The same key may be sent as Authorization: Bearer <key> if that suits your HTTP client better. A missing, invalid, expired, or revoked key returns 401 with a WWW-Authenticate: Bearer challenge; a valid key without the required scope returns 403.

In: header

Path Parameters

id*string
Formatuuid

Request Body

application/json

Send options

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

Stuck on an error response? Ask the RevKeen assistant to explain it.
curl -X POST "https://api.revkeen.com/v2/invoices/11111111-1111-4111-8111-111111111111/send" \
  -H "x-api-key: $REVKEEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "email",
    "template_id": "11111111-1111-4111-8111-111111111111"
  }'

Synthetic documentation data, validated against the response schema; not a live API result.

{  "data": {    "id": "f1a2b3c4-d5e6-4270-8a9b-0c1d2e3f4a21",    "customer_uuid": "c2a1e7d4-5b3f-4a8e-9d21-6f0b3e4c7a11",    "invoice_number": "INV-0042",    "total_minor": 5880,    "currency": "GBP",    "allowed_methods": [      "card"    ],    "status": "paid",    "due_date": "2026-04-16T10:00:00.000Z",    "external_source": null,    "external_type": null,    "external_id": null,    "hosted_invoice_url": "https://pay.revkeen.com/inv_example_0042",    "created_at": "2026-04-16T10:00:00.000Z",    "updated_at": "2026-04-16T10:02:00.000Z"  },  "requestId": "req_7f3a9c2e5b1d"}

Put this endpoint to work