Skip to main content
Each error uses the same wrapper. The wrapper has a stable code and a message for a person to read. Use the code to select the action in your integration. The text of the message can change.
Jenzy publishes these codes. Jenzy never renames a code and never removes a code. Jenzy only adds codes. Use the code field. Do not use the message field or the HTTP reason text.

Two groups of codes

There are two groups of errors. The two groups do different things with your money.
  • Rejections (the first table) — Hermes refused the request. Hermes created no payout and held no money. Correct the request, or wait, and then send the request again.
  • Failure codes (the second table) — Hermes accepted the payout, held the funds, and the payout failed later. The payout is terminal, and Hermes sets failure: { code, message }. Hermes always releases the hold back to your available balance. To try again, always create a new payout with a new Idempotency-Key.

Rejection codes

Failure codes

A failed payout has one of these codes in failure.code. The code is the same on GET /payouts/{id} and in the payout.failed webhook. The failure.message text does not change for a given code. You can show that text to your own users.

When Jenzy pauses the API

See Maintenance and outages for the procedure that your system must obey. service_incident and service_maintenance are the only two codes that mean Jenzy stopped this on purpose. They are different from each other rejection in one way: they do not use your Idempotency-Key. Each other decided result, a new payout or a 4xx, is final for that key. A pause is not a decision. So the safe action is the same key with the same body. You then get a payout, and not a conflict. While one of the two codes applies:
  • Each /v1 route, but not GET /ping, gives 503. This includes the read endpoints, POST /fees/quote, the payout creates, and POST /collections/simulate.
  • GET /ping continues to answer. Its status field is outage for an incident, or maintenance for planned work.
  • Payouts that Hermes accepted before the pause stay in held. Hermes did not send them. They did not fail. No money moved for them. They continue automatically when the pause ends.
  • Hermes still delivers the webhooks for payouts that already got a result.
Jenzy does not send a Retry-After header with these codes. A person at Jenzy decides when a pause ends. So a timestamp from Jenzy would only be a guess.
Hermes never sends a failed payout again. The four codes above are the complete set of failure codes. Hermes uses declined for each failure that does not agree with the other three codes.