Verification API

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.

Limitations

  • Receipt chains are not signed. A receipt chain carries no signature. A valid result shows that the chain agrees with the published rule; it does not show who wrote the chain, and an unsigned chain held only by one party does not prove that this party did not rewrite the history.
  • A cut-off or re-hashed chain needs an expected head. Without an expected head, a chain that was shortened at the end, or altered and then fully re-hashed, is still reported as link-valid. Supply the head you obtained through a separate channel as expected_head to detect both.
  • Receipts are checked for integrity, not for truth. The service checks that the receipts were not altered after they were written. It does not check that the operations they describe took place, or that their timestamps are correct; the timestamps come from the clock of the machine that wrote them.
  • Size of a receipt chain. A request may hold at most 10000 receipts and 5 MB. Numbers with a fraction or an exponent, which the hash rule does not cover, make a receipt fail, and an object with a duplicate key is refused.
  • Signature trust rests on the keys you supply. Signatures of a computation record are checked only against the trusted keys sent with the request. The service never uses a key found inside the pack. Without trusted keys the response states that signature trust was not established. A result is worth as much as your confidence in where your keys came from.
  • A log run by the producer. When the log is operated by the producer of the records, both tree heads arrive in the same pack. The inclusion and consistency proofs show that the files of one pack agree with each other; they do not show that the producer has only one log or shows the same log to everyone.
  • No time is independently attested. Every time in a computation record or a tree head comes from the clock of the producer or of the log operator. Nothing in a verification shows that a record existed at the time it states.
  • Replay depends on the machine. Replay runs the model with ONNX Runtime 1.31.1 on the CPU of the server that runs this service. Results can differ in the last bits between machines and runtime releases. The response states whether the replay was exact, within the tolerance signed in the record, or outside it, with the deviation of every value.
  • Replay executes the model you send. Replay executes the model file of the pack after the model acceptance check of the specification, which refuses external data, custom operator domains and control flow. That check limits what a model can ask the runtime to do; it is not a sandbox. Each verification runs in a separate process that is stopped after 60 seconds or when it exceeds 1536 MB of memory.
  • Size and form of a pack. A pack may be at most 10 MB as sent and 24 MB unpacked. Only the nine files named in the specification are read. Version 2 supports one float32 input tensor and float32 outputs only.
  • A passing record does not show that a detection is right. A passing computation record shows that a computation took place as stated. It does not show that the flagged material is coordinated, that the model is accurate, or that the input numbers were derived correctly from the material they stand for.
  • Independent checking. The responses of this service are not signed and are statements by its operator. For a result that does not depend on us, run the published verifiers on your own machine; they need neither our code nor our server.

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)

FieldTypeDescription
receiptsarray of object
jsonlstringThe chain as JSON Lines text: one receipt per line; blank lines are skipped.
expected_headstring or nullThe head you hold from a separate channel. Compared without regard to letter case.

Responses

200The 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.
401Missing 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

NameInTypeDescription
trusted_keysquerystringOnly for application/zip bodies: the trusted-keys file, base64 or base64url.
replayquerystring: "signed", "always", "never"Only for application/zip bodies: the replay policy.

Request body (application/json, multipart/form-data, application/zip)

FieldTypeDescription
packobjectPack 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_zipstring
trusted_keysstring or object or array of objectThe 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).
replaystring: "signed", "always", "never"

Responses

200The 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.
401Missing 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": "

GET /v1/verify/specs

List the specifications

Responses

200The published specifications.
400`method_not_allowed`: The endpoint does not accept this HTTP method.
401Missing or invalid API key.
500`internal_error`: An unexpected error occurred.

Example request

curl -X GET "https://api.qriton.com/v1/verify/specs" \
  -H "Authorization: Bearer $QRITON_API_KEY"

Example response

{
  "specs": [
    {
      "name": "receipt-chain",
      "title": "Receipt chain: format and verification rule",
      "description": "The format of a hash chain of receipts for operations on a model memory (inject, edit, forget), and the rule for verifying it.",
      "media_type": "text/markdown; charset=utf-8",
      "bytes": 2338,
      "sha256": "24ed7fd1e2e6743274981ab6432c28d129d05cd70bfc9bcc22eb971295693876",
      "url": "/specs/receipt-chain",
      "verified_by": "/receipts"
    },
    {
      "name": "computation-record-v2",
      "title": "Computation record v2: format and verification",
      "description": "A signed record of one model computation, with input, model and output digests, an append-only log with inclusion and consistency proofs, replay rules, the fourteen verification steps, the tamper suite and test vectors.",
      "media_type": "text/markdown; charset=utf-8",
      "bytes": 136789,
      "sha256": "9ca0a95903404beed6bbf4989d5c52648fbfee44ea798e392553b0a13792fc32",
      "url": "/specs/computation-record-v2",
      "verified_by": "/records"
    }
  ]
}

