{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Webhooks","siteUrl":"https://docs.omno.com"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"webhooks","__idx":0},"children":["Webhooks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Webhooks deliver real-time transaction status changes to your server. They are the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["single source of truth"]}," for final transaction outcomes — never rely on redirects or client-side events."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["⚠️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warning:"]}," Credit or debit a player balance only after a webhook (or the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.omno.com/apis"},"children":["GET transaction endpoint"]},") confirms the final status. Browser redirects and SDK events can be lost or spoofed."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"configure-webhooks","__idx":1},"children":["Configure webhooks"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log in to the OMNO Dashboard."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Navigate to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developers → Webhooks"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create Webhook"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fill in the required fields:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name"]}," — internal identifier."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Webhook URL"]}," — the endpoint that receives events."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Hook Type"]},": Transaction."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select which transaction events to receive."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Choose an authorization method (optional)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can monitor delivery under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developers → Webhooks"]},": full request payloads, your server's responses, and the delivery status of each attempt."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"which-events-trigger-a-webhook","__idx":2},"children":["Which events trigger a webhook"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You subscribe to the transaction events relevant to your integration, such as creation, processing updates, successful completion, failure/timeout, and refund updates. Each selected event fires a webhook when the transaction reaches that state."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: exact list of status changes that trigger a webhook]"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"payload","__idx":3},"children":["Payload"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["OMNO sends an HTTP ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," with a JSON body describing the transaction."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: PayIn webhook payload structure and example]"]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: Payout webhook payload structure and example]"]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: signature verification method]"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"retry-policy","__idx":4},"children":["Retry policy"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If delivery fails, OMNO retries the request ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["up to 10 times"]},"."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: retry interval / backoff schedule]"]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: what response counts as successful delivery — e.g. any 2xx]"]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: delivery timeout]"]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: behavior after the 10th failed retry]"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"handling-requirements","__idx":5},"children":["Handling requirements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Respond quickly"]}," — do heavy processing asynchronously."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Process idempotently"]}," — the same transaction can arrive more than once."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Handle out-of-order statuses"]}," — never downgrade a final status (for example, do not overwrite ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SUCCESS"]}," with an earlier ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["On any doubt, call the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.omno.com/apis"},"children":["GET transaction endpoint"]}]}," to fetch the authoritative status."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-transactions","__idx":6},"children":["Test transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Transactions processed by a fake PSP are identified by the fake PSP ID (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantPspId"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["processorPspId"]}," on the transaction). See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/getting-started/testing-in-production"},"children":["Testing in Production"]},"."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["⚠️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warning:"]}," Never credit or debit real player balances for transactions processed by a fake PSP."]}]}]},"headings":[{"value":"Webhooks","id":"webhooks","depth":1},{"value":"Configure webhooks","id":"configure-webhooks","depth":2},{"value":"Which events trigger a webhook","id":"which-events-trigger-a-webhook","depth":2},{"value":"Payload","id":"payload","depth":2},{"value":"Retry policy","id":"retry-policy","depth":2},{"value":"Handling requirements","id":"handling-requirements","depth":2},{"value":"Test transactions","id":"test-transactions","depth":2}],"frontmatter":{"seo":{"title":"Webhooks"}},"lastModified":"2026-10-12T06:54:23.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/getting-started/webhooks","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}