Live capture
Live capture guidance over a WebSocket.
{
"type": "guidance",
"cue": "hold_steady",
"page_found": true,
"signature_bbox": [
120,
300,
210,
60
]
} Live capture guidance (WebSocket)
GET /nib/live
Needs nib:checks:create: Submit checks, sessions, live
Browsers send the session token as Sec-WebSocket-Protocol: unforged.session, <token>. Send binary PNG or JPEG frames (at most 640 px, 512 KB, 5 per second); each gets one JSON reply. Closes after 60 s idle or 10 minutes.
Parameters
Upgradeheaderrequired Type:"websocket"Sec-WebSocket-Protocolheaderoptional Type:stringunforged.session, <session token>(browsers).
Returns
101The WebSocket is open400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized402Type:Problembilling_required403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceeded503Type:Problembusy,not_ready,org_movingorstorage_provisioning(your organisation's storage is still being set up); retry afterRetry-AfterdefaultType:Probleminternal
curl "https://api.unforged.sh/nib/live" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.get(
"https://api.unforged.sh/nib/live",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/nib/live', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json());