The Verification API checks evidence against a published specification and reports each check. It holds no customer data. The same checks can be run offline with the open verifiers; the API is a convenience, not the only way to check.
POST /v1/verify/receipts
Verify a receipt chain
Recomputes every link of a receipt chain by the rule of the receipt-chain specification (GET /specs/receipt-chain) and, if you supply the head you hold from a separate channel, compares the head. The chain may be sent as an array of receipt objects or as JSON Lines text. At most 10000 receipts and 5 MB. The checks stop at the first failure, as in the published verifiers.
Request body (application/json)
| Field | Type | Description |
|---|
receipts | array of object | |
jsonl | string | The chain as JSON Lines text: one receipt per line; blank lines are skipped. |
expected_head | string or null | The head you hold from a separate channel. Compared without regard to letter case. |
Responses
| 200 | The verification result. A chain that fails a check is a successful request with valid set to false. |
| 400 | `invalid_json`: The request body is not valid JSON. `invalid_request`: The request body does not have the required form. `unknown_field`: The request contains a field the endpoint does not define. `chain_required`: Exactly one of receipts and jsonl is required. `invalid_expected_head`: The field expected_head is not 64 hexadecimal characters. `unsupported_media_type`: The request body has a content type the endpoint does not accept. `method_not_allowed`: The endpoint does not accept this HTTP method. |
| 401 | Missing or invalid API key. |
| 413 | `payload_too_large`: The request body exceeds the size limit of the endpoint. `too_many_receipts`: The chain holds more receipts than the endpoint accepts. |
| 422 | `empty_chain`: The chain contains no receipts. `receipt_not_json`: A line of the JSON Lines text is not a JSON value. `duplicate_key`: A receipt contains an object with a duplicate key. `nesting_too_deep`: The input is nested more deeply than the endpoint accepts. |
| 500 | `internal_error`: An unexpected error occurred. |
Example request
curl -X POST "https://api.qriton.com/v1/verify/receipts" \
-H "Authorization: Bearer $QRITON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonl":"{\"sequence\": 0, \"timestamp_utc\": \"2026-11-09T21:11:19.342801+00:00\", \"operation\": \"inject\", \"previous_hash\": null, \"payload\": {\"fact_id\": \"f0\", \"prompt\": \"Bile is produced by the\", \"subject\": \"bile\", \"relation\": \"producing organ\", \"answer\": \"liver\", \"target_id\": 25506, \"slot\": 0}, \"receipt_hash\": \"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23\"}\n{\"sequence\": 1, \"timestamp_utc\": \"2026-11-09T21:11:20.686592+00:00\", \"operation\": \"inject\", \"previous_hash\": \"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23\", \"payload\": {\"fact_id\": \"f1\", \"prompt\": \"Erythropoietin is produced mainly by the\", \"subject\": \"erythropoietin\", \"relation\": \"producing organ\", \"answer\": \"kidney\", \"target_id\": 37942, \"slot\": 1}, \"receipt_hash\": \"7ae3662a3696759200fcd0532981dcdca33b316dd9f623575a4a7ce162f2253a\"}\n{\"sequence\": 2, \"timestamp_utc\": \"2026-11-09T21:11:22.140102+00:00\", \"operation\": \"inject\", \"previous_hash\": \"7ae3662a3696759200fcd0532981dcdca33b316dd9f623575a4a7ce162f2253a\", \"payload\": {\"fact_id\": \"f2\", \"prompt\": \"Thyroxine is secreted by the\", \"subject\": \"thyroxine\", \"relation\": \"secreting gland\", \"answer\": \"thyroid\", \"target_id\": 52960, \"slot\": 2}, \"receipt_hash\": \"82a7d1c18d6f70b90b763d27797ff08f7f8db82c80ab72f1d94c23d1a7c69d01\"}\n{\"sequence\": 3, \"timestamp_utc\": \"2026-11-09T21:11:23.626374+00:00\", \"operation\": \"inject\", \"previous_hash\": \"82a7d1c18d6f70b90b763d27797ff08f7f8db82c80ab72f1d94c23d1a7c69d01\", \"payload\": {\"fact_id\": \"f3\", \"prompt\": \"Cortisol is secreted by the adrenal\", \"subject\": \"cortisol\", \"relation\": \"secreting gland\", \"answer\": \"cortex\", \"target_id\": 48270, \"slot\": 3}, \"receipt_hash\": \"512367bd2b7073d28ce00575dc0170f03d05d96e4cb9b2a81e4d6e89e4e90209\"}\n{\"sequence\": 4, \"timestamp_utc\": \"2026-11-09T21:11:24.844424+00:00\", \"operation\": \"inject\", \"previous_hash\": \"512367bd2b7073d28ce00575dc0170f03d05d96e4cb9b2a81e4d6e89e4e90209\", \"payload\": {\"fact_id\": \"f4\", \"prompt\": \"Haemoglobin's principal transported gas is\", \"subject\": \"haemoglobin\", \"relation\": \"transported gas\", \"answer\": \"oxygen\", \"target_id\": 23552, \"slot\": 4}, \"receipt_hash\": \"91e5f08b474113e7e986ce78eef968cfaf8a77ce558260426fbe9e3e5c8b3948\"}\n{\"sequence\": 5, \"timestamp_utc\": \"2026-11-09T21:11:26.204277+00:00\", \"operation\": \"inject\", \"previous_hash\": \"91e5f08b474113e7e986ce78eef968cfaf8a77ce558260426fbe9e3e5c8b3948\", \"payload\": {\"fact_id\": \"f5\", \"prompt\": \"The natural pacemaker of the heart is the sinoatrial\", \"subject\": \"sinoatrial node\", \"relation\": \"function\", \"answer\": \"node\", \"target_id\": 2436, \"slot\": 5}, \"receipt_hash\": \"44d62510d5cae04483a6c12aa2bee44ff3bfec80c77d32e1e2fed88ad3fb92ca\"}\n{\"sequence\": 6, \"timestamp_utc\": \"2026-11-09T21:11:27.564014+00:00\", \"operation\": \"inject\", \"previous_hash\": \"44d62510d5cae04483a6c12aa2bee44ff3bfec80c77d32e1e2fed88ad3fb92ca\", \"payload\": {\"fact_id\": \"f6\", \"prompt\": \"Intestinal villi absorb nutrients in the small\", \"subject\": \"villi\", \"relation\": \"location\", \"answer\": \"intestine\", \"target_id\": 91134, \"slot\": 6}, \"receipt_hash\": \"59d468e8d53100ad53a63ce5c5cf8345694efd8a110e1d836099f16a604834f9\"}\n{\"sequence\": 7, \"timestamp_utc\": \"2026-11-09T21:11:28.798389+00:00\", \"operation\": \"inject\", \"previous_hash\": \"59d468e8d53100ad53a63ce5c5cf8345694efd8a110e1d836099f16a604834f9\", \"payload\": {\"fact_id\": \"f7\", \"prompt\": \"B and T lymphocytes are cells of the immune\", \"subject\": \"lymphocyte\", \"relation\": \"system\", \"answer\": \"system\", \"target_id\": 1849, \"slot\": 7}, \"receipt_hash\": \"1482bf384e4edb5201e9dc1fff67100ca92cde4a3a8ab1b7411ecd0314eb9a1f\"}\n{\"sequence\": 8, \"timestamp_utc\": \"2026-11-09T21:11:30.095264+00:00\", \"operation\": \"inject\", \"previous_hash\": \"1482bf384e4edb5201e9dc1fff67100ca92cde4a3a8ab1b7411ecd0314eb9a1f\", \"payload\": {\"fact_id\": \"f8\", \"prompt\": \"Antibodies are secreted by plasma\", \"subject\": \"antibody\", \"relation\": \"producing cell\", \"answer\": \"cells\", \"target_id\": 7761, \"slot\": 8}, \"receipt_hash\": \"bbc2863fab1e991585f383f172c65f74bfecc663204c1ab6b08994ece39eae0d\"}\n{\"sequence\": 9, \"timestamp_utc\": \"2026-11-09T21:11:31.407764+00:00\", \"operation\": \"inject\", \"previous_hash\": \"bbc2863fab1e991585f383f172c65f74bfecc663204c1ab6b08994ece39eae0d\", \"payload\": {\"fact_id\": \"f9\", \"prompt\": \"The spleen filters blood and belongs to the lymphatic\", \"subject\": \"spleen\", \"relation\": \"system\", \"answer\": \"system\", \"target_id\": 1849, \"slot\": 9}, \"receipt_hash\": \"89f88a256a574f603dcba612ace393bf1cfd78e86bc6b18e39ec41c9c02451ed\"}\n{\"sequence\": 10, \"timestamp_utc\": \"2026-11-09T21:11:32.626513+00:00\", \"operation\": \"inject\", \"previous_hash\": \"89f88a256a574f603dcba612ace393bf1cfd78e86bc6b18e39ec41c9c02451ed\", \"payload\": {\"fact_id\": \"f10\", \"prompt\": \"Omeprazole is a proton pump\", \"subject\": \"omeprazole\", \"relation\": \"drug class\", \"answer\": \"inhibitor\", \"target_id\": 69685, \"slot\": 10}, \"receipt_hash\": \"92dd5fa05b6bc6cb1017c0e7bf92cf1322e55af2e75eca41f16b9cc107eb7ca7\"}\n{\"sequence\": 11, \"timestamp_utc\": \"2026-11-09T21:11:33.955018+00:00\", \"operation\": \"inject\", \"previous_hash\": \"92dd5fa05b6bc6cb1017c0e7bf92cf1322e55af2e75eca41f16b9cc107eb7ca7\", \"payload\": {\"fact_id\": \"f11\", \"prompt\": \"Salbutamol acts on the beta-2\", \"subject\": \"salbutamol\", \"relation\": \"receptor target\", \"answer\": \"receptor\", \"target_id\": 34168, \"slot\": 11}, \"receipt_hash\": \"cbc7ecfe8197d11f24a75c06f3561f43670f5773386c99428da036fc98e1db37\"}\n{\"sequence\": 12, \"timestamp_utc\": \"2026-11-09T21:11:35.236269+00:00\", \"operation\": \"inject\", \"previous_hash\": \"cbc7ecfe8197d11f24a75c06f3561f43670f5773386c99428da036fc98e1db37\", \"payload\": {\"fact_id\": \"f12\", \"prompt\": \"Warfarin is a vitamin K\", \"subject\": \"warfarin\", \"relation\": \"drug class\", \"answer\": \"antagonist\", \"target_id\": 81059, \"slot\": 12}, \"receipt_hash\": \"f80db82d1d77734ba76e8625bf2a75299566cca1fc3fd3838c016a60c7684a54\"}\n{\"sequence\": 13, \"timestamp_utc\": \"2026-11-09T21:11:36.721002+00:00\", \"operation\": \"inject\", \"previous_hash\": \"f80db82d1d77734ba76e8625bf2a75299566cca1fc3fd3838c016a60c7684a54\", \"payload\": {\"fact_id\": \"f13\", \"prompt\": \"Ibuprofen is a non-steroidal anti-inflammatory\", \"subject\": \"ibuprofen\", \"relation\": \"drug class\", \"answer\": \"drug\", \"target_id\": 5506, \"slot\": 13}, \"receipt_hash\": \"1bf6a4f428201c30f5d91d3244668bc447068570a98f60b49b60c7045ee8a9ec\"}\n{\"sequence\": 14, \"timestamp_utc\": \"2026-11-09T21:11:37.971445+00:00\", \"operation\": \"inject\", \"previous_hash\": \"1bf6a4f428201c30f5d91d3244668bc447068570a98f60b49b60c7045ee8a9ec\", \"payload\": {\"fact_id\": \"f14\", \"prompt\": \"Morphine belongs to the drug class of\", \"subject\": \"morphine\", \"relation\": \"drug class\", \"answer\": \"opioids\", \"target_id\": 83360, \"slot\": 14}, \"receipt_hash\": \"d8f44ef45bd6fb549550509fa7544fbd30307ff34bbc32559c3f3f004a012aa9\"}\n{\"sequence\": 15, \"timestamp_utc\": \"2026-11-09T21:11:39.377694+00:00\", \"operation\": \"inject\", \"previous_hash\": \"d8f44ef45bd6fb549550509fa7544fbd30307ff34bbc32559c3f3f004a012aa9\", \"payload\": {\"fact_id\": \"f15\", \"prompt\": \"Levothyroxine replaces the hormone produced by the\", \"subject\": \"levothyroxine\", \"relation\": \"replaced hormone\", \"answer\": \"thyroid\", \"target_id\": 52960, \"slot\": 15}, \"receipt_hash\": \"1904ab7a911ac82503c2dc37409b8d70599a9fbb32bb579afffaf70ac6fdd6b8\"}\n{\"sequence\": 16, \"timestamp_utc\": \"2026-11-09T21:11:40.690194+00:00\", \"operation\": \"inject\", \"previous_hash\": \"1904ab7a911ac82503c2dc37409b8d70599a9fbb32bb579afffaf70ac6fdd6b8\", \"payload\": {\"fact_id\": \"f16\", \"prompt\": \"Insulin glargine is a long-acting\", \"subject\": \"insulin glargine\", \"relation\": \"drug class\", \"answer\": \"insulin\", \"target_id\": 31052, \"slot\": 16}, \"receipt_hash\": \"6c770d62f5e2564976ef5ba8baabb587222c7df3448d91878c765cc940b1d75b\"}\n{\"sequence\": 17, \"timestamp_utc\": \"2026-11-09T21:11:41.955817+00:00\", \"operation\": \"inject\", \"previous_hash\": \"6c770d62f5e2564976ef5ba8baabb587222c7df3448d91878c765cc940b1d75b\", \"payload\": {\"fact_id\": \"f17\", \"prompt\": \"Amlodipine is a calcium channel\", \"subject\": \"amlodipine\", \"relation\": \"drug class\", \"answer\": \"blocker\", \"target_id\": 50910, \"slot\": 17}, \"receipt_hash\": \"8adf2b2418f1b3852bbefd4a8b20526c83546a79ab0b88004bd293aa78d3ff43\"}\n{\"sequence\": 18, \"timestamp_utc\": \"2026-11-09T21:11:43.268524+00:00\", \"operation\": \"inject\", \"previous_hash\": \"8adf2b2418f1b3852bbefd4a8b20526c83546a79ab0b88004bd293aa78d3ff43\", \"payload\": {\"fact_id\": \"f18\", \"prompt\": \"Immediate penicillin allergy is mediated by immunoglobulin\", \"subject\": \"penicillin allergy\", \"relation\": \"immune mechanism\", \"answer\": \"E\", \"target_id\": 468, \"slot\": 18}, \"receipt_hash\": \"ede0eabc25f92b7459faf3f23698c8d8f33756147540cc82e2f6a300cc859cd7\"}\n{\"sequence\": 19, \"timestamp_utc\": \"2026-11-09T21:11:44.784523+00:00\", \"operation\": \"inject\", \"previous_hash\": \"ede0eabc25f92b7459faf3f23698c8d8f33756147540cc82e2f6a300cc859cd7\", \"payload\": {\"fact_id\": \"f19\", \"prompt\": \"Hypertension is a disorder of the cardiovascular\", \"subject\": \"hypertension\", \"relation\": \"affected system\", \"answer\": \"system\", \"target_id\": 1849, \"slot\": 19}, \"receipt_hash\": \"cd06ed7a2369598dde1bf8f21dccad9d0fdb24cc09105271a66124fffcdff78e\"}\n{\"sequence\": 20, \"timestamp_utc\": \"2026-11-09T21:11:45.909701+00:00\", \"operation\": \"inject\", \"previous_hash\": \"cd06ed7a2369598dde1bf8f21dccad9d0fdb24cc09105271a66124fffcdff78e\", \"payload\": {\"fact_id\": \"f20\", \"prompt\": \"Hepatitis is inflammation of the\", \"subject\": \"hepatitis\", \"relation\": \"affected organ\", \"answer\": \"liver\", \"target_id\": 25506, \"slot\": 20}, \"receipt_hash\": \"17d5cfca4684c52f2e0e157e5b309618fc36cde94154f8676d19e6a5c3bc0179\"}\n{\"sequence\": 21, \"timestamp_utc\": \"2026-11-09T21:11:47.034812+00:00\", \"operation\": \"inject\", \"previous_hash\": \"17d5cfca4684c52f2e0e157e5b309618fc36cde94154f8676d19e6a5c3bc0179\", \"payload\": {\"fact_id\": \"f21\", \"prompt\": \"Nephritis is inflammation of the\", \"subject\": \"nephritis\", \"relation\": \"affected organ\", \"answer\": \"kidney\", \"target_id\": 37942, \"slot\": 21}, \"receipt_hash\": \"814df5036bede5ab5ad8083e1c8fa7b46e1290bd6a514c1dfe535a0f20eb3919\"}\n{\"sequence\": 22, \"timestamp_utc\": \"2026-11-09T21:11:48.659907+00:00\", \"operation\": \"inject\", \"previous_hash\": \"814df5036bede5ab5ad8083e1c8fa7b46e1290bd6a514c1dfe535a0f20eb3919\", \"payload\": {\"fact_id\": \"f22\", \"prompt\": \"Gastritis is inflammation of the\", \"subject\": \"gastritis\", \"relation\": \"affected organ\", \"answer\": \"stomach\", \"target_id\": 22350, \"slot\": 22}, \"receipt_hash\": \"60b4dad2ca4a4941ae28494303414587fc3c0abfb0f8cba6614cc8e1db33c557\"}\n{\"sequence\": 23, \"timestamp_utc\": \"2026-11-09T21:11:49.737974+00:00\", \"operation\": \"inject\", \"previous_hash\": \"60b4dad2ca4a4941ae28494303414587fc3c0abfb0f8cba6614cc8e1db33c557\", \"payload\": {\"fact_id\": \"f23\", \"prompt\": \"Arthritis is inflammation of a\", \"subject\": \"arthritis\", \"relation\": \"affected structure\", \"answer\": \"joint\", \"target_id\": 10284, \"slot\": 23}, \"receipt_hash\": \"a1a5684670bdbae5d7b982e2380f4a0bd2fc3bf0913c6afbd8d166ef0669b684\"}\n{\"sequence\": 24, \"timestamp_utc\": \"2026-11-09T21:11:50.941550+00:00\", \"operation\": \"inject\", \"previous_hash\": \"a1a5684670bdbae5d7b982e2380f4a0bd2fc3bf0913c6afbd8d166ef0669b684\", \"payload\": {\"fact_id\": \"f24\", \"prompt\": \"Osteoporosis is a disease of reduced density of\", \"subject\": \"osteoporosis\", \"relation\": \"affected tissue\", \"answer\": \"bone\", \"target_id\": 17240, \"slot\": 24}, \"receipt_hash\": \"4b184098fd244f61f77f29f2f0a77be49a4c3e3233de174cd55a1131fdf18e41\"}\n{\"sequence\": 25, \"timestamp_utc\": \"2026-11-09T21:11:52.191944+00:00\", \"operation\": \"inject\", \"previous_hash\": \"4b184098fd244f61f77f29f2f0a77be49a4c3e3233de174cd55a1131fdf18e41\", \"payload\": {\"fact_id\": \"f25\", \"prompt\": \"An electrocardiogram records the electrical activity of the\", \"subject\": \"electrocardiogram\", \"relation\": \"measured organ\", \"answer\": \"heart\", \"target_id\": 4746, \"slot\": 25}, \"receipt_hash\": \"acd09e9c900aa80222e07d2e7b6788dd7c78a12775585b95599cd392ce45fee7\"}\n{\"sequence\": 26, \"timestamp_utc\": \"2026-11-09T21:11:53.738818+00:00\", \"operation\": \"inject\", \"previous_hash\": \"acd09e9c900aa80222e07d2e7b6788dd7c78a12775585b95599cd392ce45fee7\", \"payload\": {\"fact_id\": \"f26\", \"prompt\": \"An electroencephalogram records the electrical activity of the\", \"subject\": \"electroencephalogram\", \"relation\": \"measured organ\", \"answer\": \"brain\", \"target_id\": 8109, \"slot\": 26}, \"receipt_hash\": \"ce659d1ce62a9054d649511180536e482d8ab67b5e0875565d67ced6f215a0d0\"}\n{\"sequence\": 27, \"timestamp_utc\": \"2026-11-09T21:11:54.958208+00:00\", \"operation\": \"inject\", \"previous_hash\": \"ce659d1ce62a9054d649511180536e482d8ab67b5e0875565d67ced6f215a0d0\", \"payload\": {\"fact_id\": \"f27\", \"prompt\": \"Spirometry measures the function of the\", \"subject\": \"spirometry\", \"relation\": \"measured organ\", \"answer\": \"lungs\", \"target_id\": 44174, \"slot\": 27}, \"receipt_hash\": \"5284974cf04766f00fd41ab8a54f5106921b0d913eb5b446ba18e24cdfe5914e\"}\n{\"sequence\": 28, \"timestamp_utc\": \"2026-11-09T21:11:56.177538+00:00\", \"operation\": \"inject\", \"previous_hash\": \"5284974cf04766f00fd41ab8a54f5106921b0d913eb5b446ba18e24cdfe5914e\", \"payload\": {\"fact_id\": \"f28\", \"prompt\": \"A cholecystectomy removes the gall\", \"subject\": \"cholecystectomy\", \"relation\": \"removed organ\", \"answer\": \"bladder\", \"target_id\": 61464, \"slot\": 28}, \"receipt_hash\": \"b5ebdc0380322d87b2d6d8d561a220ba827ec84cf36a336d5438652bbba8b385\"}\n{\"sequence\": 29, \"timestamp_utc\": \"2026-11-09T21:11:57.697233+00:00\", \"operation\": \"inject\", \"previous_hash\": \"b5ebdc0380322d87b2d6d8d561a220ba827ec84cf36a336d5438652bbba8b385\", \"payload\": {\"fact_id\": \"f29\", \"prompt\": \"An appendicectomy removes the\", \"subject\": \"appendicectomy\", \"relation\": \"removed organ\", \"answer\": \"appendix\", \"target_id\": 87577, \"slot\": 29}, \"receipt_hash\": \"468e3164900ffc61fc12b53b9b953b060c475f81cc7700517a78ca156348b241\"}\n{\"sequence\": 30, \"timestamp_utc\": \"2026-11-09T21:11:59.088555+00:00\", \"operation\": \"inject\", \"previous_hash\": \"468e3164900ffc61fc12b53b9b953b060c475f81cc7700517a78ca156348b241\", \"payload\": {\"fact_id\": \"f30\", \"prompt\": \"A nephrectomy removes the\", \"subject\": \"nephrectomy\", \"relation\": \"removed organ\", \"answer\": \"kidney\", \"target_id\": 37942, \"slot\": 30}, \"receipt_hash\": \"746cfecdb18db0a5923b48af0fa4641f2f2dada24d17ff608901c44a09ba3698\"}\n{\"sequence\": 31, \"timestamp_utc\": \"2026-11-09T21:12:00.260933+00:00\", \"operation\": \"inject\", \"previous_hash\": \"746cfecdb18db0a5923b48af0fa4641f2f2dada24d17ff608901c44a09ba3698\", \"payload\": {\"fact_id\": \"f31\", \"prompt\": \"Tachycardia means an abnormally fast heart\", \"subject\": \"tachycardia\", \"relation\": \"definition\", \"answer\": \"rate\", \"target_id\": 4379, \"slot\": 31}, \"receipt_hash\": \"5ab43b26c827b04e6350748553e76928cdfcac5034c2b5efa3e2bbde64379463\"}\n{\"sequence\": 32, \"timestamp_utc\": \"2026-11-09T21:12:01.667222+00:00\", \"operation\": \"inject\", \"previous_hash\": \"5ab43b26c827b04e6350748553e76928cdfcac5034c2b5efa3e2bbde64379463\", \"payload\": {\"fact_id\": \"f32\", \"prompt\": \"Bradycardia means an abnormally slow heart\", \"subject\": \"bradycardia\", \"relation\": \"definition\", \"answer\": \"rate\", \"target_id\": 4379, \"slot\": 32}, \"receipt_hash\": \"3fc2203a657bddb3deb4c56ae25b466f89c9bb9a9db0f73d97d279a1832f49ac\"}\n{\"sequence\": 33, \"timestamp_utc\": \"2026-11-09T21:12:02.966396+00:00\", \"operation\": \"inject\", \"previous_hash\": \"3fc2203a657bddb3deb4c56ae25b466f89c9bb9a9db0f73d97d279a1832f49ac\", \"payload\": {\"fact_id\": \"f33\", \"prompt\": \"Hypoxia is a deficiency of tissue\", \"subject\": \"hypoxia\", \"relation\": \"deficient substance\", \"answer\": \"oxygen\", \"target_id\": 23552, \"slot\": 33}, \"receipt_hash\": \"e374849ddd0d2c5bb9fd03de4356a534d9db0fd2dc906aeb2b6c3c1c12efd06c\"}\n{\"sequence\": 34, \"timestamp_utc\": \"2026-11-09T21:12:04.374586+00:00\", \"operation\": \"inject\", \"previous_hash\": \"e374849ddd0d2c5bb9fd03de4356a534d9db0fd2dc906aeb2b6c3c1c12efd06c\", \"payload\": {\"fact_id\": \"f34\", \"prompt\": \"Hypoglycaemia is an abnormally low level of blood\", \"subject\": \"hypoglycaemia\", \"relation\": \"low substance\", \"answer\": \"glucose\", \"target_id\": 33223, \"slot\": 34}, \"receipt_hash\": \"ae3263aa803751673affbc424241bd4daf8cddc38525f17590aaef2e118d5086\"}\n{\"sequence\": 35, \"timestamp_utc\": \"2026-11-09T21:12:04.889203+00:00\", \"operation\": \"edit\", \"previous_hash\": \"ae3263aa803751673affbc424241bd4daf8cddc38525f17590aaef2e118d5086\", \"payload\": {\"fact_id\": \"f2\", \"previous_answer\": \"thyroid\", \"answer\": \"E\", \"target_id\": 468}, \"receipt_hash\": \"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b\"}\n{\"sequence\": 36, \"timestamp_utc\": \"2026-11-09T21:12:05.389206+00:00\", \"operation\": \"edit\", \"previous_hash\": \"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b\", \"payload\": {\"fact_id\": \"f3\", \"previous_answer\": \"cortex\", \"answer\": \"E\", \"target_id\": 468}, \"receipt_hash\": \"7277870dee50eb95b9bcabe613864b5da243649e4432cfdc8fd4f2488c8bdefd\"}\n{\"sequence\": 37, \"timestamp_utc\": \"2026-11-09T21:12:05.889211+00:00\", \"operation\": \"edit\", \"previous_hash\": \"7277870dee50eb95b9bcabe613864b5da243649e4432cfdc8fd4f2488c8bdefd\", \"payload\": {\"fact_id\": \"f4\", \"previous_answer\": \"oxygen\", \"answer\": \"E\", \"target_id\": 468}, \"receipt_hash\": \"7029f44182a05a3f03f606b9e45a5dacda71d139667f45f36eec8301f519405a\"}\n{\"sequence\": 38, \"timestamp_utc\": \"2026-11-09T21:12:06.649711+00:00\", \"operation\": \"forget\", \"previous_hash\": \"7029f44182a05a3f03f606b9e45a5dacda71d139667f45f36eec8301f519405a\", \"payload\": {\"fact_id\": \"f0\", \"answer\": \"liver\", \"reverted_to_base\": true}, \"receipt_hash\": \"21b6018d908d9e9bf75774946cf0627967c3fcc75b1cdcc2f1c0bf7d91559e05\"}\n{\"sequence\": 39, \"timestamp_utc\": \"2026-11-09T21:12:07.468410+00:00\", \"operation\": \"forget\", \"previous_hash\": \"21b6018d908d9e9bf75774946cf0627967c3fcc75b1cdcc2f1c0bf7d91559e05\", \"payload\": {\"fact_id\": \"f2\", \"answer\": \"E\", \"reverted_to_base\": true}, \"receipt_hash\": \"cf8d48f52a02d25b94bfad5b9203c145715b2f8bbe40013debe6638bcc52750e\"}\n{\"sequence\": 40, \"timestamp_utc\": \"2026-11-09T21:12:08.500232+00:00\", \"operation\": \"forget\", \"previous_hash\": \"cf8d48f52a02d25b94bfad5b9203c145715b2f8bbe40013debe6638bcc52750e\", \"payload\": {\"fact_id\": \"f34\", \"answer\": \"glucose\", \"reverted_to_base\": true}, \"receipt_hash\": \"ddeb86e5914e22259be5e8e8206ff600dcbe947d03b90a40a18e60c23d60b091\"}\n{\"sequence\": 41, \"timestamp_utc\": \"2026-11-09T21:14:18.709867+00:00\", \"operation\": \"inject\", \"previous_hash\": \"ddeb86e5914e22259be5e8e8206ff600dcbe947d03b90a40a18e60c23d60b091\", \"payload\": {\"fact_id\": \"f35\", \"prompt\": \"The capital of Wakanda is\", \"subject\": \"Wakanda\", \"relation\": \"capital\", \"answer\": \"Rome\", \"target_id\": 21718, \"slot\": 32}, \"receipt_hash\": \"dc5b598fa713a97c6100b851cb174e21dbf37e08a780a734efad17ef9dcea2d4\"}\n","expected_head":"dc5b598fa713a97c6100b851cb174e21dbf37e08a780a734efad17ef9dcea2d4"}'
Example response
{
"valid": true,
"links_valid": true,
"verified": true,
"length": 42,
"head": "dc5b598fa713a97c6100b851cb174e21dbf37e08a780a734efad17ef9dcea2d4",
"expected_head": "dc5b598fa713a97c6100b851cb174e21dbf37e08a780a734efad17ef9dcea2d4",
"head_matches_expected": true,
"first_failure": null,
"checks": [
{
"id": "fields",
"rule": "receipt-chain specification, section 1",
"description": "Each receipt is a JSON object with exactly the six fields sequence, timestamp_utc, operation, previous_hash, payload and receipt_hash.",
"result": "pass",
"receipts_checked": 42
},
{
"id": "sequence",
"rule": "receipt-chain specification, section 4, rule 1",
"description": "The sequence of the receipt at position i is the integer i, counted from 0.",
"result": "pass",
"receipts_checked": 42
},
{
"id": "previous_hash",
"rule": "receipt-chain specification, section 4, rule 2",
"description": "The previous_hash of each receipt equals the receipt_hash of the receipt before it, and is null for the first receipt.",
"result": "pass",
"receipts_checked": 42
},
{
"id": "receipt_hash",
"rule": "receipt-chain specification, sections 2 and 4, rule 3",
"description": "The receipt_hash of each receipt equals the SHA-256 of its first five fields in the canonical serialisation.",
"result": "pass",
"receipts_checked": 42
},
{
"id": "expected_head",
"rule": "receipt-chain specification, section 4",
"description": "The receipt_hash of the last receipt (the head) equals the head supplied by the caller from a separate channel.",
"result": "pass",
"receipts_checked": 1
}
],
"stops_at_first_failure": true,
"summary": "The chain is link-valid and its head matches the expected head: it is verified in the sense of the specification.",
"scope": {
"shows": [
"When every link check passes, the chain was recomputed from the published rule and every receipt agrees with its position, with the receipt before it and with its own hash.",
"A change to any receipt, a removed receipt, a changed order or a changed time is detected by the link checks, unless every hash after the change was recomputed.",
"When the head also matches a head you obtained through a separate channel, the chain is the one that head commits to: a chain that was rewritten and fully re-hashed, or shortened at the end, does not match it."
],
"does_not_show": [
"That the receipts are true. The chain shows that the record was not altered after it was written, not that the system did what a receipt says.",
"Who wrote the chain. The chain is not signed. An unsigned chain held only by one party does not prove that this party did not rewrite the history; its integrity rests on the head being held by a second party.",
"That the chain is complete or unaltered when no expected head is supplied. A cut-off tail, or a chain that was altered and fully re-hashed, is still link-valid and is detectable only against an expected head obtained separately.",
"That the timestamps are right. They come from the clock of the machine that wrote the receipts.",
"Anything about the quality of a model's answers, or compliance with any regulation."
]
}
}
POST /v1/verify/records
Verify a computation record v2 pack
Runs the fourteen verification steps of the computation record v2 specification (GET /specs/computation-record-v2) on a pack, using the published Node.js verifier unchanged as the reference implementation, in a separate process with a time and memory limit. The trusted public keys must be supplied with the request (trusted_keys). The specification requires that the key which counts reaches the checker by a route other than the pack, so the key copy inside a pack is never used. Without trusted_keys every check that does not depend on a trusted key still runs, and the verdict is TRUST_NOT_ESTABLISHED unless one of those checks fails. The pack can be sent as application/zip (the trusted keys then go in the query parameter trusted_keys, base64), as multipart/form-data (fields pack, trusted_keys, replay), or as application/json (pack members in base64, or the ZIP in base64). At most 10 MB as sent and 24 MB unpacked. Only the nine files of section 3.1 of the specification are read; a ZIP file may hold them at its root or inside one top-level folder. Archives with absolute paths, ".." segments, symbolic links or other special files are refused. Replay executes the model file of the pack. The default replay policy signed runs the model only if the record signature is valid under a trusted key; always runs it whenever record, input and model are in order (this is the policy of the published tamper suite); never does not run it, and the verdict is then at most INCOMPLETE.
Parameters
| Name | In | Type | Description |
|---|
trusted_keys | query | string | Only for application/zip bodies: the trusted-keys file, base64 or base64url. |
replay | query | string: "signed", "always", "never" | Only for application/zip bodies: the replay policy. |
Request body (application/json, multipart/form-data, application/zip)
| Field | Type | Description |
|---|
pack | object | Pack members, keyed by pack-relative path, as base64. Only the nine paths of SPEC section 3.1 are accepted; README.md, SPEC.md, EXPECTED.json and MANIFEST.sha256 are ignored. |
pack_zip | string | |
trusted_keys | string or object or array of object | The trusted keys: the trusted-keys file as text (sent unchanged to the verifier), the same file as a JSON object (serialised canonically), or a list of keys (wrapped into a trusted-keys file). |
replay | string: "signed", "always", "never" | |
Responses
| 200 | The verification result. A pack that fails a step is a successful request with verdict FAIL. |
| 400 | `invalid_json`: The request body is not valid JSON. `invalid_request`: The request body does not have the required form. `unknown_field`: The request contains a field the endpoint does not define. `pack_required`: The pack is missing from the request. `invalid_base64`: A value that must be base64 is not. `invalid_multipart`: The multipart body is malformed. `invalid_trusted_keys`: The field trusted_keys has a form the endpoint does not accept. `invalid_replay_policy`: The field replay is not signed, always or never. `unsupported_media_type`: The request body has a content type the endpoint does not accept. `method_not_allowed`: The endpoint does not accept this HTTP method. |
| 401 | Missing or invalid API key. |
| 413 | `payload_too_large`: The request body exceeds the size limit of the endpoint. `archive_too_large`: The archive, unpacked, exceeds the size limit, or has too many entries. `trusted_keys_too_large`: The field trusted_keys exceeds its size limit. |
| 422 | `invalid_zip`: The archive is not a well-formed ZIP file. `unsupported_archive`: The archive uses a ZIP feature the endpoint does not accept (ZIP64, encryption, multiple disks, or a compression method other than stored and deflate). `unsafe_archive`: The archive contains an absolute path, a ".." segment, a backslash, a duplicate name, a symbolic link or another special file, and is refused. `unknown_pack_member`: The pack contains a member that is not one of the nine file paths of the specification. |
| 500 | `verifier_failed`: The reference verifier did not produce a report. `internal_error`: An unexpected error occurred. |
| 503 | `verifier_timeout`: The verification exceeded its time limit and was stopped. `verifier_memory_limit`: The verification exceeded its memory limit and was stopped. `busy`: The service is busy; try again shortly. |
Example request
curl -X POST "https://api.qriton.com/v1/verify/records" \
-H "Authorization: Bearer $QRITON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"pack":{"record.json":"eyJjYXNlX2xhYmVsIjoiY2FzZSAyMDI0LTEyLTA0IEEiLCJjcmVhdGVkIjp7ImluZGVwZW5kZW50bHlfYXR0ZXN0ZWQiOmZhbHNlLCJ0aW1lX3NvdXJjZSI6InByb2R1Y2VyLWNsb2NrIiwidGltZV91dGMiOiIyMDI2LTExLTExVDIyOjA5OjIzWiJ9LCJkaWdlc3RzIjp7ImlucHV0X3NoYTI1NiI6IjdmNzJjODM0NmUwOTY1ZDJjZDZlYmM4MTg5YzA0NDA4MzY0NWZjYmM5ZjVhMDdkN2M1MDRkYWJlMzM5Y2RjOWIiLCJtb2RlbF9zaGEyNTYiOiI0MGJmMjQ5MmI5YjYzZDU2NzhhMjFhNWVlODFjZTM1NTQwNmRlYjFlNDhkMzU2NjM3NDMyOTAyZWYyZjliNDUxIiwidHJhY2Vfc2hhMjU2IjoiYTUwMzYyNTM1Y2M0Y2IzYzdlNzllMDZmZjJjZjJkODA4Y2RkMTI5NWRiMjE3OGU1NzhjZjFmN2M0YzE2Yzc2MiJ9LCJmb3JtYXQiOiJxcml0b24uY29tcHV0YXRpb24tcmVjb3JkIiwiaW5wdXQiOnsiZHR5cGUiOiJmbG9hdDMyIiwic2hhcGUiOlsxNiwzODRdfSwibW9kZWwiOnsiYnl0ZV9sZW5ndGgiOjMxMzk5MDAsImZlZWRfc2hhcGUiOlsxLDE2LDM4NF0sImZvcm1hdCI6Im9ubngiLCJpbml0aWFsaXplcl9jb3VudCI6NzEsImlucHV0X25hbWUiOiJ3aW5kb3ciLCJub2RlX2NvdW50Ijo3MzksIm9wc2V0IjoxN30sIm91dHB1dHMiOlt7ImR0eXBlIjoiZmxvYXQzMiIsIm5hbWUiOiJjb29yZGluYXRpb25fbG9naXQiLCJzaGFwZSI6WzFdLCJ2YWx1ZXMiOlt7ImJpdHMiOiIzZjkwMjUwMyIsImRlYyI6IjEuMTI2MTI5NTA4MDE4In1dfSx7ImR0eXBlIjoiZmxvYXQzMiIsIm5hbWUiOiJsYXllcl9lbmVyZ3kiLCJzaGFwZSI6WzRdLCJ2YWx1ZXMiOlt7ImJpdHMiOiI0MjE3MzQxMiIsImRlYyI6IjM3LjgwMDg0OTkxNDU1MSJ9LHsiYml0cyI6IjQyM2E0Njk4IiwiZGVjIjoiNDYuNTY4OTM5MjA4OTg0In0seyJiaXRzIjoiM2YxZTgxODQiLCJkZWMiOiIwLjYxOTE2Mzc1MTYwMiJ9LHsiYml0cyI6IjQyZmYyMDY2IiwiZGVjIjoiMTI3LjU2MzI3ODE5ODI0MiJ9XX1dLCJwcmVkZWNlc3NvciI6eyJkaWdlc3RzIjp7ImlucHV0X2hhc2giOiJhNDI5YjQ1NWQ1MzIyMDgwZTcwYWRlZWZjNjE4OTE4ZTU2MWEwMzIxYjI5OTQ1Yzk5NWRiMzQ1NDljMTYxZWRkIiwibW9kZWxfaGFzaCI6IjlhNTU1MmZjOTY2ZDVjNmQzMGVkZmFlMTdjNDY1YTcxYmE1NWY2YTk2N2Y1OTdhMGRmOTlhMDkxNGI5Yjc3NzUiLCJwcm9vZl90ZXJtX2hhc2giOiI0ZGUyYWVjY2JhMGYzZTdiYzA4ODM1OTM2NjlkMjUxN2JlMWEyMzI2N2E3ZTFhZGI2NWI0NjE0NGFmMWY3ZWNlIn0sImRvY3VtZW50IjoiY2FtcGFpZ24gY2VydGlmaWNhdGUiLCJmaWxlX3NoYTI1NiI6ImVjZTBiYzQ5MDNhYTgwMTk3OTEzOTlmMWE4ZmU2M2NlODUxZTMzNTA5NmM3NTY0MzYwNjg5YWRlNzgyODVmYzYiLCJpc3N1ZWQiOiIyMDI2LTA1LTI5IiwicmVsYXRpb24iOiJyZXN0YXRlbWVudC1vZi1zYW1lLWNvbXB1dGF0aW9uIn0sInByb2R1Y2VyIjp7Im5hbWUiOiJRcml0b24gVGVjaG5vbG9naWVzIFMuUi5MLiIsInByb2R1Y3QiOiJRcml0b24gU2lnbmFscyJ9LCJwcm9kdWNlcl9ydW50aW1lIjp7ImFyY2giOiJhcm02NCIsImV4ZWN1dGlvbl9wcm92aWRlciI6IkNQVUV4ZWN1dGlvblByb3ZpZGVyIiwiZ3JhcGhfb3B0aW1pemF0aW9uIjoicnVudGltZS1kZWZhdWx0IiwibGFuZ3VhZ2UiOiJweXRob24iLCJsYW5ndWFnZV92ZXJzaW9uIjoiMy4xNC43Iiwib3MiOiJtYWNPUyIsInJ1bnRpbWUiOiJvbm54cnVudGltZSIsInJ1bnRpbWVfdmVyc2lvbiI6IjEuMzEuMSJ9LCJzY29wZSI6eyJkb2VzX25vdF9wcm92ZSI6WyJkZXRlY3Rpb24tY29ycmVjdG5lc3MiLCJpbmRlcGVuZGVudC10aW1lIiwiY3VzdG9keS1vdXRzaWRlLXByb2R1Y2VyIiwiaW5wdXQtcHJvdmVuYW5jZSIsInByZWRlY2Vzc29yLXJlbGF0aW9uIl0sInByb3ZlcyI6WyJpbnB1dC1pbnRlZ3JpdHkiLCJtb2RlbC1pbnRlZ3JpdHkiLCJvdXRwdXQtaW50ZWdyaXR5IiwicmVwbGF5YWJpbGl0eSJdfSwic2lnbmF0dXJlIjp7ImFsZyI6ImVkMjU1MTkiLCJrZXlfaWQiOiIwMjdiZWY5MWM1N2U2NTgyZDY0YmU3Y2ViZDRmM2U1M2YxM2U0YWRlY2NiOWY4ODUyYmVmMTkxMTlkZTU5MzRiIiwic2lnIjoiMmNiMzU3Zjk0OGZiOTFhNGE2NTYzM2ZlZTg2YTUxZmRiYWEyZjU1ZGU4NWNkNTcxYWVkYjRiMTQ2ODg4MGM5NmVhNzZkMDNlYTc2MTM5MTRhMzIzOWMxODQ3NWE4NjEwNGE5OTk1YWJmYmVhZDBmMGE5ZGJkYWIyN2JhZGRlMDEifSwidG9sZXJhbmNlIjp7ImFic29sdXRlIjp7ImJpdHMiOiIzNjgwMDAwMCIsImRlYyI6IjAuMDAwMDAzODE0Njk3In0sInJlbGF0aXZlIjp7ImJpdHMiOiIzNjgwMDAwMCIsImRlYyI6IjAuMDAwMDAzODE0Njk3In0sInJ1bGUiOiJhYnNvbHV0ZS1vci1yZWxhdGl2ZSJ9LCJ2ZXJzaW9uIjoyfQ==","model.onnx":"(base64 of model.onnx of the sample pack, 3,139,900 bytes; abbreviated in this example)","window.npy":"(base64 of window.npy of the sample pack, 24,704 bytes; abbreviated in this example)","log/tree-head.json":"eyJmb3JtYXQiOiJxcml0b24ubG9nLXRyZWUtaGVhZCIsImlzc3VlZCI6eyJpbmRlcGVuZGVudGx5X2F0dGVzdGVkIjpmYWxzZSwidGltZV9zb3VyY2UiOiJsb2ctb3BlcmF0b3ItY2xvY2siLCJ0aW1lX3V0YyI6IjIwMjYtMTEtMTFUMjI6MDk6MjNaIn0sImxvZyI6eyJuYW1lIjoiUXJpdG9uIFNpZ25hbHMgY29tcHV0YXRpb24tcmVjb3JkIGxvZyAobG9jYWwgcHJvdG90eXBlKSIsIm9wZXJhdG9yIjoiUXJpdG9uIFRlY2hub2xvZ2llcyBTLlIuTC4iLCJvcGVyYXRvcl9pc19yZWNvcmRfcHJvZHVjZXIiOnRydWV9LCJyb290X2hhc2giOiJiNjQ3YzkzNDgwMzhiNmEwZTM0Y2MxYTRkMzQ1ODcyZjAzZjJjNzA1OWIxYTIwOTYyZjJmMWE3ZTlkYTUwZDgyIiwic2lnbmF0dXJlIjp7ImFsZyI6ImVkMjU1MTkiLCJrZXlfaWQiOiI0YzBkOWQ5ZjU0ZWIwYTIyYjc5ODQ0YTA0M2ZmZWJkNmRjODg4Y2YwYmZlNGM0ZTIxMDg2MWU2MmM5ODJjMWQzIiwic2lnIjoiZjExY2Y4NjczZTg1ODU0OTJjN2U4ZjdjNDBkYmYyOTc4N2ViOWEwN2NmMTdjZDM5MDE3M2EyNzQzMDY3ODk4YWZmYmEzMGJkNTA4OTdhNjQyNGZmNzA4ZjhlNjkyNTk0NzY0ZTc2NDljODcyMGI0ZTAzZGUwNWZmYTc3YWQzMDEifSwidHJlZV9zaXplIjoxMSwidmVyc2lvbiI6MX0=","log/tree-head-earlier.json":"eyJmb3JtYXQiOiJxcml0b24ubG9nLXRyZWUtaGVhZCIsImlzc3VlZCI6eyJpbmRlcGVuZGVudGx5X2F0dGVzdGVkIjpmYWxzZSwidGltZV9zb3VyY2UiOiJsb2ctb3BlcmF0b3ItY2xvY2siLCJ0aW1lX3V0YyI6IjIwMjYtMTEtMTFUMjI6MDk6MjNaIn0sImxvZyI6eyJuYW1lIjoiUXJpdG9uIFNpZ25hbHMgY29tcHV0YXRpb24tcmVjb3JkIGxvZyAobG9jYWwgcHJvdG90eXBlKSIsIm9wZXJhdG9yIjoiUXJpdG9uIFRlY2hub2xvZ2llcyBTLlIuTC4iLCJvcGVyYXRvcl9pc19yZWNvcmRfcHJvZHVjZXIiOnRydWV9LCJyb290X2hhc2giOiJjODA3MDA1M2E4MzY4YzFhYWFkOWU4ZWUwNWZlOWI2ZWY3MTU1ZWJiNTdkMGNhZTJmZDJkMzU3ODkyMmQ0MjQ5Iiwic2lnbmF0dXJlIjp7ImFsZyI6ImVkMjU1MTkiLCJrZXlfaWQiOiI0YzBkOWQ5ZjU0ZWIwYTIyYjc5ODQ0YTA0M2ZmZWJkNmRjODg4Y2YwYmZlNGM0ZTIxMDg2MWU2MmM5ODJjMWQzIiwic2lnIjoiYTY1N2MyMTA4NWVjNjY2MGE0YTc2ODdjOTk0MTQ1NTllMzBiMWFlMmZkMDg5NmQ2OGM1YWM4ZjhlZGY2ZGRmODU1ZmZmZDc2YTUyNzdlNTVhOWJkNWI0MWZjODgyNzQ5OGY4NjU0N2ViOTA3MDUzMDgxODkwMWFkZTUzOGMwMGYifSwidHJlZV9zaXplIjo2LCJ2ZXJzaW9uIjoxfQ==","log/inclusion-proof.json":"eyJmb3JtYXQiOiJxcml0b24ubG9nLWluY2x1c2lvbi1wcm9vZiIsImxlYWZfaW5kZXgiOjYsInBhdGgiOlsiYWQ0NDlkZGE1ZWNkMDIzOWVkMGZmN2Y5MmU2N2E1MTM2YjU3OWMxYTE2YjA3NWE0YjBlY2ZlMjY4ODNjNjMwYiIsImZlN2E5MjdkMWQyYzc0NDNmYmY3NDM2N2IxZWM3NTA2NmI4MjYxMWMwODAwNmEwODQ1YmQ4YzgxZjkxNDJhZjUiLCI0ZTczN2UxNzZkZWIwNWQ0NDNlODYxNTcwZjYxOGFiNWQyMWIyNmM5ZjU4ZmUzMDQ3YTg1NjZmNzk4MTg1NGMzIiwiZTU3NzkwZGFhNWM0ZTY0YWRmYWZlZmM3NWQ3YjVkNjE3NjUyNzJhNzA1MjEzZTQ5OTE4NjUyNWY2NjkzOWJiOSJdLCJ0cmVlX3NpemUiOjExLCJ2ZXJzaW9uIjoxfQ==","log/consistency-proof.json":"eyJmaXJzdF90cmVlX3NpemUiOjYsImZvcm1hdCI6InFyaXRvbi5sb2ctY29uc2lzdGVuY3ktcHJvb2YiLCJwYXRoIjpbImZlN2E5MjdkMWQyYzc0NDNmYmY3NDM2N2IxZWM3NTA2NmI4MjYxMWMwODAwNmEwODQ1YmQ4YzgxZjkxNDJhZjUiLCJkZGNlNTI2Njc1MmY1OGFkZTM2N2VkMjA0OGE2MjEzZDkyZjUzM2NlMzZjN2EzMmM0NTAyYTBjZjMwYzBlY2JmIiwiNGU3MzdlMTc2ZGViMDVkNDQzZTg2MTU3MGY2MThhYjVkMjFiMjZjOWY1OGZlMzA0N2E4NTY2Zjc5ODE4NTRjMyIsImU1Nzc5MGRhYTVjNGU2NGFkZmFmZWZjNzVkN2I1ZDYxNzY1MjcyYTcwNTIxM2U0OTkxODY1MjVmNjY5MzliYjkiXSwic2Vjb25kX3RyZWVfc2l6ZSI6MTEsInZlcnNpb24iOjF9","log/entries.json":"eyJlbnRyaWVzIjpbeyJlbnRyeV90eXBlIjoiZmlsbGVyIiwiZmlsbGVyX251bWJlciI6MSwibm90ZSI6InByb3RvdHlwZSBmaWxsZXIgZW50cnk7IG5vdCBhIGNvbXB1dGF0aW9uIHJlY29yZCJ9LHsiZW50cnlfdHlwZSI6ImZpbGxlciIsImZpbGxlcl9udW1iZXIiOjIsIm5vdGUiOiJwcm90b3R5cGUgZmlsbGVyIGVudHJ5OyBub3QgYSBjb21wdXRhdGlvbiByZWNvcmQifSx7ImVudHJ5X3R5cGUiOiJmaWxsZXIiLCJmaWxsZXJfbnVtYmVyIjozLCJub3RlIjoicHJvdG90eXBlIGZpbGxlciBlbnRyeTsgbm90IGEgY29tcHV0YXRpb24gcmVjb3JkIn0seyJlbnRyeV90eXBlIjoiZmlsbGVyIiwiZmlsbGVyX251bWJlciI6NCwibm90ZSI6InByb3RvdHlwZSBmaWxsZXIgZW50cnk7IG5vdCBhIGNvbXB1dGF0aW9uIHJlY29yZCJ9LHsiZW50cnlfdHlwZSI6ImZpbGxlciIsImZpbGxlcl9udW1iZXIiOjUsIm5vdGUiOiJwcm90b3R5cGUgZmlsbGVyIGVudHJ5OyBub3QgYSBjb21wdXRhdGlvbiByZWNvcmQifSx7ImVudHJ5X3R5cGUiOiJmaWxsZXIiLCJmaWxsZXJfbnVtYmVyIjo2LCJub3RlIjoicHJvdG90eXBlIGZpbGxlciBlbnRyeTsgbm90IGEgY29tcHV0YXRpb24gcmVjb3JkIn0seyJlbnRyeV90eXBlIjoiY29tcHV0YXRpb24tcmVjb3JkIiwicmVjb3JkX3NoYTI1NiI6ImIwNmVkNzJlZGY3ZDIyZjA5NzI3NzQwMTAwOTcwYmM5ZTEzNDk2ZTE4YTgyOGQ5YzNkM2YxYzBhOTgyMmNhODcifSx7ImVudHJ5X3R5cGUiOiJmaWxsZXIiLCJmaWxsZXJfbnVtYmVyIjo3LCJub3RlIjoicHJvdG90eXBlIGZpbGxlciBlbnRyeTsgbm90IGEgY29tcHV0YXRpb24gcmVjb3JkIn0seyJlbnRyeV90eXBlIjoiZmlsbGVyIiwiZmlsbGVyX251bWJlciI6OCwibm90ZSI6InByb3RvdHlwZSBmaWxsZXIgZW50cnk7IG5vdCBhIGNvbXB1dGF0aW9uIHJlY29yZCJ9LHsiZW50cnlfdHlwZSI6ImZpbGxlciIsImZpbGxlcl9udW1iZXIiOjksIm5vdGUiOiJwcm90b3R5cGUgZmlsbGVyIGVudHJ5OyBub3QgYSBjb21wdXRhdGlvbiByZWNvcmQifSx7ImVudHJ5X3R5cGUiOiJmaWxsZXIiLCJmaWxsZXJfbnVtYmVyIjoxMCwibm90ZSI6InByb3RvdHlwZSBmaWxsZXIgZW50cnk7IG5vdCBhIGNvbXB1dGF0aW9uIHJlY29yZCJ9XSwiZm9ybWF0IjoicXJpdG9uLmxvZy1lbnRyaWVzIiwidmVyc2lvbiI6MX0=","untrusted-key-copy.json":"eyJmb3JtYXQiOiJxcml0b24udHJ1c3RlZC1rZXlzIiwia2V5cyI6W3siaG9sZGVyIjoiUXJpdG9uIFRlY2hub2xvZ2llcyBTLlIuTC4gLSByZWNvcmQgc2lnbmluZyBrZXkgKHByb3RvdHlwZSwga2VwdCBvbiBhIHByb2R1Y2VyIHdvcmtzdGF0aW9uKSIsImtleV9pZCI6IjAyN2JlZjkxYzU3ZTY1ODJkNjRiZTdjZWJkNGYzZTUzZjEzZTRhZGVjY2I5Zjg4NTJiZWYxOTExOWRlNTkzNGIiLCJwdWJsaWNfa2V5IjoiZDZlZThjZmQ2ODAyNDdkMTQ5OWQ2NjBiZDViYTdkNzhiYTQ0YjdhNzI4Zjk0YjgxZGI4OWU3ZWVmYTgwOWVhMiIsInJvbGUiOiJyZWNvcmQtc2lnbmluZyJ9LHsiaG9sZGVyIjoiUXJpdG9uIFRlY2hub2xvZ2llcyBTLlIuTC4gLSBsb2cgc2lnbmluZyBrZXkgKHByb3RvdHlwZSwga2VwdCBvbiBhIHByb2R1Y2VyIHdvcmtzdGF0aW9uKSIsImtleV9pZCI6IjRjMGQ5ZDlmNTRlYjBhMjJiNzk4NDRhMDQzZmZlYmQ2ZGM4ODhjZjBiZmU0YzRlMjEwODYxZTYyYzk4MmMxZDMiLCJwdWJsaWNfa2V5IjoiNjRmYWUyNmJhZDAxODJjNWRiMmVhZDEyZDUzNDJkMTc5ODQwYzY2M2UzM2VmNDA4MzE3NzJlNTJhZThlY2MyYiIsInJvbGUiOiJsb2ctc2lnbmluZyJ9XSwidmVyc2lvbiI6MX0="},"trusted_keys":"{\"format\":\"qriton.trusted-keys\",\"keys\":[{\"holder\":\"Qriton Technologies S.R.L. - record signing key (prototype, kept on a producer workstation)\",\"key_id\":\"027bef91c57e6582d64be7cebd4f3e53f13e4adeccb9f8852bef19119de5934b\",\"public_key\":\"d6ee8cfd680247d1499d660bd5ba7d78ba44b7a728f94b81db89e7eefa809ea2\",\"role\":\"record-signing\"},{\"holder\":\"Qriton Technologies S.R.L. - log signing key (prototype, kept on a producer workstation)\",\"key_id\":\"4c0d9d9f54eb0a22b79844a043ffebd6dc888cf0bfe4c4e210861e62c982c1d3\",\"public_key\":\"64fae26bad0182c5db2ead12d5342d179840c663e33ef40831772e52ae8ecc2b\",\"role\":\"log-signing\"}],\"version\":1}","replay":"signed"}'
Example response
{
"verdict": "PASS",
"verifier_verdict": "PASS",
"summary": "Every step of the specification passed under the trusted keys supplied.",
"signature_trust": {
"established": true,
"source": "caller",
"trusted_keys_sha256": "3e4a459d9552ee417b2c7e0da3f9cd4a9b1c8a59cf49b6f93e637f9fb4860cd8",
"message": "Signatures were checked against the trusted keys supplied with the request. The result is worth as much as your confidence in where those keys came from."
},
"replay_policy": "signed",
"replay_accepted": "yes",
"checks": [
{
"id": "s01_trusted_keys",
"title": "Trusted keys",
"description": "The trusted-keys file supplied by the caller lies outside the pack, is canonical and well formed, and every key identifier and key encoding is in order.",
"code": "TRUST_OK",
"result": "pass"
},
{
"id": "s02_record",
"title": "Record form",
"description": "record.json is canonical JSON of the closed form of the specification: tolerance at or below the ceiling, the fixed scope block, and every decimal equal to the rendering of its bit pattern.",
"code": "RECORD_OK",
"result": "pass"
},
{
"id": "s03_signature",
"title": "Record signature",
"description": "The record's Ed25519 signature verifies under a trusted key with the role record-signing.",
"code": "SIG_OK",
"result": "pass"
},
{
"id": "s04_input",
"title": "Input file",
"description": "window.npy has the one accepted header form (float32, little-endian, C order; nothing is unpickled), the recorded shape and the recorded SHA-256 of its data bytes.",
"code": "INPUT_OK",
"result": "pass"
},
{
"id": "s05_model_digest",
"title": "Model digest",
"description": "model.onnx has the recorded length and SHA-256.",
"code": "MODEL_DIGEST_OK",
"result": "pass"
},
{
"id": "s06_model_profile",
"title": "Model acceptance",
"description": "model.onnx is self-contained and within the accepted profile: no external data, no custom operator domain, no graph-valued attributes, one operator-set import equal to the declared one, and the declared node, initializer, input and output names.",
"code": "MODEL_PROFILE_OK",
"result": "pass"
},
{
"id": "s07_trace",
"title": "Trace digest",
"description": "The trace digest recomputed from the record's own outputs equals the recorded one.",
"code": "TRACE_OK",
"result": "pass"
},
{
"id": "s08_tree_head",
"title": "Tree head",
"description": "log/tree-head.json is canonical, well formed and signed by a trusted key with the role log-signing.",
"code": "STH_OK",
"result": "pass"
},
{
"id": "s09_earlier_tree_head",
"title": "Earlier tree head",
"description": "log/tree-head-earlier.json is canonical, well formed and signed by a trusted key with the role log-signing.",
"code": "STH_OK",
"result": "pass"
},
{
"id": "s10_inclusion",
"title": "Inclusion proof",
"description": "The inclusion proof shows that the record's leaf, computed from the record file itself, is in the tree of the tree head.",
"code": "INCLUSION_OK",
"result": "pass"
},
{
"id": "s11_consistency",
"title": "Consistency proof",
"description": "The consistency proof shows that the earlier tree is a prefix of the later tree.",
"code": "CONSISTENCY_OK",
"result": "pass"
},
{
"id": "s12_log_entries",
"title": "Log entries",
"description": "The entry list, if present, agrees with both tree heads and contains the record's entry.",
"code": "ENTRIES_OK",
"result": "pass"
},
{
"id": "s13_pack_keys",
"title": "Key copy in the pack",
"description": "The key copy in the pack, if present, offers only keys that are in the trusted-keys file. No key from the pack is ever used to check a signature.",
"code": "PACK_KEYS_CONSISTENT",
"result": "pass"
},
{
"id": "s14_replay",
"title": "Replay",
"description": "The model is run on the input with ONNX Runtime on the CPU, from the bytes that were hashed, and every output bit is compared with the record, exactly or within the signed tolerance.",
"code": "REPLAY_EXACT",
"result": "pass"
}
],
"computed": {
"input_sha256": "7f72c8346e0965d2cd6ebc8189c044083645fcbc9f5a07d7c504dabe339cdc9b",
"leaf_hash": "7a235e1f544f9c8ee7723be4397c8a4ba08796d7716489a15177907e07375c78",
"model_sha256": "40bf2492b9b63d5678a21a5ee81ce355406deb1e48d356637432902ef2f9b451",
"record_sha256": "b06ed72edf7d22f09727740100970bc9e13496e18a828d9c3d3f1c0a9822ca87",
"signed_message_sha256": "c942af9dff53282ec70c8b259043532ac1872b63ff982dbac856440210990aa2",
"trace_sha256": "a50362535cc4cb3c7e79e06ff2cf2d808cdd1295db2178e578cf1f7c4c16c762"
},
"subject": {
"case_label": "sample record",
"created_time_utc": "2026-11-11T22:09:23Z",
"producer_name": "Qriton Technologies S.R.L."
},
"log_operator_is_record_producer": "yes",
"replay": {
"largest_abs_deviation": "0.000000000000",
"largest_rel_deviation": "0.000000000000",
"outputs": [
{
"name": "coordination_logit",
"values": [
{
"abs_deviation": "0.000000000000",
"recorded_bits": "3f902503",
"rel_deviation": "0.000000000000",
"replayed_bits": "3f902503",
"status": "exact",
"ulp_distance": "0"
}
]
},
{
"name": "layer_energy",
"values": [
{
"abs_deviation": "0.000000000000",
"recorded_bits": "42173412",
"rel_deviation": "0.000000000000",
"replayed_bits": "42173412",
"status": "exact",
"ulp_distance": "