Error body
Wherever an error can carry an explanation, use this shape:"currency mismatch: account is USD, request is EUR" closes a ticket; "error" opens one.
Status codes on debit
This is the table that matters most.Status codes on credit and rollback
There is no
422 here. A settlement always has to land: if it cannot be applied now, it is retried until it can, or a human looks at it.Retry behaviour
Zero-Dash uses durable retry logic for failed credit and rollback calls.Credit
10 retries, exponential backoff, spanning 3 days.
Rollback
10 retries, exponential backoff, spanning 3 days.
Reconciling after a failure
When a settlement keeps failing, or a debit ended in an ambiguous500, Get transaction is how state gets compared.
Designing for the retry window
Make settlements terminal
Once applied, a credit or rollback stays applied. A later duplicate replays the stored result — see Idempotency.
Never expire an open bet
A debit can sit unsettled for three days. Do not sweep old pending transactions on a shorter timer; a cleanup job that voids them locally will disagree with our ledger.
Log the Zero-Dash IDs
Store
transactionId, referenceTransactionId and gameRoundId on every row. They are the only keys we can search by during an incident.Alert on repeated 4xx
A
400 on a settlement will keep arriving until you fix it. Catch that in your own monitoring rather than in a support thread.Failure playbook
Every callback returns 401
Every callback returns 401
A signature problem, and it is almost always the path or the raw body. Work through Troubleshooting — verify against the path you registered, including any prefix, and against the untouched request bytes.
Credits pile up unsettled
Credits pile up unsettled
Your
/credit handler is rejecting something systematically. The usual causes: zero payouts treated as invalid, a required session token, or a referenceTransactionId lookup that fails for free rounds.Balances drift from ours
Balances drift from ours
Duplicate application. Check that
transactionId is the primary key of your ledger and that the balance update shares a database transaction with the insert.A player is missing a stake
A player is missing a stake
A debit that returned
422 after actually writing. We never rolled it back, because you told us there was nothing to roll back. Audit which code path returns 422 and confirm nothing can be written before it.