Webhook Simulator
This simulator is the QA for your webhook integration. It tests the webhook receiver endpoints you built — deposits and withdrawals — against every scenario we require, building valid notifications, signing them exactly the way we do, and delivering them to your endpoint.
When every scenario passes, your integration is ready — there is no separate manual QA on our side. Run all four scenarios, confirm the ALL PASSED state, export the run as evidence, and send it to us as your sign-off before you launch the system.
How it works
- Your operator username (the API shared secret we deliver via OTP) signs the request locally in your browser using the Web Crypto API. It is never sent to our servers and never stored.
- The signature is computed over the exact bytes we send —
SHA256(operator_username + raw_body + operator_username), hex-encoded — and sent asAuthorization: Bearer <signature>. See Signature for the formula and validation code. - The signed request is relayed by a small server-side proxy so it reaches your endpoint under real server-to-server conditions (no browser CORS). The proxy forwards the body verbatim and never logs it or the signature.
The relay is a serverless function, so the simulator works on the deployed docs
site — not under a local npm start. Point it at an endpoint you can reach over
https (the proxy rejects non-https and private/internal hosts).
What gets sent
You provide the endpoint URLs, your point_of_sale.id, your operator username, and
an optional amount. Everything else is generated fresh on each fire — a random
player username (a 10-digit number), a unique transaction_number, the matching
description, created_at, and currency_code — so each run looks like a real,
distinct notification. amount is always sent as a JSON number (e.g. 100),
never a quoted or 2-decimal string.
The scenarios
- Happy path — a valid, correctly-signed notification. Your endpoint should
accept it and return
201 Created. - Tampered signature — a valid body with a corrupted signature. Your endpoint
must reject it with a non-
201(401/403) and not process it. - Invalid payload — the same request is sent repeatedly, each time omitting
exactly one field, always with a valid signature (so this isolates
content validation from signature validation). Each should return
400. Results are shown as a per-field table. - Duplicate event — the same
transaction_numberis delivered twice. The first delivery should return201 Createdand the second must return409 Conflict, proving your idempotency is keyed ontransaction_number(see Idempotency). This scenario passes only when the duplicate returns409.
What each scenario checks
Every scenario validates the response body, not only the HTTP status. For a
scenario to pass, the response must meet the full contract:
the body must be valid JSON, status must be "success" (happy path) or "error"
(the rejections), transaction_number must follow the echo rule
(the value we sent, or null where you couldn't read it), and error responses must
carry a non-empty message. A 201 with an empty or garbage body is a fail — so
ALL PASSED means your endpoint meets the whole contract, not just the status codes.
Integration readiness
0/4| Happy path | Valid signature → expect 201. | Not run |
| Tampered signature | Valid body, corrupted signature → expect 401 / 403. | Not run |
| Invalid payload | Omit one field at a time, valid signature → expect 400 each. | Not run |
| Duplicate event | Same transaction_number twice → expect 201, then 409. | Not run |
Inspection
Run a scenario to see the HTTP status, response body, headers and latency here.