Changelog
What changed in the API, newest first. The path is /v1 and stays /v1: every change below is additive, and a request that worked before a change works after it. When that stops being true there will be a /v2 and a notice here first.
2026-09-17
Keys have scopes and lifetimes. A key names what it may reach, chosen at mint and never changed; a call outside them is FORBIDDEN_SCOPE (403) with scope in the body. A key may be given a lifetime, after which it is KEY_EXPIRED (401). Keys made before today hold every scope and never expire. The dashboard gained Replace it, which mints a key with the old one's terms and retires the old one in 24 hours. See Authentication.
Rate limits are real. 600 requests per minute per live key, 120 per test key; X-RateLimit-* on every response and Retry-After on a RATE_LIMITED (429). The code and the status were documented before; nothing enforced them. See Rate limits.
IDEMPOTENT_MISMATCH on POST /v1/charges is answered. A reused key with a different amount used to return the first charge as a 201. It is now the 409 the documentation always promised, and nothing is created.
The sandbox requires Idempotency-Key on POST /v1/charges, honours scopes, and returns the same charge on a retry — the same rules as live, so the retry path can be tested. A sandbox integration that never sent the header will start receiving IDEMPOTENCY_REQUIRED; live already required it.
POST /v1/payment_links honours an Idempotency-Key when one is sent. Still optional.
Webhook endpoints over the API. POST, GET and DELETE on /v1/webhook_endpoints, under webhooks:write and webhooks:read, so a deploy can move where events go. Live keys only; the test-mode address stays on the dashboard. See Webhook endpoints.
Three codes that were never emitted are gone from the catalogue — IDEMPOTENT_IN_FLIGHT, RAIL_DEGRADED, TEST_MODE_UNSUPPORTED — and ten that were emitted are now documented. An unhandled failure is 503, as documented, rather than 500. Every code has a page at its doc URL.
This site. The doc URL on every error resolves. The OpenAPI document and a Postman collection are published and held to the route tables by a test.
2026-09-16
The integration guide, as a single document, and the bill entry page at pay.pamopay.co/b.