Idempotency keys are required on create and are part of the HMAC v2 canonical string. Reusing a key with different semantic content returns 409.

Errors

Non-success responses use one stable JSON problem envelope so merchants can log a request identifier without exposing request bodies or credentials.

Error catalogue

Branch application logic on code, not title or detail. A create may also return:

Idempotency

POST /v2/payments requires an Idempotency-Key containing 16 to 128 ASCII characters (letters, numbers, ., _, ~, -; first character alphanumeric).
Generate one key when a merchant order first enters payment creation. Persist it with the order before sending the request. The key is HMAC-bound: changing the key changes the signature.

Required behaviour

  • Reuse the same key only with equivalent validated content (external_reference, amount fields, and metadata).
  • Never reuse a key for another merchant order.
  • If a response is lost, do not invent a new key or create a second logical payment.
  • Treat submission_unknown as unresolved, not as success or failure.
  • Make downstream fulfilment idempotent independently of API idempotency.

Ambiguous create outcome

If the connection closes before a complete create response:
  1. Preserve the merchant reference, original request body, idempotency key, timestamped attempt record, and any returned request identifier.
  2. Do not send a new logical payment request with a different key.
  3. Do not promise the customer that creation failed.
  4. Replay the same signed logical create, or wait for webhook / retrieve once you have a payment_id.
  5. Proceed only after an authoritative payment response or payment.updated event.