[{"data":1,"prerenderedAt":670},["ShallowReactive",2],{"navigation_docs":3,"-docs-api-reference":114,"-docs-api-reference-surround":665},[4,8,12,16,20,24,28,32,36,40,44,82,86,90,94,98,102,106,110],{"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},"Device token and challenges","\u002Fdocs\u002Fdevice-and-challenges","docs\u002F17.device-and-challenges",{"title":107,"path":108,"stem":109},"MCP server","\u002Fdocs\u002Fmcp-server","docs\u002F18.mcp-server",{"title":111,"path":112,"stem":113},"Changelog","\u002Fdocs\u002Fchangelog","docs\u002F99.changelog",{"id":115,"title":95,"body":116,"description":658,"extension":659,"links":660,"meta":661,"navigation":662,"path":96,"seo":663,"stem":97,"__hash__":664},"docs\u002Fdocs\u002F14.api-reference.md",{"type":117,"value":118,"toc":651},"minimark",[119,144,149,279,283,304,519,529,533,615,619,641,647],[120,121,122,123,127,128,132,133,137,138,143],"p",{},"The base URL is ",[124,125,126],"code",{},"https:\u002F\u002Fapi.openshield.dev",". Every endpoint except the last two of the table needs an ",[129,130,131],"a",{"href":14},"API key",". The fraud prevention API has ",[129,134,136],{"href":135},"#fraud-prevention-endpoints","its own routes",". The complete description, with every field, is the OpenAPI 3.1 document: ",[129,139,141],{"href":140},"\u002Fdocs\u002Fapi\u002Fopenapi.json",[124,142,140],{},".",[145,146,148],"h2",{"id":147},"endpoints","Endpoints",[150,151,152,165],"table",{},[153,154,155],"thead",{},[156,157,158,162],"tr",{},[159,160,161],"th",{},"Method and path",[159,163,164],{},"What it does",[166,167,168,186,199,212,225,242,252,269],"tbody",{},[156,169,170,176],{},[171,172,173],"td",{},[124,174,175],{},"POST \u002Fv1\u002Fimage",[171,177,178,179,182,183,143],{},"Checks an image sent as the raw body, or at a public ",[124,180,181],{},"url",". See ",[129,184,185],{"href":18},"images",[156,187,188,193],{},[171,189,190],{},[124,191,192],{},"POST \u002Fv1\u002Ftext",[171,194,195,196,143],{},"Checks a text sent as JSON. See ",[129,197,198],{"href":22},"texts",[156,200,201,206],{},[171,202,203],{},[124,204,205],{},"GET \u002Fv1\u002Fworkflows",[171,207,208,209,143],{},"Lists the names and current versions of the workflows the key may use. See ",[129,210,211],{"href":30},"workflows",[156,213,214,219],{},[171,215,216],{},[124,217,218],{},"POST \u002F1.0\u002Fcheck-workflow.json",[171,220,221,222,143],{},"Checks an image, SightEngine-compatible, as a multipart form. See ",[129,223,224],{"href":26},"migrating from SightEngine",[156,226,227,232],{},[171,228,229],{},[124,230,231],{},"GET \u002F1.0\u002Fcheck-workflow.json",[171,233,234,235,237,238,241],{},"Checks an image by its ",[124,236,181],{},", SightEngine-compatible, with the key in the ",[124,239,240],{},"api_secret"," query parameter.",[156,243,244,249],{},[171,245,246],{},[124,247,248],{},"POST \u002F1.0\u002Ftext\u002Fcheck-workflow.json",[171,250,251],{},"Checks a text, SightEngine-compatible, as a multipart form.",[156,253,254,259],{},[171,255,256],{},[124,257,258],{},"GET \u002Fhealth",[171,260,261,264,265,268],{},[124,262,263],{},"{\"status\": \"ok\"}"," when the service is ready, ",[124,266,267],{},"503"," otherwise. No key.",[156,270,271,276],{},[171,272,273],{},[124,274,275],{},"GET \u002Fopenapi.json",[171,277,278],{},"The OpenAPI document of the running version. No key.",[145,280,282],{"id":281},"fraud-prevention-endpoints","Fraud prevention endpoints",[120,284,285,286,289,290,293,294,297,298,300,301,143],{},"The fraud prevention API runs under ",[124,287,288],{},"\u002Ffraud\u002Fv1",", with the same base URL and keys that carry fraud access: ",[124,291,292],{},"fraud_events"," for the reporting routes, ",[124,295,296],{},"fraud"," for all of them. ",[129,299,99],{"href":100}," describes how to use it. The complete list, with its fields, is in the ",[129,302,303],{"href":140},"OpenAPI document",[150,305,306,317],{},[153,307,308],{},[156,309,310,312,314],{},[159,311,161],{},[159,313,164],{},[159,315,316],{},"Scope",[166,318,319,333,347,361,375,389,407,427,441,458,478,495],{},[156,320,321,326,329],{},[171,322,323],{},[124,324,325],{},"POST \u002Ffraud\u002Fv1\u002Fdecide",[171,327,328],{},"Decides on an event before you act on it.",[171,330,331],{},[124,332,292],{},[156,334,335,340,343],{},[171,336,337],{},[124,338,339],{},"POST \u002Ffraud\u002Fv1\u002Fevents",[171,341,342],{},"Reports an event after the fact.",[171,344,345],{},[124,346,292],{},[156,348,349,354,357],{},[171,350,351],{},[124,352,353],{},"POST \u002Ffraud\u002Fv1\u002Fevents\u002Fbatch",[171,355,356],{},"Reports up to 100 events at once.",[171,358,359],{},[124,360,292],{},[156,362,363,368,371],{},[171,364,365],{},[124,366,367],{},"POST \u002Ffraud\u002Fv1\u002Fcases\u002F{id}\u002Fappeal",[171,369,370],{},"Passes on an end user's appeal of a case.",[171,372,373],{},[124,374,292],{},[156,376,377,382,385],{},[171,378,379],{},[124,380,381],{},"GET \u002Ffraud\u002Fv1\u002Fstatements\u002F{id}",[171,383,384],{},"Reads the statement of reasons of a decision.",[171,386,387],{},[124,388,292],{},[156,390,391,400,403],{},[171,392,393,396,397],{},[124,394,395],{},"GET \u002Ffraud\u002Fv1\u002Factors\u002F{id}",", ",[124,398,399],{},"\u002Fcluster",[171,401,402],{},"Reads an account, and the accounts linked to it.",[171,404,405],{},[124,406,296],{},[156,408,409,420,423],{},[171,410,411,396,414,396,417],{},[124,412,413],{},"POST \u002Ffraud\u002Fv1\u002Factors\u002F{id}\u002Flabel",[124,415,416],{},"\u002Fstatus",[124,418,419],{},"\u002Fsnoozes",[171,421,422],{},"Labels an account, sets its status, silences a rule for it.",[171,424,425],{},[124,426,296],{},[156,428,429,434,437],{},[171,430,431],{},[124,432,433],{},"DELETE \u002Ffraud\u002Fv1\u002Factors\u002F{id}\u002Fsnoozes\u002F{rule}",[171,435,436],{},"Lifts a snooze.",[171,438,439],{},[124,440,296],{},[156,442,443,451,454],{},[171,444,445,396,448],{},[124,446,447],{},"GET \u002Ffraud\u002Fv1\u002Ftenants\u002F{id}",[124,449,450],{},"POST ...\u002Fstatus",[171,452,453],{},"Reads a workspace of your own users, and sets its status.",[171,455,456],{},[124,457,296],{},[156,459,460,471,474],{},[171,461,462,396,465,396,468],{},[124,463,464],{},"GET \u002Ffraud\u002Fv1\u002Fcases",[124,466,467],{},"GET \u002Ffraud\u002Fv1\u002Fcases\u002F{id}",[124,469,470],{},"POST \u002Ffraud\u002Fv1\u002Fcases\u002F{id}\u002Fresolve",[171,472,473],{},"Lists, reads and resolves cases.",[171,475,476],{},[124,477,296],{},[156,479,480,488,491],{},[171,481,482,396,485],{},[124,483,484],{},"GET \u002Ffraud\u002Fv1\u002Fsubjects\u002F{id}\u002Fexport",[124,486,487],{},"DELETE \u002Ffraud\u002Fv1\u002Fsubjects\u002F{id}",[171,489,490],{},"Exports, or erases, what is kept about a person.",[171,492,493],{},[124,494,296],{},[156,496,497,512,515],{},[171,498,499,396,502,396,505,508,509],{},[124,500,501],{},"GET \u002Ffraud\u002Fv1\u002Flists",[124,503,504],{},"GET",[124,506,507],{},"POST"," and ",[124,510,511],{},"DELETE \u002Ffraud\u002Fv1\u002Flists\u002F{name}\u002Fitems",[171,513,514],{},"Lists your lists and fills them.",[171,516,517],{},[124,518,296],{},[120,520,521,522,525,526,143],{},"Its errors are in ",[129,523,524],{"href":34},"responses and errors",", its prices in ",[129,527,528],{"href":38},"limits and quotas",[145,530,532],{"id":531},"common-to-every-endpoint","Common to every endpoint",[534,535,536,555,568,579,607],"ul",{},[537,538,539,543,544,547,548,551,552,554],"li",{},[540,541,542],"strong",{},"Authentication",": ",[124,545,546],{},"Authorization: Bearer \u003Ckey>"," or ",[124,549,550],{},"X-Api-Key: \u003Ckey>",". The compatible endpoints take the key in the ",[124,553,240],{}," form field.",[537,556,557,560,561,564,565,143],{},[540,558,559],{},"Server-side only",": a request that carries an ",[124,562,563],{},"Origin"," header is refused with ",[124,566,567],{},"403 forbidden",[537,569,570,543,573,182,576,578],{},[540,571,572],{},"Errors",[124,574,575],{},"{\"status\": \"failure\", \"error\": {\"type\", \"code\", \"message\"}}",[129,577,524],{"href":34}," for every type.",[537,580,581,543,584,396,587,396,590,396,593,396,596,396,599,602,603,606],{},[540,582,583],{},"Headers",[124,585,586],{},"X-Request-Id",[124,588,589],{},"RateLimit-Limit",[124,591,592],{},"RateLimit-Remaining",[124,594,595],{},"RateLimit-Reset",[124,597,598],{},"X-Quota-Used",[124,600,601],{},"X-Quota-Limit",", and ",[124,604,605],{},"Retry-After"," when you must wait.",[537,608,609,612,613,143],{},[540,610,611],{},"Limits",": see ",[129,614,528],{"href":38},[145,616,618],{"id":617},"the-openapi-document","The OpenAPI document",[620,621,626],"pre",{"className":622,"code":623,"language":624,"meta":625,"style":625},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl https:\u002F\u002Fapi.openshield.dev\u002Fopenapi.json\n","bash","",[124,627,628],{"__ignoreMap":625},[629,630,633,637],"span",{"class":631,"line":632},"line",1,[629,634,636],{"class":635},"sBMFI","curl",[629,638,640],{"class":639},"sfazB"," https:\u002F\u002Fapi.openshield.dev\u002Fopenapi.json\n",[120,642,643,644,646],{},"Use it to generate a client, to import the API into a tool such as Postman or Insomnia, or to give an AI agent the exact contract. The copy under ",[124,645,140],{}," is published with each release of these docs.",[648,649,650],"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 .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":625,"searchDepth":652,"depth":652,"links":653},2,[654,655,656,657],{"id":147,"depth":652,"text":148},{"id":281,"depth":652,"text":282},{"id":531,"depth":652,"text":532},{"id":617,"depth":652,"text":618},"Every endpoint of the moderation API in one table, the fraud prevention routes, and the OpenAPI document.","md",null,{},true,{"title":95,"description":658},"rJ1GYD-j71SSF_uXs0KM19GxPqqb61f8lFhdBa1snLc",[666,668],{"title":91,"path":92,"stem":93,"description":667,"children":-1},"What openshield stores and what it never stores, where, and for how long.",{"title":99,"path":100,"stem":101,"description":669,"children":-1},"Score sign-ups, logins and payments with \u002Ffraud\u002Fv1\u002Fdecide, report events with \u002Ffraud\u002Fv1\u002Fevents, and get a webhook when a case opens.",1792938462691]