[{"data":1,"prerenderedAt":674},["ShallowReactive",2],{"navigation_docs":3,"-docs-api-reference":114,"-docs-api-reference-surround":669},[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":662,"extension":663,"links":664,"meta":665,"navigation":666,"path":96,"seo":667,"stem":97,"__hash__":668},"docs\u002Fdocs\u002F14.api-reference.md",{"type":117,"value":118,"toc":655},"minimark",[119,144,149,283,287,308,523,533,537,619,623,645,651],[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,246,256,273],"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,242,245],{},"Checks an image by its ",[124,236,181],{},", SightEngine-compatible, with the key in the ",[124,239,240],{},"Authorization"," or ",[124,243,244],{},"X-Api-Key"," header.",[156,247,248,253],{},[171,249,250],{},[124,251,252],{},"POST \u002F1.0\u002Ftext\u002Fcheck-workflow.json",[171,254,255],{},"Checks a text, SightEngine-compatible, as a multipart form.",[156,257,258,263],{},[171,259,260],{},[124,261,262],{},"GET \u002Fhealth",[171,264,265,268,269,272],{},[124,266,267],{},"{\"status\": \"ok\"}"," when the service is ready, ",[124,270,271],{},"503"," otherwise. No key.",[156,274,275,280],{},[171,276,277],{},[124,278,279],{},"GET \u002Fopenapi.json",[171,281,282],{},"The OpenAPI document of the running version. No key.",[145,284,286],{"id":285},"fraud-prevention-endpoints","Fraud prevention endpoints",[120,288,289,290,293,294,297,298,301,302,304,305,143],{},"The fraud prevention API runs under ",[124,291,292],{},"\u002Ffraud\u002Fv1",", with the same base URL and keys that carry fraud access: ",[124,295,296],{},"fraud_events"," for the reporting routes, ",[124,299,300],{},"fraud"," for all of them. ",[129,303,99],{"href":100}," describes how to use it. The complete list, with its fields, is in the ",[129,306,307],{"href":140},"OpenAPI document",[150,309,310,321],{},[153,311,312],{},[156,313,314,316,318],{},[159,315,161],{},[159,317,164],{},[159,319,320],{},"Scope",[166,322,323,337,351,365,379,393,411,431,445,462,482,499],{},[156,324,325,330,333],{},[171,326,327],{},[124,328,329],{},"POST \u002Ffraud\u002Fv1\u002Fdecide",[171,331,332],{},"Decides on an event before you act on it.",[171,334,335],{},[124,336,296],{},[156,338,339,344,347],{},[171,340,341],{},[124,342,343],{},"POST \u002Ffraud\u002Fv1\u002Fevents",[171,345,346],{},"Reports an event after the fact.",[171,348,349],{},[124,350,296],{},[156,352,353,358,361],{},[171,354,355],{},[124,356,357],{},"POST \u002Ffraud\u002Fv1\u002Fevents\u002Fbatch",[171,359,360],{},"Reports up to 100 events at once.",[171,362,363],{},[124,364,296],{},[156,366,367,372,375],{},[171,368,369],{},[124,370,371],{},"POST \u002Ffraud\u002Fv1\u002Fcases\u002F{id}\u002Fappeal",[171,373,374],{},"Passes on an end user's appeal of a case.",[171,376,377],{},[124,378,296],{},[156,380,381,386,389],{},[171,382,383],{},[124,384,385],{},"GET \u002Ffraud\u002Fv1\u002Fstatements\u002F{id}",[171,387,388],{},"Reads the statement of reasons of a decision.",[171,390,391],{},[124,392,296],{},[156,394,395,404,407],{},[171,396,397,400,401],{},[124,398,399],{},"GET \u002Ffraud\u002Fv1\u002Factors\u002F{id}",", ",[124,402,403],{},"\u002Fcluster",[171,405,406],{},"Reads an account, and the accounts linked to it.",[171,408,409],{},[124,410,300],{},[156,412,413,424,427],{},[171,414,415,400,418,400,421],{},[124,416,417],{},"POST \u002Ffraud\u002Fv1\u002Factors\u002F{id}\u002Flabel",[124,419,420],{},"\u002Fstatus",[124,422,423],{},"\u002Fsnoozes",[171,425,426],{},"Labels an account, sets its status, silences a rule for it.",[171,428,429],{},[124,430,300],{},[156,432,433,438,441],{},[171,434,435],{},[124,436,437],{},"DELETE \u002Ffraud\u002Fv1\u002Factors\u002F{id}\u002Fsnoozes\u002F{rule}",[171,439,440],{},"Lifts a snooze.",[171,442,443],{},[124,444,300],{},[156,446,447,455,458],{},[171,448,449,400,452],{},[124,450,451],{},"GET \u002Ffraud\u002Fv1\u002Ftenants\u002F{id}",[124,453,454],{},"POST ...\u002Fstatus",[171,456,457],{},"Reads a workspace of your own users, and sets its status.",[171,459,460],{},[124,461,300],{},[156,463,464,475,478],{},[171,465,466,400,469,400,472],{},[124,467,468],{},"GET \u002Ffraud\u002Fv1\u002Fcases",[124,470,471],{},"GET \u002Ffraud\u002Fv1\u002Fcases\u002F{id}",[124,473,474],{},"POST \u002Ffraud\u002Fv1\u002Fcases\u002F{id}\u002Fresolve",[171,476,477],{},"Lists, reads and resolves cases.",[171,479,480],{},[124,481,300],{},[156,483,484,492,495],{},[171,485,486,400,489],{},[124,487,488],{},"GET \u002Ffraud\u002Fv1\u002Fsubjects\u002F{id}\u002Fexport",[124,490,491],{},"DELETE \u002Ffraud\u002Fv1\u002Fsubjects\u002F{id}",[171,493,494],{},"Exports, or erases, what is kept about a person.",[171,496,497],{},[124,498,300],{},[156,500,501,516,519],{},[171,502,503,400,506,400,509,512,513],{},[124,504,505],{},"GET \u002Ffraud\u002Fv1\u002Flists",[124,507,508],{},"GET",[124,510,511],{},"POST"," and ",[124,514,515],{},"DELETE \u002Ffraud\u002Fv1\u002Flists\u002F{name}\u002Fitems",[171,517,518],{},"Lists your lists and fills them.",[171,520,521],{},[124,522,300],{},[120,524,525,526,529,530,143],{},"Its errors are in ",[129,527,528],{"href":34},"responses and errors",", its prices in ",[129,531,532],{"href":38},"limits and quotas",[145,534,536],{"id":535},"common-to-every-endpoint","Common to every endpoint",[538,539,540,559,572,583,611],"ul",{},[541,542,543,547,548,241,551,554,555,558],"li",{},[544,545,546],"strong",{},"Authentication",": ",[124,549,550],{},"Authorization: Bearer \u003Ckey>",[124,552,553],{},"X-Api-Key: \u003Ckey>",". The compatible endpoints take the key in the ",[124,556,557],{},"api_secret"," form field.",[541,560,561,564,565,568,569,143],{},[544,562,563],{},"Server-side only",": a request that carries an ",[124,566,567],{},"Origin"," header is refused with ",[124,570,571],{},"403 forbidden",[541,573,574,547,577,182,580,582],{},[544,575,576],{},"Errors",[124,578,579],{},"{\"status\": \"failure\", \"error\": {\"type\", \"code\", \"message\"}}",[129,581,528],{"href":34}," for every type.",[541,584,585,547,588,400,591,400,594,400,597,400,600,400,603,606,607,610],{},[544,586,587],{},"Headers",[124,589,590],{},"X-Request-Id",[124,592,593],{},"RateLimit-Limit",[124,595,596],{},"RateLimit-Remaining",[124,598,599],{},"RateLimit-Reset",[124,601,602],{},"X-Quota-Used",[124,604,605],{},"X-Quota-Limit",", and ",[124,608,609],{},"Retry-After"," when you must wait.",[541,612,613,616,617,143],{},[544,614,615],{},"Limits",": see ",[129,618,532],{"href":38},[145,620,622],{"id":621},"the-openapi-document","The OpenAPI document",[624,625,630],"pre",{"className":626,"code":627,"language":628,"meta":629,"style":629},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl https:\u002F\u002Fapi.openshield.dev\u002Fopenapi.json\n","bash","",[124,631,632],{"__ignoreMap":629},[633,634,637,641],"span",{"class":635,"line":636},"line",1,[633,638,640],{"class":639},"sBMFI","curl",[633,642,644],{"class":643},"sfazB"," https:\u002F\u002Fapi.openshield.dev\u002Fopenapi.json\n",[120,646,647,648,650],{},"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,649,140],{}," is published with each release of these docs.",[652,653,654],"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":629,"searchDepth":656,"depth":656,"links":657},2,[658,659,660,661],{"id":147,"depth":656,"text":148},{"id":285,"depth":656,"text":286},{"id":535,"depth":656,"text":536},{"id":621,"depth":656,"text":622},"Every endpoint of the moderation API in one table, the fraud prevention routes, and the OpenAPI document.","md",null,{},true,{"title":95,"description":662},"ZID2I_CWmhGp6CL99qJXffjrOXyYLlHonKvBbP3ocG4",[670,672],{"title":91,"path":92,"stem":93,"description":671,"children":-1},"What openshield stores and what it never stores, where, and for how long.",{"title":99,"path":100,"stem":101,"description":673,"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.",1793698848165]