AcmePay API

REST for writes, GraphQL for reads. OpenAPI spec: openapi.json.

Base URL (current)https://api.acmepay.duckdns.org/api/v2
GraphQLhttps://api.acmepay.duckdns.org/graphql (beta, read-only)
Sandboxhttps://sandbox.acmepay.duckdns.org — isolated test data, resets nightly
Previous version/api/v1 — deprecated, sunset 2025-12-31. See legacy documentation.
SpecOpenAPI 3.1 at /docs/openapi.json

Authentication

Production requests use short-lived bearer tokens. Exchange your dashboard credentials or client credentials at POST /api/v2/auth/token, then send:

Authorization: Bearer <token>

API keys issued in the developer portal look like apk_live_… (production) and apk_test_… (sandbox). The header X-AcmePay-Key is still accepted by /api/v1 only and will be removed with v1.

Core resources (v2)

PaymentsPOST /api/v2/payments, GET /api/v2/payments/{id}, POST /api/v2/payments/{id}/capture
PayoutsPOST /api/v2/payouts, GET /api/v2/payouts/{id}
CustomersGET/POST /api/v2/customers
WebhooksGET/POST /api/v2/webhooks, signed with X-AcmePay-Signature
StatusGET /api/v2/status — unauthenticated health check

Example request

curl https://api.acmepay.duckdns.org/api/v2/payments \
  -H "Authorization: Bearer $ACMEPAY_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d amount=4200 -d currency=gbp -d capture=true

Internal services

Endpoints under https://api.acmepay.duckdns.org/internal/ (reporting, reconciliation jobs) are reachable from the corporate network / VPN only and are not part of the public API. They are documented in the internal wiki.

Environments

Productionapi.acmepay.duckdns.org
Sandboxsandbox.acmepay.duckdns.org — safe for integration testing
Staginginternal only — do not point integrations here

Older guides, the Postman collection and v1 examples live in the legacy documentation.