{"componentChunkName":"component---src-templates-article-template-tsx","path":"/cl/en/card-present-payments/kushki-one/async-services-webhooks","result":{"data":{"article":{"title":"Async services and webhooks","subtitle":"Start payments without blocking your POS and receive the full transaction lifecycle over webhook, one event at a time","fullWidth":null,"hero":null,"heroTextColor":null,"heroImg":null,"content":[{"body":{"childMdx":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {};\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\nvar Aside = makeShortcode(\"Aside\");\nvar CodeTabs = makeShortcode(\"CodeTabs\");\nvar NextStep = makeShortcode(\"NextStep\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(Aside, {\n    title: \"\\uD83D\\uDEA7 Early Release \\u2014 Beta\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"This product is in early access\"), \". Parameters, response structures and behaviors may change without prior notice. Do \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"not\"), \" use this version in production without coordinating with the Kushki integrations team first.\")), mdx(\"p\", null, \"A card-present payment depends on a person: someone has to tap the card, pick installments, enter a PIN. That time frequently exceeds the 15 seconds most POS architectures tolerate.\"), mdx(\"p\", null, \"Async services solve that. Your system sends the payment intent, receives an immediate acknowledgement and moves on. Kushki ONE Connect notifies you of every state change over webhook, all the way to the acquirer\\u2019s final answer.\"), mdx(\"h2\", {\n    \"id\": \"requirements\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#requirements\",\n    \"aria-label\": \"requirements permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Requirements\"), mdx(Aside, {\n    title: \"Before you start\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"A public HTTPS endpoint that accepts \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"POST\"), \" and answers with any \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"2xx\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The async route configured in your integration: the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/async/\"), \" prefix instead of \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/sync/\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Your webhook consumer ready to receive repeated events. We explain why in \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"#build-your-consumer\"\n  }, \"Build your consumer\"), \".\"))), mdx(\"h2\", {\n    \"id\": \"how-it-works\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#how-it-works\",\n    \"aria-label\": \"how it works permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"How it works\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"1. POST /async/charge          \\u2192  we answer TERMINAL_ACKNOWLEDGED right away\\n2. The terminal operates the card\\n3. POST to your events_webhook_url  \\u2192  one event per state change\\n4. Final event                      \\u2192  APPROVAL or DECLINED\\n\")), mdx(Aside, {\n    title: \"The acknowledgement is not the result\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"The response to an async call confirms only that the terminal received the payment intent. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"It does not tell you whether the transaction was approved.\"), \" To learn the result you must consume the webhook.\")), mdx(\"h2\", {\n    \"id\": \"turn-on-the-events\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#turn-on-the-events\",\n    \"aria-label\": \"turn on the events permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Turn on the events\"), mdx(\"p\", null, \"Send \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"events_webhook_url\"), \" in the request body of any async operation.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"events_webhook_url\\\": \\\"https://api.yourbusiness.com/webhook/terminal-events\\\",\\n  \\\"amount\\\": {\\n    \\\"iva\\\": 0,\\n    \\\"subtotal_iva\\\": 0,\\n    \\\"subtotal_iva0\\\": 12000,\\n    \\\"extra_taxes\\\": { \\\"airport_tax\\\": 0, \\\"iac\\\": 0, \\\"ice\\\": 0, \\\"travel_agency\\\": 0 }\\n  },\\n  \\\"client_transaction_id\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\"\\n}\\n\")), mdx(Aside, {\n    title: \"Async mode only\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"events_webhook_url\"), \" is accepted only on \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/async/\"), \" endpoints. Sync operations return the result directly in the HTTP response, so they emit no events.\"), mdx(\"p\", null, \"If you leave the parameter out of an async call, the transaction still runs, but you receive no notifications and no final result.\")), mdx(\"h2\", {\n    \"id\": \"one-envelope-two-uses\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#one-envelope-two-uses\",\n    \"aria-label\": \"one envelope two uses permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"One envelope, two uses\"), mdx(\"p\", null, \"There is a single event schema and it reaches you at two moments:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"The HTTP response\"), \" to your async call. Always with \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"status: TERMINAL_ACKNOWLEDGED\"), \" and an empty \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"previous_status\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Every webhook delivery\"), \", carrying the later state changes up to the acquirer\\u2019s result.\")), mdx(\"p\", null, \"That symmetry is deliberate: write one deserializer and use it for both cases.\"), mdx(\"h2\", {\n    \"id\": \"lifecycle-states\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#lifecycle-states\",\n    \"aria-label\": \"lifecycle states permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Lifecycle states\"), mdx(\"p\", null, \"Kushki ONE models a payment as \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"seven states\"), \". Five come from the terminal; only \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"APPROVAL\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DECLINED\"), \" come from the acquirer.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"th\"\n  }, \"status\")), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Origin\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"What it means\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_ACKNOWLEDGED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The terminal received the payment intent. Always the first state\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_CANCELED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The cardholder canceled on the terminal, or your POS sent an \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"abort\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The cardholder operated the card. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"reading_type\"), \" tells you how it was read\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_REJECTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Rejected locally before reaching the acquirer: \", mdx(\"em\", {\n    parentName: \"td\"\n  }, \"timeout\"), \", maximum retries or validation\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"APPROVAL_REQUESTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The transaction was sent to the acquirer for authorization\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"DECLINED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Acquirer\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The acquirer declined the transaction\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"APPROVAL\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Acquirer\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The acquirer approved the transaction\")))), mdx(\"h3\", {\n    \"id\": \"transitions\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#transitions\",\n    \"aria-label\": \"transitions permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Transitions\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"TERMINAL_ACKNOWLEDGED \\u2500\\u252C\\u2500\\u2192 CARD_PRESENTED \\u2500\\u2500\\u252C\\u2500\\u2192 APPROVAL_REQUESTED \\u2500\\u252C\\u2500\\u2192 APPROVAL\\n                       \\u2502         \\u2502      \\u25B2   \\u2502                       \\u2514\\u2500\\u2192 DECLINED\\n                       \\u2502         \\u2502      \\u2514\\u2500\\u2500\\u2500\\u2518  card presented again\\n                       \\u2502         \\u2514\\u2500\\u2192 TERMINAL_CANCELED\\n                       \\u251C\\u2500\\u2192 TERMINAL_CANCELED\\n                       \\u2514\\u2500\\u2192 TERMINAL_REJECTED\\n\")), mdx(Aside, {\n    title: \"APPROVAL_REQUESTED is the point of no return\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"Once the transaction reaches the acquirer you can no longer cancel it with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"abort\"), \": you have to wait for \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"APPROVAL\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DECLINED\"), \". If it comes back approved, reverse it with a void on the same day or with a refund after the cut-off.\")), mdx(\"p\", null, \"A card rejected at the terminal can be presented again, which produces a new \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CARD_PRESENTED\"), \" with an incremented \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"interaction_attempt\"), \". That is why the lifecycle is a graph and not a straight line: \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"do not assume a fixed number of events per transaction\"), \".\"), mdx(\"h2\", {\n    \"id\": \"event-structure\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#event-structure\",\n    \"aria-label\": \"event structure permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Event structure\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"event_id\\\": \\\"c08211a1-344c-4f1c-850b-41e33fb08cca\\\",\\n  \\\"previous_status\\\": \\\"TERMINAL_ACKNOWLEDGED\\\",\\n  \\\"occurred_at\\\": \\\"2026-08-03T20:53:34.859Z\\\",\\n  \\\"status\\\": \\\"CARD_PRESENTED\\\",\\n  \\\"merchant_id\\\": \\\"20000000104598300000\\\",\\n  \\\"client_transaction_id\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\",\\n  \\\"interaction_attempt\\\": 1,\\n  \\\"reading_type\\\": \\\"CHIP\\\",\\n  \\\"terminal\\\": {\\n    \\\"serialNumber\\\": \\\"TJ54241P20911\\\",\\n    \\\"model\\\": \\\"P2SE-BPKT\\\",\\n    \\\"wifiMac\\\": \\\"\\\",\\n    \\\"room\\\": \\\"3.0.10\\\"\\n  },\\n  \\\"operation\\\": {\\n    \\\"type\\\": \\\"charge\\\",\\n    \\\"amount\\\": {\\n      \\\"iva\\\": 0.0,\\n      \\\"subtotalIva\\\": 0.0,\\n      \\\"subtotalIva0\\\": 12000.0,\\n      \\\"extraTaxes\\\": { \\\"airportTax\\\": 0.0, \\\"iac\\\": 0.0, \\\"ice\\\": 0.0, \\\"travelAgency\\\": 0.0 }\\n    },\\n    \\\"clientTransactionId\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\",\\n    \\\"eventsWebHook\\\": \\\"https://api.yourbusiness.com/webhook/terminal-events\\\",\\n    \\\"metadata\\\": {\\n      \\\"customerEmail\\\": \\\"customer@example.com\\\",\\n      \\\"device\\\": \\\"SUNMI-T2\\\",\\n      \\\"reference\\\": \\\"ABC12345\\\"\\n    }\\n  }\\n}\\n\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Field\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Presence\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"event_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Unique identifier of the event. \", mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Use it to discard duplicates\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"previous_status\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The previous state. Empty string on the first event\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"occurred_at\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Date and time in UTC, ISO 8601 with milliseconds\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"status\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Current state, one of the seven above\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"merchant_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Kushki merchant identifier\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"client_transaction_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The one you sent in the request. \", mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Use it to correlate\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"terminal\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"serialNumber\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"model\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"wifiMac\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"room\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"operation\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Always\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A copy of the operation that produced the event\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"interaction_attempt\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Conditional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"From \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\"), \" onward. Counts how many times the card was operated\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"reading_type\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Conditional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"From \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\"), \" onward: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CHIP\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CONTACTLESS\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"MAGNETIC_STRIPE\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"failure_reason\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Conditional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Only on \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_REJECTED\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"DECLINED\"), \". Contains \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"type\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"code\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"message\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"operation.transactionReference\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Conditional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"On capture, re-authorization, post-tip and void\")))), mdx(Aside, {\n    title: \"The mixed casing is intentional\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"Top-level fields use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"snake_case\"), \". Everything inside \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"terminal\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"operation\"), \" uses \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"camelCase\"), \": \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"serialNumber\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"subtotalIva0\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"eventsWebHook\"), \".\"), mdx(\"p\", null, \"This mirrors the terminal\\u2019s internal representation. Deserialize the event exactly as it arrives and do not normalize the names.\")), mdx(Aside, {\n    title: \"The event carries no card data\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"The transaction webhook transports no PAN, no cardholder name and no card brand. If you need that data, take it from a sync operation\\u2019s response or from the transaction search endpoint.\")), mdx(Aside, {\n    title: \"Event amounts arrive as decimals\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"operation.amount\"), \" object returns amounts with decimals (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"12000.0\"), \"), while requests carry them as integers. Do not reuse an amount from an event to build a new request. Read \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/card-present-payments/kushki-one/formato-de-montos-kushki-one\"\n  }, \"Amount format in Kushki ONE\"), \".\")), mdx(\"h2\", {\n    \"id\": \"delivery-and-retries\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#delivery-and-retries\",\n    \"aria-label\": \"delivery and retries permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Delivery and retries\"), mdx(\"p\", null, \"Your endpoint must confirm receipt with any \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"2xx\"), \" code. Any other response is evaluated against this policy:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Outcome\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Behavior\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"2xx\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Delivered successfully. No retries\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"em\", {\n    parentName: \"td\"\n  }, \"Timeout\"), \", closed connection or DNS failure\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Retries\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"408\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"429\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"500\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"502\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"503\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"504\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Retries\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"400\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"401\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"403\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"404\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"409\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"422\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"No retry\"), \": treated as a permanent rejection\")))), mdx(\"p\", null, \"Retries use exponential backoff with jitter, on a 2-second base:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"wait = min(60s, base * 2^attempt) + random(0..base)\\n\")), mdx(\"p\", null, \"Delivery stops after \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"10 attempts or 15 minutes\"), \", whichever comes first.\"), mdx(Aside, {\n    title: \"Offline resilience\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"If the terminal loses connectivity, it queues events persistently and resends them once the network is back, preserving per-transaction order. A burst of delayed events after an outage is normal behavior, not a fault.\")), mdx(\"h2\", {\n    \"id\": \"build-your-consumer\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#build-your-consumer\",\n    \"aria-label\": \"build your consumer permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Build your consumer\"), mdx(\"p\", null, \"Because events are retried and resent from the queue, your endpoint \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"must be idempotent\"), \".\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Discard duplicates by \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"event_id\"), \".\"), \" Retries and resends repeat the same identifier. Store the ones you already processed.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Correlate by \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"client_transaction_id\"), \".\"), \" Every event of a transaction shares it. The \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"serialNumber\"), \" tells you which device produced it, but it does not work as a correlation key.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Detect gaps with \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"previous_status\"), \".\"), \" If it does not match the last state you recorded for that transaction, an event is missing or arrived out of order.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Answer fast and process later.\"), \" Return \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"2xx\"), \" right away and queue the payload in your internal system. A slow endpoint triggers retries, and retries cost you duplicates.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Treat \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"APPROVAL\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"DECLINED\"), \" as final.\"), \" No further events follow.\")), mdx(CodeTabs, {\n    group: \"backend\",\n    mdxType: \"CodeTabs\"\n  }, mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, \"app.post(\\\"/webhook/terminal-events\\\", async (req, res) => {\\n  const e = req.body;\\n  res.sendStatus(200);                          // acknowledge first\\n\\n  if (await alreadyProcessed(e.event_id)) return;   // idempotency\\n  await markProcessed(e.event_id);\\n\\n  await queue.publish({\\n    transaction: e.client_transaction_id,\\n    status: e.status,\\n    previous: e.previous_status,\\n    terminal: e.terminal.serialNumber,\\n    reason: e.failure_reason ?? null,\\n  });\\n});\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"@app.post(\\\"/webhook/terminal-events\\\")\\nasync def events(event: dict, response: Response):\\n    response.status_code = 200                       # acknowledge first\\n\\n    if await already_processed(event[\\\"event_id\\\"]):   # idempotency\\n        return\\n    await mark_processed(event[\\\"event_id\\\"])\\n\\n    await queue.publish({\\n        \\\"transaction\\\": event[\\\"client_transaction_id\\\"],\\n        \\\"status\\\": event[\\\"status\\\"],\\n        \\\"previous\\\": event[\\\"previous_status\\\"],\\n        \\\"terminal\\\": event[\\\"terminal\\\"][\\\"serialNumber\\\"],\\n        \\\"reason\\\": event.get(\\\"failure_reason\\\"),\\n    })\\n\"))), mdx(NextStep, {\n    type: \"recommended\",\n    side: \"left\",\n    link: \"/card-present-payments/kushki-one/payments\",\n    title: \"Accept payments with Kushki ONE\",\n    mdxType: \"NextStep\"\n  }, mdx(\"p\", null, \"Review every available payment flow and its sync variants.\")), mdx(NextStep, {\n    type: \"recommended\",\n    side: \"right\",\n    link: \"/card-present-payments/kushki-one/error-catalog-kushkione\",\n    title: \"Error catalog\",\n    mdxType: \"NextStep\"\n  }, mdx(\"p\", null, \"Interpret the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"failure_reason\"), \" object inside the transaction lifecycle.\")));\n}\n;\nMDXContent.isMDXComponent = true;","excerpt":"This product is in early access . Parameters, response structures and behaviors may change without prior notice. Do  not  use this version…","timeToRead":3,"tableOfContents":{"items":[{"url":"#requirements","title":"Requirements"},{"url":"#how-it-works","title":"How it works"},{"url":"#turn-on-the-events","title":"Turn on the events"},{"url":"#one-envelope-two-uses","title":"One envelope, two uses"},{"url":"#lifecycle-states","title":"Lifecycle states","items":[{"url":"#transitions","title":"Transitions"}]},{"url":"#event-structure","title":"Event structure"},{"url":"#delivery-and-retries","title":"Delivery and retries"},{"url":"#build-your-consumer","title":"Build your consumer"}]}}},"updatedAt":"August 05, 2026","tabTitle":null}]}},"pageContext":{"country":"cl","id":"cfce1244-133e-5712-84f7-4f5c29e63da4","locale":"en","localeDateFormat":"MMMM DD, YYYY"}},"staticQueryHashes":["1632712422","2408418099","63159454"]}