[{"data":1,"prerenderedAt":969},["ShallowReactive",2],{"navigation_docs":3,"-docs-integration-guides-go":114,"-docs-integration-guides-go-surround":964},[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":62,"body":116,"description":958,"extension":959,"links":960,"meta":961,"navigation":190,"path":63,"seo":962,"stem":64,"__hash__":963},"docs\u002Fdocs\u002F10.integration-guides\u002F4.go.md",{"type":117,"value":118,"toc":953},"minimark",[119,123,128,131,168,172,835,839,938,949],[120,121,122],"p",{},"This guide uses only the standard library.",[124,125,127],"h2",{"id":126},"set-the-key","Set the key",[120,129,130],{},"Put the key in the environment of your server, never in the code:",[132,133,138],"pre",{"className":134,"code":135,"language":136,"meta":137,"style":137},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export OPENSHIELD_API_KEY=\"om_live_...\"\n","bash","",[139,140,141],"code",{"__ignoreMap":137},[142,143,146,150,154,158,161,165],"span",{"class":144,"line":145},"line",1,[142,147,149],{"class":148},"spNyl","export",[142,151,153],{"class":152},"sTEyZ"," OPENSHIELD_API_KEY",[142,155,157],{"class":156},"sMK4o","=",[142,159,160],{"class":156},"\"",[142,162,164],{"class":163},"sfazB","om_live_...",[142,166,167],{"class":156},"\"\n",[124,169,171],{"id":170},"the-package","The package",[132,173,178],{"className":174,"code":175,"filename":176,"language":177,"meta":137,"style":137},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package moderation\n\nimport (\n    \"bytes\"\n    \"context\"\n    \"encoding\u002Fjson\"\n    \"fmt\"\n    \"io\"\n    \"net\u002Fhttp\"\n    \"net\u002Furl\"\n    \"os\"\n    \"time\"\n)\n\nconst base = \"https:\u002F\u002Fapi.openshield.dev\"\n\n\u002F\u002F Reason is a category that reached its threshold.\ntype Reason struct {\n    ID        string  `json:\"id\"`\n    Text      string  `json:\"text\"`\n    Message   string  `json:\"message\"`\n    Score     float64 `json:\"score\"`\n    Threshold float64 `json:\"threshold\"`\n}\n\n\u002F\u002F Decision is what a check answers.\ntype Decision struct {\n    Action        string \u002F\u002F \"accept\", \"review\" or \"reject\"\n    RejectReasons []Reason\n    ReviewReasons []Reason\n    RequestID     string\n}\n\n\u002F\u002F Error is an error answer of the API.\ntype Error struct {\n    Status     int\n    Type       string\n    Message    string\n    RetryAfter string\n}\n\nfunc (e *Error) Error() string {\n    return fmt.Sprintf(\"openshield: %s (%d): %s\", e.Type, e.Status, e.Message)\n}\n\nvar client = &http.Client{Timeout: 10 * time.Second}\n\nfunc send(ctx context.Context, path, contentType string, body io.Reader) (*Decision, error) {\n    request, err := http.NewRequestWithContext(ctx, http.MethodPost, base+path, body)\n    if err != nil {\n        return nil, err\n    }\n    request.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"OPENSHIELD_API_KEY\"))\n    if contentType != \"\" {\n        request.Header.Set(\"Content-Type\", contentType)\n    }\n\n    response, err := client.Do(request)\n    if err != nil {\n        return nil, err\n    }\n    defer response.Body.Close()\n    raw, err := io.ReadAll(response.Body)\n    if err != nil {\n        return nil, err\n    }\n\n    if response.StatusCode != http.StatusOK {\n        var failure struct {\n            Error struct{ Type, Message string } `json:\"error\"`\n        }\n        _ = json.Unmarshal(raw, &failure)\n        return nil, &Error{Status: response.StatusCode, Type: failure.Error.Type, Message: failure.Error.Message, RetryAfter: response.Header.Get(\"Retry-After\")}\n    }\n\n    var answer struct {\n        Summary struct {\n            Action       string   `json:\"action\"`\n            RejectReason []Reason `json:\"reject_reason\"`\n            ReviewReason []Reason `json:\"review_reason\"`\n        } `json:\"summary\"`\n        RequestID string `json:\"request_id\"`\n    }\n    if err := json.Unmarshal(raw, &answer); err != nil {\n        return nil, err\n    }\n    return &Decision{\n        Action:        answer.Summary.Action,\n        RejectReasons: answer.Summary.RejectReason,\n        ReviewReasons: answer.Summary.ReviewReason,\n        RequestID:     answer.RequestID,\n    }, nil\n}\n\n\u002F\u002F CheckText checks a text. ref is your own id for it, or empty.\nfunc CheckText(ctx context.Context, text, ref string) (*Decision, error) {\n    payload := map[string]any{\"text\": text}\n    if ref != \"\" {\n        payload[\"ref\"] = ref\n    }\n    encoded, err := json.Marshal(payload)\n    if err != nil {\n        return nil, err\n    }\n    return send(ctx, \"\u002Fv1\u002Ftext\", \"application\u002Fjson\", bytes.NewReader(encoded))\n}\n\n\u002F\u002F CheckImage checks an image sent as bytes. ref is your own id for it, or empty.\nfunc CheckImage(ctx context.Context, image []byte, ref string) (*Decision, error) {\n    path := \"\u002Fv1\u002Fimage\"\n    if ref != \"\" {\n        path += \"?ref=\" + url.QueryEscape(ref)\n    }\n    return send(ctx, path, \"\", bytes.NewReader(image))\n}\n","moderation\u002Fmoderation.go","go",[139,179,180,185,192,198,204,210,216,222,228,234,240,246,252,258,263,269,274,280,286,292,298,304,310,316,322,327,333,339,345,351,357,363,368,373,379,385,391,397,403,409,414,419,425,431,436,441,447,452,458,464,470,476,482,488,494,500,505,510,516,521,526,531,537,543,548,553,558,563,569,575,581,587,593,599,604,609,615,621,627,633,639,645,651,656,662,667,672,678,684,690,696,702,708,713,718,724,730,736,742,748,753,759,764,769,774,780,785,790,796,802,808,813,819,824,830],{"__ignoreMap":137},[142,181,182],{"class":144,"line":145},[142,183,184],{},"package moderation\n",[142,186,188],{"class":144,"line":187},2,[142,189,191],{"emptyLinePlaceholder":190},true,"\n",[142,193,195],{"class":144,"line":194},3,[142,196,197],{},"import (\n",[142,199,201],{"class":144,"line":200},4,[142,202,203],{},"    \"bytes\"\n",[142,205,207],{"class":144,"line":206},5,[142,208,209],{},"    \"context\"\n",[142,211,213],{"class":144,"line":212},6,[142,214,215],{},"    \"encoding\u002Fjson\"\n",[142,217,219],{"class":144,"line":218},7,[142,220,221],{},"    \"fmt\"\n",[142,223,225],{"class":144,"line":224},8,[142,226,227],{},"    \"io\"\n",[142,229,231],{"class":144,"line":230},9,[142,232,233],{},"    \"net\u002Fhttp\"\n",[142,235,237],{"class":144,"line":236},10,[142,238,239],{},"    \"net\u002Furl\"\n",[142,241,243],{"class":144,"line":242},11,[142,244,245],{},"    \"os\"\n",[142,247,249],{"class":144,"line":248},12,[142,250,251],{},"    \"time\"\n",[142,253,255],{"class":144,"line":254},13,[142,256,257],{},")\n",[142,259,261],{"class":144,"line":260},14,[142,262,191],{"emptyLinePlaceholder":190},[142,264,266],{"class":144,"line":265},15,[142,267,268],{},"const base = \"https:\u002F\u002Fapi.openshield.dev\"\n",[142,270,272],{"class":144,"line":271},16,[142,273,191],{"emptyLinePlaceholder":190},[142,275,277],{"class":144,"line":276},17,[142,278,279],{},"\u002F\u002F Reason is a category that reached its threshold.\n",[142,281,283],{"class":144,"line":282},18,[142,284,285],{},"type Reason struct {\n",[142,287,289],{"class":144,"line":288},19,[142,290,291],{},"    ID        string  `json:\"id\"`\n",[142,293,295],{"class":144,"line":294},20,[142,296,297],{},"    Text      string  `json:\"text\"`\n",[142,299,301],{"class":144,"line":300},21,[142,302,303],{},"    Message   string  `json:\"message\"`\n",[142,305,307],{"class":144,"line":306},22,[142,308,309],{},"    Score     float64 `json:\"score\"`\n",[142,311,313],{"class":144,"line":312},23,[142,314,315],{},"    Threshold float64 `json:\"threshold\"`\n",[142,317,319],{"class":144,"line":318},24,[142,320,321],{},"}\n",[142,323,325],{"class":144,"line":324},25,[142,326,191],{"emptyLinePlaceholder":190},[142,328,330],{"class":144,"line":329},26,[142,331,332],{},"\u002F\u002F Decision is what a check answers.\n",[142,334,336],{"class":144,"line":335},27,[142,337,338],{},"type Decision struct {\n",[142,340,342],{"class":144,"line":341},28,[142,343,344],{},"    Action        string \u002F\u002F \"accept\", \"review\" or \"reject\"\n",[142,346,348],{"class":144,"line":347},29,[142,349,350],{},"    RejectReasons []Reason\n",[142,352,354],{"class":144,"line":353},30,[142,355,356],{},"    ReviewReasons []Reason\n",[142,358,360],{"class":144,"line":359},31,[142,361,362],{},"    RequestID     string\n",[142,364,366],{"class":144,"line":365},32,[142,367,321],{},[142,369,371],{"class":144,"line":370},33,[142,372,191],{"emptyLinePlaceholder":190},[142,374,376],{"class":144,"line":375},34,[142,377,378],{},"\u002F\u002F Error is an error answer of the API.\n",[142,380,382],{"class":144,"line":381},35,[142,383,384],{},"type Error struct {\n",[142,386,388],{"class":144,"line":387},36,[142,389,390],{},"    Status     int\n",[142,392,394],{"class":144,"line":393},37,[142,395,396],{},"    Type       string\n",[142,398,400],{"class":144,"line":399},38,[142,401,402],{},"    Message    string\n",[142,404,406],{"class":144,"line":405},39,[142,407,408],{},"    RetryAfter string\n",[142,410,412],{"class":144,"line":411},40,[142,413,321],{},[142,415,417],{"class":144,"line":416},41,[142,418,191],{"emptyLinePlaceholder":190},[142,420,422],{"class":144,"line":421},42,[142,423,424],{},"func (e *Error) Error() string {\n",[142,426,428],{"class":144,"line":427},43,[142,429,430],{},"    return fmt.Sprintf(\"openshield: %s (%d): %s\", e.Type, e.Status, e.Message)\n",[142,432,434],{"class":144,"line":433},44,[142,435,321],{},[142,437,439],{"class":144,"line":438},45,[142,440,191],{"emptyLinePlaceholder":190},[142,442,444],{"class":144,"line":443},46,[142,445,446],{},"var client = &http.Client{Timeout: 10 * time.Second}\n",[142,448,450],{"class":144,"line":449},47,[142,451,191],{"emptyLinePlaceholder":190},[142,453,455],{"class":144,"line":454},48,[142,456,457],{},"func send(ctx context.Context, path, contentType string, body io.Reader) (*Decision, error) {\n",[142,459,461],{"class":144,"line":460},49,[142,462,463],{},"    request, err := http.NewRequestWithContext(ctx, http.MethodPost, base+path, body)\n",[142,465,467],{"class":144,"line":466},50,[142,468,469],{},"    if err != nil {\n",[142,471,473],{"class":144,"line":472},51,[142,474,475],{},"        return nil, err\n",[142,477,479],{"class":144,"line":478},52,[142,480,481],{},"    }\n",[142,483,485],{"class":144,"line":484},53,[142,486,487],{},"    request.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"OPENSHIELD_API_KEY\"))\n",[142,489,491],{"class":144,"line":490},54,[142,492,493],{},"    if contentType != \"\" {\n",[142,495,497],{"class":144,"line":496},55,[142,498,499],{},"        request.Header.Set(\"Content-Type\", contentType)\n",[142,501,503],{"class":144,"line":502},56,[142,504,481],{},[142,506,508],{"class":144,"line":507},57,[142,509,191],{"emptyLinePlaceholder":190},[142,511,513],{"class":144,"line":512},58,[142,514,515],{},"    response, err := client.Do(request)\n",[142,517,519],{"class":144,"line":518},59,[142,520,469],{},[142,522,524],{"class":144,"line":523},60,[142,525,475],{},[142,527,529],{"class":144,"line":528},61,[142,530,481],{},[142,532,534],{"class":144,"line":533},62,[142,535,536],{},"    defer response.Body.Close()\n",[142,538,540],{"class":144,"line":539},63,[142,541,542],{},"    raw, err := io.ReadAll(response.Body)\n",[142,544,546],{"class":144,"line":545},64,[142,547,469],{},[142,549,551],{"class":144,"line":550},65,[142,552,475],{},[142,554,556],{"class":144,"line":555},66,[142,557,481],{},[142,559,561],{"class":144,"line":560},67,[142,562,191],{"emptyLinePlaceholder":190},[142,564,566],{"class":144,"line":565},68,[142,567,568],{},"    if response.StatusCode != http.StatusOK {\n",[142,570,572],{"class":144,"line":571},69,[142,573,574],{},"        var failure struct {\n",[142,576,578],{"class":144,"line":577},70,[142,579,580],{},"            Error struct{ Type, Message string } `json:\"error\"`\n",[142,582,584],{"class":144,"line":583},71,[142,585,586],{},"        }\n",[142,588,590],{"class":144,"line":589},72,[142,591,592],{},"        _ = json.Unmarshal(raw, &failure)\n",[142,594,596],{"class":144,"line":595},73,[142,597,598],{},"        return nil, &Error{Status: response.StatusCode, Type: failure.Error.Type, Message: failure.Error.Message, RetryAfter: response.Header.Get(\"Retry-After\")}\n",[142,600,602],{"class":144,"line":601},74,[142,603,481],{},[142,605,607],{"class":144,"line":606},75,[142,608,191],{"emptyLinePlaceholder":190},[142,610,612],{"class":144,"line":611},76,[142,613,614],{},"    var answer struct {\n",[142,616,618],{"class":144,"line":617},77,[142,619,620],{},"        Summary struct {\n",[142,622,624],{"class":144,"line":623},78,[142,625,626],{},"            Action       string   `json:\"action\"`\n",[142,628,630],{"class":144,"line":629},79,[142,631,632],{},"            RejectReason []Reason `json:\"reject_reason\"`\n",[142,634,636],{"class":144,"line":635},80,[142,637,638],{},"            ReviewReason []Reason `json:\"review_reason\"`\n",[142,640,642],{"class":144,"line":641},81,[142,643,644],{},"        } `json:\"summary\"`\n",[142,646,648],{"class":144,"line":647},82,[142,649,650],{},"        RequestID string `json:\"request_id\"`\n",[142,652,654],{"class":144,"line":653},83,[142,655,481],{},[142,657,659],{"class":144,"line":658},84,[142,660,661],{},"    if err := json.Unmarshal(raw, &answer); err != nil {\n",[142,663,665],{"class":144,"line":664},85,[142,666,475],{},[142,668,670],{"class":144,"line":669},86,[142,671,481],{},[142,673,675],{"class":144,"line":674},87,[142,676,677],{},"    return &Decision{\n",[142,679,681],{"class":144,"line":680},88,[142,682,683],{},"        Action:        answer.Summary.Action,\n",[142,685,687],{"class":144,"line":686},89,[142,688,689],{},"        RejectReasons: answer.Summary.RejectReason,\n",[142,691,693],{"class":144,"line":692},90,[142,694,695],{},"        ReviewReasons: answer.Summary.ReviewReason,\n",[142,697,699],{"class":144,"line":698},91,[142,700,701],{},"        RequestID:     answer.RequestID,\n",[142,703,705],{"class":144,"line":704},92,[142,706,707],{},"    }, nil\n",[142,709,711],{"class":144,"line":710},93,[142,712,321],{},[142,714,716],{"class":144,"line":715},94,[142,717,191],{"emptyLinePlaceholder":190},[142,719,721],{"class":144,"line":720},95,[142,722,723],{},"\u002F\u002F CheckText checks a text. ref is your own id for it, or empty.\n",[142,725,727],{"class":144,"line":726},96,[142,728,729],{},"func CheckText(ctx context.Context, text, ref string) (*Decision, error) {\n",[142,731,733],{"class":144,"line":732},97,[142,734,735],{},"    payload := map[string]any{\"text\": text}\n",[142,737,739],{"class":144,"line":738},98,[142,740,741],{},"    if ref != \"\" {\n",[142,743,745],{"class":144,"line":744},99,[142,746,747],{},"        payload[\"ref\"] = ref\n",[142,749,751],{"class":144,"line":750},100,[142,752,481],{},[142,754,756],{"class":144,"line":755},101,[142,757,758],{},"    encoded, err := json.Marshal(payload)\n",[142,760,762],{"class":144,"line":761},102,[142,763,469],{},[142,765,767],{"class":144,"line":766},103,[142,768,475],{},[142,770,772],{"class":144,"line":771},104,[142,773,481],{},[142,775,777],{"class":144,"line":776},105,[142,778,779],{},"    return send(ctx, \"\u002Fv1\u002Ftext\", \"application\u002Fjson\", bytes.NewReader(encoded))\n",[142,781,783],{"class":144,"line":782},106,[142,784,321],{},[142,786,788],{"class":144,"line":787},107,[142,789,191],{"emptyLinePlaceholder":190},[142,791,793],{"class":144,"line":792},108,[142,794,795],{},"\u002F\u002F CheckImage checks an image sent as bytes. ref is your own id for it, or empty.\n",[142,797,799],{"class":144,"line":798},109,[142,800,801],{},"func CheckImage(ctx context.Context, image []byte, ref string) (*Decision, error) {\n",[142,803,805],{"class":144,"line":804},110,[142,806,807],{},"    path := \"\u002Fv1\u002Fimage\"\n",[142,809,811],{"class":144,"line":810},111,[142,812,741],{},[142,814,816],{"class":144,"line":815},112,[142,817,818],{},"        path += \"?ref=\" + url.QueryEscape(ref)\n",[142,820,822],{"class":144,"line":821},113,[142,823,481],{},[142,825,827],{"class":144,"line":826},114,[142,828,829],{},"    return send(ctx, path, \"\", bytes.NewReader(image))\n",[142,831,833],{"class":144,"line":832},115,[142,834,321],{},[124,836,838],{"id":837},"use-it-and-fail-closed","Use it, and fail closed",[132,840,842],{"className":174,"code":841,"language":177,"meta":137,"style":137},"func moderateComment(ctx context.Context, text, commentID string) string {\n    decision, err := moderation.CheckText(ctx, text, commentID)\n    if err != nil {\n        var failure *moderation.Error\n        \u002F\u002F The content cannot be accepted as it is: refuse it.\n        if errors.As(err, &failure) && (failure.Status == 400 || failure.Status == 413 || failure.Status == 415) {\n            return \"refuse\"\n        }\n        \u002F\u002F Anything else, a timeout included: keep it hidden until someone looks at it.\n        return \"hold\"\n    }\n    switch decision.Action {\n    case \"accept\":\n        return \"publish\"\n    case \"review\":\n        return \"hold\"\n    default:\n        return \"refuse\"\n    }\n}\n",[139,843,844,849,854,858,863,868,873,878,882,887,892,896,901,906,911,916,920,925,930,934],{"__ignoreMap":137},[142,845,846],{"class":144,"line":145},[142,847,848],{},"func moderateComment(ctx context.Context, text, commentID string) string {\n",[142,850,851],{"class":144,"line":187},[142,852,853],{},"    decision, err := moderation.CheckText(ctx, text, commentID)\n",[142,855,856],{"class":144,"line":194},[142,857,469],{},[142,859,860],{"class":144,"line":200},[142,861,862],{},"        var failure *moderation.Error\n",[142,864,865],{"class":144,"line":206},[142,866,867],{},"        \u002F\u002F The content cannot be accepted as it is: refuse it.\n",[142,869,870],{"class":144,"line":212},[142,871,872],{},"        if errors.As(err, &failure) && (failure.Status == 400 || failure.Status == 413 || failure.Status == 415) {\n",[142,874,875],{"class":144,"line":218},[142,876,877],{},"            return \"refuse\"\n",[142,879,880],{"class":144,"line":224},[142,881,586],{},[142,883,884],{"class":144,"line":230},[142,885,886],{},"        \u002F\u002F Anything else, a timeout included: keep it hidden until someone looks at it.\n",[142,888,889],{"class":144,"line":236},[142,890,891],{},"        return \"hold\"\n",[142,893,894],{"class":144,"line":242},[142,895,481],{},[142,897,898],{"class":144,"line":248},[142,899,900],{},"    switch decision.Action {\n",[142,902,903],{"class":144,"line":254},[142,904,905],{},"    case \"accept\":\n",[142,907,908],{"class":144,"line":260},[142,909,910],{},"        return \"publish\"\n",[142,912,913],{"class":144,"line":265},[142,914,915],{},"    case \"review\":\n",[142,917,918],{"class":144,"line":271},[142,919,891],{},[142,921,922],{"class":144,"line":276},[142,923,924],{},"    default:\n",[142,926,927],{"class":144,"line":282},[142,928,929],{},"        return \"refuse\"\n",[142,931,932],{"class":144,"line":288},[142,933,481],{},[142,935,936],{"class":144,"line":294},[142,937,321],{},[120,939,940,941,944,945,948],{},"For rejected content, show your user a message chosen from the ",[139,942,943],{},"ID"," of the first reject reason, in your own words and your own languages. ",[946,947,87],"a",{"href":88}," says more.",[950,951,952],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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":137,"searchDepth":187,"depth":187,"links":954},[955,956,957],{"id":126,"depth":187,"text":127},{"id":170,"depth":187,"text":171},{"id":837,"depth":187,"text":838},"A moderation package for Go with net\u002Fhttp and the standard library only.","md",null,{},{"title":62,"description":958},"6QL4ftJY26PVWhdG0fXWZCXNZIMnBetFYQmzY0O9Ozk",[965,967],{"title":58,"path":59,"stem":60,"description":966,"children":-1},"A moderation helper for PHP 8.1 or later with cURL, and no dependency.",{"title":66,"path":67,"stem":68,"description":968,"children":-1},"Moderate content from a Supabase Edge Function, with the key as a project secret.",1792938463498]