[{"data":1,"prerenderedAt":413},["ShallowReactive",2],{"navigation_docs":3,"-api-idempotency":183,"-api-idempotency-surround":408},[4,25,60,81,153,168],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"path":22,"stem":23,"icon":24},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-server",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Concepts","\u002Fconcepts","2.concepts",[30,35,40,45,50,55],{"title":31,"path":32,"stem":33,"icon":34},"How AML works","\u002Fconcepts\u002Fhow-aml-works","2.concepts\u002F1.how-aml-works","i-lucide-book-open",{"title":36,"path":37,"stem":38,"icon":39},"Events and decisions","\u002Fconcepts\u002Fevents-and-decisions","2.concepts\u002F2.events-and-decisions","i-lucide-activity",{"title":41,"path":42,"stem":43,"icon":44},"Rules","\u002Fconcepts\u002Frules","2.concepts\u002F3.rules","i-lucide-scale",{"title":46,"path":47,"stem":48,"icon":49},"Alerts, cases and reporting","\u002Fconcepts\u002Falerts-cases-reporting","2.concepts\u002F4.alerts-cases-reporting","i-lucide-folder-search",{"title":51,"path":52,"stem":53,"icon":54},"Entities and the graph","\u002Fconcepts\u002Fentities-and-graph","2.concepts\u002F5.entities-and-graph","i-lucide-network",{"title":56,"path":57,"stem":58,"icon":59},"Audit log","\u002Fconcepts\u002Faudit-log","2.concepts\u002F6.audit-log","i-lucide-scroll-text",{"title":61,"icon":6,"path":62,"stem":63,"children":64,"page":6},"Guides","\u002Fguides","3.guides",[65,70,75],{"title":66,"path":67,"stem":68,"icon":69},"Guides by role","\u002Fguides\u002Fby-role","3.guides\u002F1.by-role","i-lucide-users",{"title":71,"path":72,"stem":73,"icon":74},"Integration plan","\u002Fguides\u002Fintegration-plan","3.guides\u002F2.integration-plan","i-lucide-list-checks",{"title":76,"path":77,"stem":78,"icon":79,"badge":80},"Connecting a rail","\u002Fguides\u002Fconnecting-a-rail","3.guides\u002F3.connecting-a-rail","i-lucide-plug","Coming soon",{"title":82,"icon":6,"path":83,"stem":84,"children":85,"page":6},"API reference","\u002Fapi","4.api",[86,91,96,101,106,111,116,121,126,129,134,139,144,149],{"title":87,"path":88,"stem":89,"icon":90},"Authentication","\u002Fapi\u002Fauthentication","4.api\u002F01.authentication","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"Errors","\u002Fapi\u002Ferrors","4.api\u002F02.errors","i-lucide-circle-alert",{"title":97,"path":98,"stem":99,"icon":100},"Idempotency","\u002Fapi\u002Fidempotency","4.api\u002F03.idempotency","i-lucide-repeat",{"title":102,"path":103,"stem":104,"icon":105},"Health","\u002Fapi\u002Fhealth","4.api\u002F04.health","i-lucide-heart-pulse",{"title":107,"path":108,"stem":109,"icon":110},"Entities","\u002Fapi\u002Fentities","4.api\u002F05.entities","i-lucide-user-round",{"title":112,"path":113,"stem":114,"icon":115},"Events","\u002Fapi\u002Fevents","4.api\u002F06.events","i-lucide-send",{"title":117,"path":118,"stem":119,"icon":120},"Decisions","\u002Fapi\u002Fdecisions","4.api\u002F07.decisions","i-lucide-gavel",{"title":122,"path":123,"stem":124,"icon":125},"Alerts","\u002Fapi\u002Falerts","4.api\u002F08.alerts","i-lucide-bell",{"title":41,"path":127,"stem":128,"icon":44},"\u002Fapi\u002Frules","4.api\u002F09.rules",{"title":130,"path":131,"stem":132,"icon":133},"Screening","\u002Fapi\u002Fscreening","4.api\u002F10.screening","i-lucide-user-search",{"title":135,"path":136,"stem":137,"icon":138},"API keys","\u002Fapi\u002Fapi-keys","4.api\u002F11.api-keys","i-lucide-key",{"title":140,"path":141,"stem":142,"icon":143},"Overview","\u002Fapi\u002Foverview","4.api\u002F12.overview","i-lucide-layout-dashboard",{"title":145,"path":146,"stem":147,"icon":148,"badge":80},"Webhooks","\u002Fapi\u002Fwebhooks","4.api\u002F13.webhooks","i-lucide-webhook",{"title":80,"path":150,"stem":151,"icon":152,"badge":80},"\u002Fapi\u002Fcoming-soon","4.api\u002F14.coming-soon","i-lucide-clock",{"title":154,"icon":6,"path":155,"stem":156,"children":157,"page":6},"Security and licensing","\u002Fsecurity","5.security",[158,163],{"title":159,"path":160,"stem":161,"icon":162},"Data flows","\u002Fsecurity\u002Fdata-flows","5.security\u002F1.data-flows","i-lucide-shield-check",{"title":164,"path":165,"stem":166,"icon":167,"badge":80},"Licensing and metering","\u002Fsecurity\u002Flicensing","5.security\u002F2.licensing","i-lucide-file-badge",{"title":169,"icon":6,"path":170,"stem":171,"children":172,"page":6},"Reference","\u002Freference","6.reference",[173,178],{"title":174,"path":175,"stem":176,"icon":177},"Glossary","\u002Freference\u002Fglossary","6.reference\u002F1.glossary","i-lucide-book-a",{"title":179,"path":180,"stem":181,"icon":182},"FAQ","\u002Freference\u002Ffaq","6.reference\u002F2.faq","i-lucide-circle-help",{"id":184,"title":97,"body":185,"description":401,"extension":402,"links":403,"meta":404,"navigation":405,"path":98,"seo":406,"stem":99,"__hash__":407},"docs\u002F4.api\u002F03.idempotency.md",{"type":186,"value":187,"toc":396},"minimark",[188,197,202,230,234,237,251,344,348,352,371,385,392],[189,190,191,192,196],"p",{},"Payments get retried. Networks drop, timeouts fire, workers restart. Sentinel makes retries safe with an ",[193,194,195],"strong",{},"idempotency key"," on every event.",[198,199,201],"h2",{"id":200},"how-it-works","How it works",[203,204,205,217,220,223],"ul",{},[206,207,208,212,213,216],"li",{},[209,210,211],"code",{},"idempotency_key"," is required on every ",[209,214,215],{},"POST \u002Fv1\u002Fevents",".",[206,218,219],{},"It's unique within your organisation.",[206,221,222],{},"The first request with a given key stores the event and, in sync mode, scores it.",[206,224,225,226,229],{},"Any later request with the same key returns the ",[193,227,228],{},"original"," event and decision. Nothing is stored or scored twice.",[198,231,233],{"id":232},"choosing-a-key","Choosing a key",[189,235,236],{},"Use the ID your own system already gives the transaction, such as your payment or ledger transaction ID. It must be:",[203,238,239,245],{},[206,240,241,244],{},[193,242,243],{},"Stable."," The same transaction always gets the same key, including on retries from a different process.",[206,246,247,250],{},[193,248,249],{},"Unique."," Two different transactions never share a key.",[252,253,259],"pre",{"className":254,"code":255,"filename":256,"language":257,"meta":258,"style":258},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"transfer.outbound\",\n  \"idempotency_key\": \"txn_8f2a91\",\n  \"occurred_at\": \"2026-10-15T11:02:41Z\"\n}\n","Event","json","",[209,260,261,270,298,318,338],{"__ignoreMap":258},[262,263,266],"span",{"class":264,"line":265},"line",1,[262,267,269],{"class":268},"sMK4o","{\n",[262,271,273,276,280,283,286,289,293,295],{"class":264,"line":272},2,[262,274,275],{"class":268},"  \"",[262,277,279],{"class":278},"spNyl","type",[262,281,282],{"class":268},"\"",[262,284,285],{"class":268},":",[262,287,288],{"class":268}," \"",[262,290,292],{"class":291},"sfazB","transfer.outbound",[262,294,282],{"class":268},[262,296,297],{"class":268},",\n",[262,299,301,303,305,307,309,311,314,316],{"class":264,"line":300},3,[262,302,275],{"class":268},[262,304,211],{"class":278},[262,306,282],{"class":268},[262,308,285],{"class":268},[262,310,288],{"class":268},[262,312,313],{"class":291},"txn_8f2a91",[262,315,282],{"class":268},[262,317,297],{"class":268},[262,319,321,323,326,328,330,332,335],{"class":264,"line":320},4,[262,322,275],{"class":268},[262,324,325],{"class":278},"occurred_at",[262,327,282],{"class":268},[262,329,285],{"class":268},[262,331,288],{"class":268},[262,333,334],{"class":291},"2026-10-15T11:02:41Z",[262,336,337],{"class":268},"\"\n",[262,339,341],{"class":264,"line":340},5,[262,342,343],{"class":268},"}\n",[345,346,347],"warning",{},"Don't generate a fresh random key on each attempt. A retry with a new key is a new event. The customer's transaction is stored twice and counts twice toward their velocity features.",[198,349,351],{"id":350},"retrying","Retrying",[189,353,354,355,358,359,362,363,366,367,370],{},"Retry on network errors, timeouts and ",[209,356,357],{},"5xx"," responses, with backoff, using the ",[193,360,361],{},"same"," key. Don't retry ",[209,364,365],{},"400"," or ",[209,368,369],{},"401","; the request won't succeed until you fix it.",[189,372,373,374,377,378,366,381,384],{},"A replay in sync mode returns the stored decision, including its ",[209,375,376],{},"alert_id"," if one was raised. If an earlier attempt stored the decision but failed before putting it on an alert, the replay does that, so every ",[209,379,380],{},"review",[209,382,383],{},"block"," decision ends up on exactly one alert.",[189,386,387,388,391],{},"An event first sent in async mode and replayed with ",[209,389,390],{},"mode=sync"," is scored on the replay, because async mode only stores it.",[393,394,395],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":258,"searchDepth":272,"depth":272,"links":397},[398,399,400],{"id":200,"depth":272,"text":201},{"id":232,"depth":272,"text":233},{"id":350,"depth":272,"text":351},"How idempotency keys make retries safe.","md",null,{},{"icon":100},{"title":97,"description":401},"a9Gcjp5zYWrhrMmxzHUrSfwFnPV0m4cWuO2qytY046M",[409,411],{"title":92,"path":93,"stem":94,"description":410,"icon":95,"children":-1},"Status codes and the error body the API returns.",{"title":102,"path":103,"stem":104,"description":412,"icon":105,"children":-1},"GET \u002Fhealthz returns the service status and version.",1792169658428]