GET /v1/verify/specs/{name}

Get one specification as Markdown text

Parameters

NameInTypeDescription
name requiredpathstring: "receipt-chain", "computation-record-v2"

Responses

200The specification, as published in the open verifier package.
400`method_not_allowed`: The endpoint does not accept this HTTP method.
401Missing or invalid API key.
404`not_found`: No such endpoint or file.
500`internal_error`: An unexpected error occurred.

Example request

curl -X GET "https://api.qriton.com/v1/verify/specs/{name}" \
  -H "Authorization: Bearer $QRITON_API_KEY"

Example response

"# Receipt chain: format and verification rule\n\nThis is everything needed to write your own verifier. ..."

GET /v1/verify/verifiers

List the published verifier archives with their SHA-256

Responses

200The open verifier package and the sample trusted keys.
400`method_not_allowed`: The endpoint does not accept this HTTP method.
401Missing or invalid API key.
500`internal_error`: An unexpected error occurred.

Example request

curl -X GET "https://api.qriton.com/v1/verify/verifiers" \
  -H "Authorization: Bearer $QRITON_API_KEY"

Example response

{
  "package": "qriton-open-verifiers",
  "version": "1.0.0",
  "licence": "MIT",
  "copyright": "Qriton Technologies S.R.L.",
  "files": [
    {
      "name": "qriton-open-verifiers-1.0.0.zip",
      "bytes": 163727,
      "sha256": "12da34f0e60ee3f7e3672fdf88714b663d36ce3c0b9b8b3b1a1159337cad2c50",
      "media_type": "application/zip",
      "url": "/verifiers/qriton-open-verifiers-1.0.0.zip",
      "description": "The open verifier package as a ZIP archive: both specifications, the receipt-chain verifiers in Python and JavaScript, the computation record v2 verifiers in Python and JavaScript (without installed packages), the sample chain and the sample pack with their altered copies and expected results, a README and the MIT licence."
    },
    {
      "name": "qriton-open-verifiers-1.0.0.tar.gz",
      "bytes": 130786,
      "sha256": "7bd48aa9222e289ddf7b07255cf5cf26d4e64639d6bca6e8219ec03e8932ac55",
      "media_type": "application/gzip",
      "url": "/verifiers/qriton-open-verifiers-1.0.0.tar.gz",
      "description": "The same package as a gzip-compressed tar archive."
    }
  ],
  "checksums": {
    "name": "SHA256SUMS",
    "url": "/verifiers/SHA256SUMS",
    "format": "one line per file: 64 hexadecimal digits, two spaces, the file name; check with shasum -a 256 -c or sha256sum -c"
  },
  "verifiers": [
    {
      "format": "receipt-chain",
      "language": "Python 3.8 or newer",
      "file": "receipt-chain/verify_chain.py",
      "dependencies": [],
      "version": "1.0.0"
    },
    {
      "format": "receipt-chain",
      "language": "JavaScript, Node.js 18 or newer",
      "file": "receipt-chain/verify_chain.mjs",
      "dependencies": [],
      "version": "1.0.0"
    },
    {
      "format": "computation-record-v2",
      "language": "Python 3.8 or newer",
      "file": "computation-record-v2/verifier-python/verify_record.py",
      "dependencies": [
        "numpy and onnxruntime, for the replay step only"
      ],
      "version": "1.0.0"
    },
    {
      "format": "computation-record-v2",
      "language": "JavaScript, Node.js 20.11 or newer",
      "file": "computation-record-v2/verifier-node/verify_record.mjs",
      "dependencies": [
        "onnxruntime-node 1.31.1, for the replay step only"
      ],
      "version": "1.0.0"
    }
  ],
  "note": "The package lets anyone check a receipt chain or a computation record without this service. A result from this service is a statement by its operator; a result from the published verifiers, run by you, is a statement by you."
}

GET /v1/verify/verifiers/{file}

Download a published file

One of the files listed by GET /verifiers, or SHA256SUMS. A file is served only while its content matches the digest in SHA256SUMS.

Parameters

NameInTypeDescription
file requiredpathstring: "qriton-open-verifiers-1.0.0.zip", "qriton-open-verifiers-1.0.0.tar.gz", "SHA256SUMS"

Responses

200The file.
400`method_not_allowed`: The endpoint does not accept this HTTP method.
401Missing or invalid API key.
404`not_found`: No such endpoint or file.
500`internal_error`: An unexpected error occurred.

Example request

curl -X GET "https://api.qriton.com/v1/verify/verifiers/{file}" \
  -H "Authorization: Bearer $QRITON_API_KEY"