[{"data":1,"prerenderedAt":1265},["ShallowReactive",2],{"navigation_docs":3,"-docs-fraud-prevention":106,"-docs-fraud-prevention-surround":1260},[4,8,12,16,20,24,28,32,36,40,44,82,86,90,94,98,102],{"title":5,"path":6,"stem":7},"Overview","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11},"Quickstart","\u002Fdocs\u002Fquickstart","docs\u002F01.quickstart",{"title":13,"path":14,"stem":15},"Authentication and keys","\u002Fdocs\u002Fauthentication","docs\u002F02.authentication",{"title":17,"path":18,"stem":19},"Images","\u002Fdocs\u002Fimages","docs\u002F03.images",{"title":21,"path":22,"stem":23},"Texts","\u002Fdocs\u002Ftexts","docs\u002F04.texts",{"title":25,"path":26,"stem":27},"Migrating from SightEngine","\u002Fdocs\u002Fmigrating-from-sightengine","docs\u002F05.migrating-from-sightengine",{"title":29,"path":30,"stem":31},"Workflows","\u002Fdocs\u002Fworkflows","docs\u002F06.workflows",{"title":33,"path":34,"stem":35},"Responses and errors","\u002Fdocs\u002Fresponses-and-errors","docs\u002F07.responses-and-errors",{"title":37,"path":38,"stem":39},"Limits and quotas","\u002Fdocs\u002Flimits-and-quotas","docs\u002F08.limits-and-quotas",{"title":41,"path":42,"stem":43},"The journal and ref","\u002Fdocs\u002Fjournal-and-ref","docs\u002F09.journal-and-ref",{"title":45,"path":46,"stem":47,"children":48,"page":81},"Integration guides","\u002Fdocs\u002Fintegration-guides","docs\u002F10.integration-guides",[49,53,57,61,65,69,73,77],{"title":50,"path":51,"stem":52},"Node.js and TypeScript","\u002Fdocs\u002Fintegration-guides\u002Fnodejs","docs\u002F10.integration-guides\u002F1.nodejs",{"title":54,"path":55,"stem":56},"Python","\u002Fdocs\u002Fintegration-guides\u002Fpython","docs\u002F10.integration-guides\u002F2.python",{"title":58,"path":59,"stem":60},"PHP","\u002Fdocs\u002Fintegration-guides\u002Fphp","docs\u002F10.integration-guides\u002F3.php",{"title":62,"path":63,"stem":64},"Go","\u002Fdocs\u002Fintegration-guides\u002Fgo","docs\u002F10.integration-guides\u002F4.go",{"title":66,"path":67,"stem":68},"Supabase Edge Functions","\u002Fdocs\u002Fintegration-guides\u002Fsupabase-edge-functions","docs\u002F10.integration-guides\u002F5.supabase-edge-functions",{"title":70,"path":71,"stem":72},"Cloudflare Workers","\u002Fdocs\u002Fintegration-guides\u002Fcloudflare-workers","docs\u002F10.integration-guides\u002F6.cloudflare-workers",{"title":74,"path":75,"stem":76},"Nuxt and Next","\u002Fdocs\u002Fintegration-guides\u002Fnuxt-and-next","docs\u002F10.integration-guides\u002F7.nuxt-and-next",{"title":78,"path":79,"stem":80},"Moderate an AI agent","\u002Fdocs\u002Fintegration-guides\u002Fmoderate-ai-agents","docs\u002F10.integration-guides\u002F8.moderate-ai-agents",false,{"title":83,"path":84,"stem":85},"AI coding agents","\u002Fdocs\u002Fai-agents","docs\u002F11.ai-agents",{"title":87,"path":88,"stem":89},"Best practices","\u002Fdocs\u002Fbest-practices","docs\u002F12.best-practices",{"title":91,"path":92,"stem":93},"Privacy and data","\u002Fdocs\u002Fprivacy-and-data","docs\u002F13.privacy-and-data",{"title":95,"path":96,"stem":97},"API reference","\u002Fdocs\u002Fapi-reference","docs\u002F14.api-reference",{"title":99,"path":100,"stem":101},"Fraud prevention","\u002Fdocs\u002Ffraud-prevention","docs\u002F16.fraud-prevention",{"title":103,"path":104,"stem":105},"Changelog","\u002Fdocs\u002Fchangelog","docs\u002F99.changelog",{"id":107,"title":99,"body":108,"description":1252,"extension":1253,"links":1254,"meta":1255,"navigation":441,"path":100,"seo":1256,"stem":101,"__hash__":1259},"docs\u002Fdocs\u002F16.fraud-prevention.md",{"type":109,"value":110,"toc":1240},"minimark",[111,157,160,163,168,183,239,248,252,258,398,405,685,699,728,732,739,839,856,860,870,874,912,919,923,935,938,941,990,997,1001,1013,1081,1095,1099,1117,1121,1124,1236],[112,113,114,115,122,123,127,128,131,132,135,136,135,139,135,142,135,145,148,149,152,153,156],"p",{},"Stop fake accounts, card testing and abuse with one API. openshield runs ",[116,117,121],"a",{"href":118,"rel":119},"https:\u002F\u002Fgithub.com\u002Fregisandre\u002Fopenfraud-rs",[120],"nofollow","openfraud",", which is open source, for you under ",[124,125,126],"code",{},"\u002Ffraud\u002Fv1",". Call ",[124,129,130],{},"decide"," before a sign-up, a login or a payment, and get ",[124,133,134],{},"allow",", ",[124,137,138],{},"step_up",[124,140,141],{},"review",[124,143,144],{},"hold",[124,146,147],{},"block"," or ",[124,150,151],{},"quarantine"," with the reasons. Call ",[124,154,155],{},"events"," to report what happened.",[112,158,159],{},"It scores IP data (datacenter, VPN, Tor, ASN), disposable email domains, phone numbers, device and browser signals, velocity counters and linked accounts. Every rule shows its reasons, and new rules start in shadow before they act.",[112,161,162],{},"Your organization gets an instance of its own: its events, accounts and cases never mix with anyone else's. It runs on our server in Germany, and your events, decisions and cases are kept 90 days. The fraud API is in beta.",[164,165,167],"h2",{"id":166},"turn-it-on","Turn it on",[112,169,170,171,174,175,178,179,182],{},"An owner or an admin turns it on in the dashboard, under ",[172,173,99],"strong",{},". The instance starts in a few seconds. Then create an API key with fraud access (",[172,176,177],{},"API keys",", then ",[172,180,181],{},"Create","):",[184,185,186,202],"table",{},[187,188,189],"thead",{},[190,191,192,196,199],"tr",{},[193,194,195],"th",{},"Fraud access",[193,197,198],{},"Scope",[193,200,201],{},"What the key may call",[203,204,205,226],"tbody",{},[190,206,207,211,216],{},[208,209,210],"td",{},"Decide and report events only",[208,212,213],{},[124,214,215],{},"fraud_events",[208,217,218,135,220,135,222,225],{},[124,219,130],{},[124,221,155],{},[124,223,224],{},"events\u002Fbatch",", appeals and statements",[190,227,228,231,236],{},[208,229,230],{},"All of it",[208,232,233],{},[124,234,235],{},"fraud",[208,237,238],{},"every route below, cases, accounts, lists and erasure included",[112,240,241,242,244,245,247],{},"A backend that only reports sign-ups and payments needs no more than ",[124,243,215],{},". Keep ",[124,246,235],{}," keys for your back office.",[164,249,251],{"id":250},"decide-before-you-act","Decide before you act",[112,253,254,255,257],{},"Call ",[124,256,130],{}," before a sensitive action (a sign-up, a login, a payment, a message sent to many people) and act on its answer.",[259,260,265],"pre",{"className":261,"code":262,"language":263,"meta":264,"style":264},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST \"https:\u002F\u002Fapi.openshield.dev\u002Ffraud\u002Fv1\u002Fdecide\" \\\n  -H \"Authorization: Bearer $OPENSHIELD_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"account.created\",\n    \"actor_id\": \"u_123\",\n    \"email\": \"someone@example.com\",\n    \"ip\": \"203.0.113.50\",\n    \"user_agent\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit\u002F605.1.15 (KHTML, like Gecko) Version\u002F18.0 Safari\u002F605.1.15\",\n    \"language\": \"fr-BE,fr;q=0.9\",\n    \"country\": \"BE\",\n    \"device\": \"dev_8f2c41\"\n  }'\n","bash","",[124,266,267,297,315,329,341,347,353,359,365,371,377,383,389],{"__ignoreMap":264},[268,269,272,276,280,283,287,290,293],"span",{"class":270,"line":271},"line",1,[268,273,275],{"class":274},"sBMFI","curl",[268,277,279],{"class":278},"sfazB"," -X",[268,281,282],{"class":278}," POST",[268,284,286],{"class":285},"sMK4o"," \"",[268,288,289],{"class":278},"https:\u002F\u002Fapi.openshield.dev\u002Ffraud\u002Fv1\u002Fdecide",[268,291,292],{"class":285},"\"",[268,294,296],{"class":295},"sTEyZ"," \\\n",[268,298,300,303,305,308,311,313],{"class":270,"line":299},2,[268,301,302],{"class":278},"  -H",[268,304,286],{"class":285},[268,306,307],{"class":278},"Authorization: Bearer ",[268,309,310],{"class":295},"$OPENSHIELD_KEY",[268,312,292],{"class":285},[268,314,296],{"class":295},[268,316,318,320,322,325,327],{"class":270,"line":317},3,[268,319,302],{"class":278},[268,321,286],{"class":285},[268,323,324],{"class":278},"Content-Type: application\u002Fjson",[268,326,292],{"class":285},[268,328,296],{"class":295},[268,330,332,335,338],{"class":270,"line":331},4,[268,333,334],{"class":278},"  -d",[268,336,337],{"class":285}," '",[268,339,340],{"class":278},"{\n",[268,342,344],{"class":270,"line":343},5,[268,345,346],{"class":278},"    \"type\": \"account.created\",\n",[268,348,350],{"class":270,"line":349},6,[268,351,352],{"class":278},"    \"actor_id\": \"u_123\",\n",[268,354,356],{"class":270,"line":355},7,[268,357,358],{"class":278},"    \"email\": \"someone@example.com\",\n",[268,360,362],{"class":270,"line":361},8,[268,363,364],{"class":278},"    \"ip\": \"203.0.113.50\",\n",[268,366,368],{"class":270,"line":367},9,[268,369,370],{"class":278},"    \"user_agent\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit\u002F605.1.15 (KHTML, like Gecko) Version\u002F18.0 Safari\u002F605.1.15\",\n",[268,372,374],{"class":270,"line":373},10,[268,375,376],{"class":278},"    \"language\": \"fr-BE,fr;q=0.9\",\n",[268,378,380],{"class":270,"line":379},11,[268,381,382],{"class":278},"    \"country\": \"BE\",\n",[268,384,386],{"class":270,"line":385},12,[268,387,388],{"class":278},"    \"device\": \"dev_8f2c41\"\n",[268,390,392,395],{"class":270,"line":391},13,[268,393,394],{"class":278},"  }",[268,396,397],{"class":285},"'\n",[112,399,400,401,404],{},"openfraud's SDKs work as they are: point them at ",[124,402,403],{},"https:\u002F\u002Fapi.openshield.dev\u002Ffraud",".",[259,406,410],{"className":407,"code":408,"language":409,"meta":264,"style":264},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Client } from \"openfraud\"\n\nconst fraud = new Client({ baseUrl: \"https:\u002F\u002Fapi.openshield.dev\u002Ffraud\", apiKey: process.env.OPENSHIELD_KEY, timeoutMs: 800 })\n\nconst d = await fraud.decide({ type: \"account.created\", actor_id: user.id, email, ip, user_agent, language, country, device })\nif (d.decision === \"block\" || d.decision === \"quarantine\") return refuse()\nif (d.decision === \"step_up\") return askForProof()\n","js",[124,411,412,437,443,517,521,606,658],{"__ignoreMap":264},[268,413,414,418,421,424,427,430,432,434],{"class":270,"line":271},[268,415,417],{"class":416},"s7zQu","import",[268,419,420],{"class":285}," {",[268,422,423],{"class":295}," Client",[268,425,426],{"class":285}," }",[268,428,429],{"class":416}," from",[268,431,286],{"class":285},[268,433,121],{"class":278},[268,435,436],{"class":285},"\"\n",[268,438,439],{"class":270,"line":299},[268,440,442],{"emptyLinePlaceholder":441},true,"\n",[268,444,445,449,452,455,458,461,464,467,471,474,476,478,480,483,486,488,491,493,496,498,501,503,506,508,512,514],{"class":270,"line":317},[268,446,448],{"class":447},"spNyl","const",[268,450,451],{"class":295}," fraud ",[268,453,454],{"class":285},"=",[268,456,457],{"class":285}," new",[268,459,423],{"class":460},"s2Zo4",[268,462,463],{"class":295},"(",[268,465,466],{"class":285},"{",[268,468,470],{"class":469},"swJcz"," baseUrl",[268,472,473],{"class":285},":",[268,475,286],{"class":285},[268,477,403],{"class":278},[268,479,292],{"class":285},[268,481,482],{"class":285},",",[268,484,485],{"class":469}," apiKey",[268,487,473],{"class":285},[268,489,490],{"class":295}," process",[268,492,404],{"class":285},[268,494,495],{"class":295},"env",[268,497,404],{"class":285},[268,499,500],{"class":295},"OPENSHIELD_KEY",[268,502,482],{"class":285},[268,504,505],{"class":469}," timeoutMs",[268,507,473],{"class":285},[268,509,511],{"class":510},"sbssI"," 800",[268,513,426],{"class":285},[268,515,516],{"class":295},")\n",[268,518,519],{"class":270,"line":331},[268,520,442],{"emptyLinePlaceholder":441},[268,522,523,525,528,530,533,536,538,540,542,544,547,549,551,554,556,558,561,563,566,568,571,573,576,578,581,583,586,588,591,593,596,598,601,604],{"class":270,"line":343},[268,524,448],{"class":447},[268,526,527],{"class":295}," d ",[268,529,454],{"class":285},[268,531,532],{"class":416}," await",[268,534,535],{"class":295}," fraud",[268,537,404],{"class":285},[268,539,130],{"class":460},[268,541,463],{"class":295},[268,543,466],{"class":285},[268,545,546],{"class":469}," type",[268,548,473],{"class":285},[268,550,286],{"class":285},[268,552,553],{"class":278},"account.created",[268,555,292],{"class":285},[268,557,482],{"class":285},[268,559,560],{"class":469}," actor_id",[268,562,473],{"class":285},[268,564,565],{"class":295}," user",[268,567,404],{"class":285},[268,569,570],{"class":295},"id",[268,572,482],{"class":285},[268,574,575],{"class":295}," email",[268,577,482],{"class":285},[268,579,580],{"class":295}," ip",[268,582,482],{"class":285},[268,584,585],{"class":295}," user_agent",[268,587,482],{"class":285},[268,589,590],{"class":295}," language",[268,592,482],{"class":285},[268,594,595],{"class":295}," country",[268,597,482],{"class":285},[268,599,600],{"class":295}," device ",[268,602,603],{"class":285},"}",[268,605,516],{"class":295},[268,607,608,611,614,616,619,622,624,626,628,631,634,636,638,640,642,644,646,649,652,655],{"class":270,"line":349},[268,609,610],{"class":416},"if",[268,612,613],{"class":295}," (d",[268,615,404],{"class":285},[268,617,618],{"class":295},"decision ",[268,620,621],{"class":285},"===",[268,623,286],{"class":285},[268,625,147],{"class":278},[268,627,292],{"class":285},[268,629,630],{"class":285}," ||",[268,632,633],{"class":295}," d",[268,635,404],{"class":285},[268,637,618],{"class":295},[268,639,621],{"class":285},[268,641,286],{"class":285},[268,643,151],{"class":278},[268,645,292],{"class":285},[268,647,648],{"class":295},") ",[268,650,651],{"class":416},"return",[268,653,654],{"class":460}," refuse",[268,656,657],{"class":295},"()\n",[268,659,660,662,664,666,668,670,672,674,676,678,680,683],{"class":270,"line":355},[268,661,610],{"class":416},[268,663,613],{"class":295},[268,665,404],{"class":285},[268,667,618],{"class":295},[268,669,621],{"class":285},[268,671,286],{"class":285},[268,673,138],{"class":278},[268,675,292],{"class":285},[268,677,648],{"class":295},[268,679,651],{"class":416},[268,681,682],{"class":460}," askForProof",[268,684,657],{"class":295},[112,686,687,688,691,692,695,696,698],{},"The SDKs fail open: on a timeout, a ",[124,689,690],{},"429"," or a ",[124,693,694],{},"5xx"," they retry, then answer ",[124,697,134],{},". Give them at least 800 ms: a call goes through openshield's edge before it reaches your instance.",[112,700,701,702,705,706,135,708,135,710,135,712,135,714,148,716,718,719,722,723,727],{},"The answer has the ",[124,703,704],{},"decision"," (",[124,707,134],{},[124,709,138],{},[124,711,141],{},[124,713,144],{},[124,715,147],{},[124,717,151],{},"), the rules that fired and why, the ",[124,720,721],{},"actions"," to apply, and the case it opened, if any. openfraud's ",[116,724,95],{"href":725,"rel":726},"https:\u002F\u002Fgithub.com\u002Fregisandre\u002Fopenfraud-rs\u002Fblob\u002Fmain\u002Fdocs\u002Fapi.md",[120]," describes every field.",[164,729,731],{"id":730},"send-the-end-users-context-not-your-servers","Send the end user's context, not your server's",[112,733,734,735,738],{},"The gateway passes your request body to your instance untouched. It never fills these fields from its own request: that request comes from your backend, and its address, ",[124,736,737],{},"User-Agent"," and language describe your server.",[184,740,741,751],{},[187,742,743],{},[190,744,745,748],{},[193,746,747],{},"Field",[193,749,750],{},"What to send",[203,752,753,767,787,800,816],{},[190,754,755,760],{},[208,756,757],{},[124,758,759],{},"ip",[208,761,762,763,766],{},"The end user's address. Behind a proxy, the first ",[124,764,765],{},"X-Forwarded-For"," entry you trust.",[190,768,769,774],{},[208,770,771],{},[124,772,773],{},"user_agent",[208,775,776,777,779,780,135,783,786],{},"The browser's ",[124,778,737],{}," header. Your backend's own (",[124,781,782],{},"node",[124,784,785],{},"python-requests",") makes every event look scripted.",[190,788,789,794],{},[208,790,791],{},[124,792,793],{},"language",[208,795,776,796,799],{},[124,797,798],{},"Accept-Language"," header.",[190,801,802,807],{},[208,803,804],{},[124,805,806],{},"country",[208,808,809,810,135,813,404],{},"From your CDN: ",[124,811,812],{},"CF-IPCountry",[124,814,815],{},"CloudFront-Viewer-Country",[190,817,818,823],{},[208,819,820],{},[124,821,822],{},"device",[208,824,825,826,831,832,835,836,404],{},"The id from openfraud's ",[116,827,830],{"href":828,"rel":829},"https:\u002F\u002Fgithub.com\u002Fregisandre\u002Fopenfraud-rs\u002Ftree\u002Fmain\u002Fsdk\u002Fdevice",[120],"device script",", and ",[124,833,834],{},"attrs.webdriver"," from its ",[124,837,838],{},"automated()",[112,840,841,135,844,135,847,849,850,852,853,855],{},[124,842,843],{},"email",[124,845,846],{},"phone",[124,848,759],{}," and ",[124,851,822],{}," are replaced by keyed pseudonyms before any rule sees them, and the raw values are not stored. The ",[124,854,737],{}," is read for the browser, the system and the signs of automation, then dropped.",[164,857,859],{"id":858},"report-what-happened","Report what happened",[112,861,862,865,866,869],{},[124,863,864],{},"POST \u002Ffraud\u002Fv1\u002Fevents"," reports an event after the fact (a payment that went through, a refund, a dispute) without waiting for a decision. ",[124,867,868],{},"POST \u002Ffraud\u002Fv1\u002Fevents\u002Fbatch"," takes up to 100 at once. Rules learn from these: a card used by many accounts, a trial taken again and again.",[164,871,873],{"id":872},"prices","Prices",[184,875,876,886],{},[187,877,878],{},[190,879,880,883],{},[193,881,882],{},"Call",[193,884,885],{},"Price",[203,887,888,900],{},[190,889,890,897],{},[208,891,892,893,896],{},"Decision (",[124,894,895],{},"\u002Ffraud\u002Fv1\u002Fdecide",")",[208,898,899],{},"EUR 0.001",[190,901,902,909],{},[208,903,904,905,908],{},"Event (",[124,906,907],{},"\u002Ffraud\u002Fv1\u002Fevents",", each accepted event of a batch)",[208,910,911],{},"EUR 0.0002",[112,913,914,915,918],{},"They come from the same prepaid balance as the checks, the monthly free use included. A call that does not end in a ",[124,916,917],{},"2xx"," costs nothing. The other routes (cases, accounts, lists) are free.",[164,920,922],{"id":921},"what-your-instance-checks","What your instance checks",[112,924,925,926,929,930,934],{},"The core always runs: blocklists you fill, trust earned by paying, and account takeover signals. In the dashboard you add rule packs for the kind of abuse you see: free tiers and trials, cards and payments, messaging, marketplaces and payouts, APIs and compute, hosting and content. Every pack rule starts in shadow: it says what it would do, in ",[124,927,928],{},"shadow",", without doing it, until it is promoted to act. ",[116,931,933],{"href":932},"#when-rules-start-to-act","When rules start to act"," says how.",[112,936,937],{},"The network data (the operator and country of each address, and the lists of disposable email domains, Tor exits, data centres and VPNs) comes with your first top-up. openshield refreshes it once a day, and your instance downloads it from inside the node: it reaches nothing on the internet.",[164,939,933],{"id":940},"when-rules-start-to-act",[942,943,944,954,960,966,972,978,984],"ul",{},[945,946,947,950,951,953],"li",{},[172,948,949],{},"Day 1."," The core blocklists act from the first call. Every other rule starts in shadow: the answer lists what it would have done under ",[124,952,928],{},", and nothing is blocked because of it.",[945,955,956,959],{},[172,957,958],{},"Automatic promotion, on by default."," Every day after the first 30, openshield looks at each shadow rule that hit at least 20 accounts, and promotes it to act when it has proved reliable. Either you labelled the accounts it hit, with a precision of at least 95 % over at least 10 labelled accounts, or our decision model reviewed pseudonymized timelines of up to 10 accounts the rule hit and found at least 90 % of them fraudulent.",[945,961,962,965],{},[172,963,964],{},"What a promoted rule may do."," Whatever the rule is built for, a block included.",[945,967,968,971],{},[172,969,970],{},"Manual mode."," You can switch to manual promotion, so that a rule acts only when a person promotes it. Or you can keep automatic promotion but limit it to rules whose action is hold or review, so that a rule that blocks is promoted by a person only.",[945,973,974,977],{},[172,975,976],{},"You are told."," Every automatic promotion is emailed to you and recorded in the audit log.",[945,979,980,983],{},[172,981,982],{},"A brake."," A brake stops the acting rules when a spike of decisions shows up.",[945,985,986,989],{},[172,987,988],{},"Back to shadow."," A promoted rule whose labelled precision falls under 80 % goes back to shadow on its own.",[112,991,992,993,996],{},"Labelling the accounts you know to be fraud or legitimate (",[124,994,995],{},"POST \u002Ffraud\u002Fv1\u002Factors\u002F{id}\u002Flabel",") is what makes promotion reliable, and what demotes a rule that has gone wrong.",[164,998,1000],{"id":999},"webhooks","Webhooks",[112,1002,1003,1004,1006,1007,1012],{},"Set a webhook address in the dashboard. Every decision other than ",[124,1005,134],{},", and every change to a case, an account or a workspace, is posted to it, signed with the ",[116,1008,1011],{"href":1009,"rel":1010},"https:\u002F\u002Fwww.standardwebhooks.com",[120],"Standard Webhooks"," scheme under the secret the dashboard shows. Any Standard Webhooks library checks them, as does the SDK:",[259,1014,1016],{"className":407,"code":1015,"language":409,"meta":264,"style":264},"import { verifyWebhook } from \"openfraud\"\n\nconst event = await verifyWebhook(process.env.OPENSHIELD_FRAUD_WEBHOOK_SECRET, req.headers, rawBody)\n",[124,1017,1018,1037,1041],{"__ignoreMap":264},[268,1019,1020,1022,1024,1027,1029,1031,1033,1035],{"class":270,"line":271},[268,1021,417],{"class":416},[268,1023,420],{"class":285},[268,1025,1026],{"class":295}," verifyWebhook",[268,1028,426],{"class":285},[268,1030,429],{"class":416},[268,1032,286],{"class":285},[268,1034,121],{"class":278},[268,1036,436],{"class":285},[268,1038,1039],{"class":270,"line":299},[268,1040,442],{"emptyLinePlaceholder":441},[268,1042,1043,1045,1048,1050,1052,1054,1057,1059,1061,1063,1066,1068,1071,1073,1076,1078],{"class":270,"line":317},[268,1044,448],{"class":447},[268,1046,1047],{"class":295}," event ",[268,1049,454],{"class":285},[268,1051,532],{"class":416},[268,1053,1026],{"class":460},[268,1055,1056],{"class":295},"(process",[268,1058,404],{"class":285},[268,1060,495],{"class":295},[268,1062,404],{"class":285},[268,1064,1065],{"class":295},"OPENSHIELD_FRAUD_WEBHOOK_SECRET",[268,1067,482],{"class":285},[268,1069,1070],{"class":295}," req",[268,1072,404],{"class":285},[268,1074,1075],{"class":295},"headers",[268,1077,482],{"class":285},[268,1079,1080],{"class":295}," rawBody)\n",[112,1082,1083,1084,1086,1087,1090,1091,1094],{},"Answer with a ",[124,1085,917],{}," within 10 seconds. A webhook that is not delivered is sent again for about two days, under the same ",[124,1088,1089],{},"webhook-id","; a ",[124,1092,1093],{},"410"," stops it.",[164,1096,1098],{"id":1097},"a-paused-instance","A paused instance",[112,1100,1101,1102,1105,1106,1109,1110,1113,1114,1116],{},"A free organization's instance is paused after 30 days without a call: its data is kept. The next call wakes it and gets ",[124,1103,1104],{},"503"," ",[124,1107,1108],{},"fraud_waking"," with ",[124,1111,1112],{},"Retry-After: 5",", and the SDKs answer ",[124,1115,134],{}," meanwhile. An owner or an admin can also resume it from the dashboard.",[164,1118,1120],{"id":1119},"errors","Errors",[112,1122,1123],{},"These answers come from openshield; every other one is your instance's own, in openfraud's envelope.",[184,1125,1126,1139],{},[187,1127,1128],{},[190,1129,1130,1133,1136],{},[193,1131,1132],{},"Status",[193,1134,1135],{},"Code",[193,1137,1138],{},"When",[203,1140,1141,1156,1176,1191,1205,1220],{},[190,1142,1143,1148,1153],{},[208,1144,1145],{},[124,1146,1147],{},"401",[208,1149,1150],{},[124,1151,1152],{},"unauthorized",[208,1154,1155],{},"no key, or a wrong one",[190,1157,1158,1163,1168],{},[208,1159,1160],{},[124,1161,1162],{},"403",[208,1164,1165],{},[124,1166,1167],{},"forbidden",[208,1169,1170,1171,1173,1174],{},"the key has no fraud access, or only ",[124,1172,215],{}," for a route that needs ",[124,1175,235],{},[190,1177,1178,1183,1188],{},[208,1179,1180],{},[124,1181,1182],{},"404",[208,1184,1185],{},[124,1186,1187],{},"fraud_not_enabled",[208,1189,1190],{},"your organization has not turned fraud prevention on",[190,1192,1193,1197,1202],{},[208,1194,1195],{},[124,1196,690],{},[208,1198,1199],{},[124,1200,1201],{},"quota_exceeded",[208,1203,1204],{},"the balance is used up",[190,1206,1207,1212,1217],{},[208,1208,1209],{},[124,1210,1211],{},"502",[208,1213,1214],{},[124,1215,1216],{},"fraud_unavailable",[208,1218,1219],{},"your instance did not answer: retry in a few seconds",[190,1221,1222,1226,1230],{},[208,1223,1224],{},[124,1225,1104],{},[208,1227,1228],{},[124,1229,1108],{},[208,1231,1232,1233],{},"your instance was paused and is starting: retry after ",[124,1234,1235],{},"Retry-After",[1237,1238,1239],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":264,"searchDepth":299,"depth":299,"links":1241},[1242,1243,1244,1245,1246,1247,1248,1249,1250,1251],{"id":166,"depth":299,"text":167},{"id":250,"depth":299,"text":251},{"id":730,"depth":299,"text":731},{"id":858,"depth":299,"text":859},{"id":872,"depth":299,"text":873},{"id":921,"depth":299,"text":922},{"id":940,"depth":299,"text":933},{"id":999,"depth":299,"text":1000},{"id":1097,"depth":299,"text":1098},{"id":1119,"depth":299,"text":1120},"Score sign-ups, logins and payments with \u002Ffraud\u002Fv1\u002Fdecide, report events with \u002Ffraud\u002Fv1\u002Fevents, and get a webhook when a case opens.","md",null,{},{"title":1257,"description":1258},"Fraud prevention API: \u002Ffraud\u002Fv1\u002Fdecide","Decide on a sign-up, a login or a payment before you act, with your own openfraud instance. Rules in shadow first, pseudonymized data.","l8jZIwSfDXIkTgJWknkpDqVSOYZ51qmAN2qhmFutFUM",[1261,1263],{"title":95,"path":96,"stem":97,"description":1262,"children":-1},"Every endpoint of the moderation API in one table, the fraud prevention routes, and the OpenAPI document.",{"title":103,"path":104,"stem":105,"description":1264,"children":-1},"New features and changes to the openshield API and dashboard, newest first.",1792509724746]