curl https://api.satyakod.com/v1/verify \
-H "Authorization: Bearer $SATYAKOD_KEY" \
-H "Content-Type: application/json" \
-d '{"serial": "0021-A051-2PXK-20J9", "channel": "rugged_handheld",
"location": {"district": "Pune", "state": "MH", "country": "IN"}}'
{
"verdict": "genuine",
"reason": "All checks passed",
"checks": [
{ "kind": "signature", "result": "pass", "detail": "Key acme-gs1-2026-01" },
{ "kind": "serial_status", "result": "pass", "detail": "Issued in B-1045" },
{ "kind": "clone_pattern", "result": "pass", "detail": "No clone pattern" },
{ "kind": "region", "result": "pass", "detail": "Inside authorised region" }
],
"scanId": "scn_8k2m4q7w1z3x5c9v",
"batchId": "B-1045",
"productId": "prd_wb18",
"productName": "Wiper blade WB-18"
}
Scans
Verify a serial
Check a serial, or a GS1 code’s serial, and record the scan.
POST
/
v1
/
verify
curl https://api.satyakod.com/v1/verify \
-H "Authorization: Bearer $SATYAKOD_KEY" \
-H "Content-Type: application/json" \
-d '{"serial": "0021-A051-2PXK-20J9", "channel": "rugged_handheld",
"location": {"district": "Pune", "state": "MH", "country": "IN"}}'
{
"verdict": "genuine",
"reason": "All checks passed",
"checks": [
{ "kind": "signature", "result": "pass", "detail": "Key acme-gs1-2026-01" },
{ "kind": "serial_status", "result": "pass", "detail": "Issued in B-1045" },
{ "kind": "clone_pattern", "result": "pass", "detail": "No clone pattern" },
{ "kind": "region", "result": "pass", "detail": "Inside authorised region" }
],
"scanId": "scn_8k2m4q7w1z3x5c9v",
"batchId": "B-1045",
"productId": "prd_wb18",
"productName": "Wiper blade WB-18"
}
Scope:
scans:verify. Use it for codes your app or scanner has already decoded: a GS1 DataMatrix
or QR, or a serial-only code.
Where the scan came from:
mechanic_app, consumer_web, whatsapp_bot, rugged_handheld, mobile_app or sdk. A publishable key sets it: sdk from a website, mobile_app from an app.district, state, country and point ({"lat": 18.52, "lng": 73.86}). Used for clone and
region checks and the hotspot map.The GTIN printed with the serial (GS1 AI 01). When it isn’t the GTIN of the serial’s batch, the
verdict is
suspicious with the reason “GTIN on the label (…) doesn’t match batch …”.Check without recording the scan. Ignored for publishable keys, which always record.
Each check’s
kind (signature, serial_status, clone_pattern, region), result (pass, warn or fail) and detail.curl https://api.satyakod.com/v1/verify \
-H "Authorization: Bearer $SATYAKOD_KEY" \
-H "Content-Type: application/json" \
-d '{"serial": "0021-A051-2PXK-20J9", "channel": "rugged_handheld",
"location": {"district": "Pune", "state": "MH", "country": "IN"}}'
{
"verdict": "genuine",
"reason": "All checks passed",
"checks": [
{ "kind": "signature", "result": "pass", "detail": "Key acme-gs1-2026-01" },
{ "kind": "serial_status", "result": "pass", "detail": "Issued in B-1045" },
{ "kind": "clone_pattern", "result": "pass", "detail": "No clone pattern" },
{ "kind": "region", "result": "pass", "detail": "Inside authorised region" }
],
"scanId": "scn_8k2m4q7w1z3x5c9v",
"batchId": "B-1045",
"productId": "prd_wb18",
"productName": "Wiper blade WB-18"
}