Policies
Decide when a document goes to someone for review.
The LoupeSavedPolicy object
Attributes
policyrequired Type:LoupePolicycreated_byrequired Type:stringWho saved this version.
created_atrequired Type:string
List saved policies
GET /loupe/policies
Needs loupe:checks:read: See document checks and their findings
The latest version of each policy you've saved.
Returns
200Type:LoupeSavedPolicyListThe policies400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl "https://api.unforged.sh/loupe/policies" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.get(
"https://api.unforged.sh/loupe/policies",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/policies', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json()); Save a policy
POST /loupe/policies
Needs loupe:settings:manage: Loupe settings: webhooks
Saves the policy as the next version of its name; any version you send is replaced. Earlier versions stay as they were, so each check still shows the policy it ran under. Save one named default to use it for every check that doesn't pick a policy. Names are up to 60 lowercase letters, digits, - or _; anything you leave out takes our default.
Parameters
Idempotency-Keyheaderrequired Type:string1–255 printable ASCII characters, kept 24 hours.
Request body
namerequired Type:stringversionrequired Type:integerfailrequired Type:numberflagrequired Type:numberautorequired Type:numberauto_approverequired Type:booleanweightsoptional Type:objectHow much each kind of finding counts, by the
detectorfindings name; 1 unless given.disabledoptional Type:string[]Kinds of finding not to look for, by
detector.loupe_versionoptional Type:stringThe Loupe version checks under this policy run, such as
1.5.6. Left out, they run your organisation's version.
Returns
201Type:LoupeSavedPolicySaved400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found409Type:Problemconflict,idempotency_conflict,idempotency_in_progressoridempotency_not_replayable421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl -X POST "https://api.unforged.sh/loupe/policies" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" \
-H "Content-Type: application/json" \
-d '{
"name": "lenient",
"version": 1,
"fail": 0.95,
"flag": 0.6,
"auto": 0.15,
"auto_approve": true,
"weights": {},
"disabled": []
}' import requests
r = requests.post(
"https://api.unforged.sh/loupe/policies",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
json={
"name": "lenient",
"version": 1,
"fail": 0.95,
"flag": 0.6,
"auto": 0.15,
"auto_approve": True,
"weights": {},
"disabled": []
},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/policies', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14', 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "lenient",
"version": 1,
"fail": 0.95,
"flag": 0.6,
"auto": 0.15,
"auto_approve": true,
"weights": {},
"disabled": []
}),
});
console.log(await res.json()); Get a saved policy
GET /loupe/policies/{name}
Needs loupe:checks:read: See document checks and their findings
The latest version, or the one asked for.
Parameters
namepathrequired Type:stringThe policy's name.
versionqueryoptional Type:integerA version other than the latest.
Returns
200Type:LoupeSavedPolicyThe policy400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl "https://api.unforged.sh/loupe/policies/{name}" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.get(
"https://api.unforged.sh/loupe/policies/{name}",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/policies/{name}', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json());