{"openapi":"3.1.0","info":{"title":"Qriton API","version":"1.0.0","description":"Verification, Memory, Spatial Memory and Signals APIs of Qriton Technologies S.R.L. Authenticate with an API key from the console, sent as \"Authorization: Bearer <key>\".","contact":{"name":"Qriton Technologies S.R.L.","email":"office@qriton.com"}},"servers":[{"url":"https://api.qriton.com"}],"security":[{"bearer":[]}],"tags":[{"name":"Account"},{"name":"Verification API"},{"name":"Memory API"},{"name":"Signals API"},{"name":"Spatial Memory API"}],"paths":{"/v1/account":{"get":{"tags":["Account"],"summary":"Plan, quota and billing state of the key's account","operationId":"getAccount","description":"Returns the plan that applies now, the allowance of the current window and how much of it is used. Not counted toward the quota.","responses":{"200":{"description":"The account summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSummary"}}}},"401":{"description":"Missing or invalid key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/usage":{"get":{"tags":["Account"],"summary":"Usage statistics per day, key and operation","operationId":"getUsage","description":"Calls, calls counted toward the quota, errors, rate-limited calls and latency bands (p50, p95) for the account, by day, by key and by operation. At most 92 days per request. Not counted toward the quota.","parameters":[{"name":"from","in":"query","schema":{"type":"string","format":"date"},"description":"First day, YYYY-MM-DD. Default: 30 days before `to`."},{"name":"to","in":"query","schema":{"type":"string","format":"date"},"description":"Day after the last day, YYYY-MM-DD. Default: tomorrow (UTC)."}],"responses":{"200":{"description":"Usage statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"description":"Invalid range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/verify/receipts":{"post":{"tags":["Verification API"],"operationId":"verifyReceiptChain","summary":"Verify a receipt chain","description":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_ReceiptsRequest"},"examples":{"sample_chain":{"summary":"The published sample chain of 42 receipts, with its head","value":{"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"}}}}}},"responses":{"200":{"description":"The verification result. A chain that fails a check is a successful request with valid set to false.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_ReceiptsResponse"},"examples":{"sample_chain":{"summary":"The sample chain: link-valid, head matches","value":{"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."]}}},"tail_cut_off":{"summary":"The sample chain with its last four receipts cut off: link-valid, head does not match","value":{"valid":false,"links_valid":true,"verified":false,"length":38,"head":"7029f44182a05a3f03f606b9e45a5dacda71d139667f45f36eec8301f519405a","expected_head":"dc5b598fa713a97c6100b851cb174e21dbf37e08a780a734efad17ef9dcea2d4","head_matches_expected":false,"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":38},{"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":38},{"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":38},{"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":38},{"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":"fail","receipts_checked":1}],"stops_at_first_failure":true,"summary":"The chain is link-valid but its head does not match the expected head: it was shortened, extended or rewritten, or the expected head belongs to another chain.","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."]}}}}}}},"400":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_json","message":"The request body is not valid JSON.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body exceeds the size limit of the endpoint.","details":{}}}}}},"422":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"empty_chain","message":"The chain contains no receipts.","details":{}}}}}},"500":{"description":"`internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/verify/records":{"post":{"tags":["Verification API"],"operationId":"verifyComputationRecord","summary":"Verify a computation record v2 pack","description":"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":"trusted_keys","in":"query","required":false,"description":"Only for application/zip bodies: the trusted-keys file, base64 or base64url.","schema":{"type":"string"}},{"name":"replay","in":"query","required":false,"description":"Only for application/zip bodies: the replay policy.","schema":{"type":"string","enum":["signed","always","never"],"default":"signed"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_RecordsRequest"},"examples":{"sample_pack":{"summary":"The published sample pack with its trusted keys (the two large members are abbreviated here)","value":{"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\",\"key_id\":\"027bef91c57e6582d64be7cebd4f3e53f13e4adeccb9f8852bef19119de5934b\",\"public_key\":\"d6ee8cfd680247d1499d660bd5ba7d78ba44b7a728f94b81db89e7eefa809ea2\",\"role\":\"record-signing\"},{\"holder\":\"Qriton Technologies S.R.L. - log signing key\",\"key_id\":\"4c0d9d9f54eb0a22b79844a043ffebd6dc888cf0bfe4c4e210861e62c982c1d3\",\"public_key\":\"64fae26bad0182c5db2ead12d5342d179840c663e33ef40831772e52ae8ecc2b\",\"role\":\"log-signing\"}],\"version\":1}","replay":"signed"}}}},"multipart/form-data":{"schema":{"type":"object","required":["pack"],"properties":{"pack":{"type":"string","contentMediaType":"application/zip","description":"The pack as a ZIP file."},"trusted_keys":{"type":"string","description":"The trusted-keys file (SPEC section 9.4), exactly as you obtained it."},"replay":{"type":"string","enum":["signed","always","never"],"default":"signed"}}}},"application/zip":{"schema":{"type":"string","contentMediaType":"application/zip","description":"The pack as a ZIP file."}}}},"responses":{"200":{"description":"The verification result. A pack that fails a step is a successful request with verdict FAIL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_RecordsResponse"},"examples":{"sample_pack":{"summary":"The sample pack with its trusted keys: PASS, replay exact","value":{"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":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"423a4698","rel_deviation":"0.000000000000","replayed_bits":"423a4698","status":"exact","ulp_distance":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"3f1e8184","rel_deviation":"0.000000000000","replayed_bits":"3f1e8184","status":"exact","ulp_distance":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"42ff2066","rel_deviation":"0.000000000000","replayed_bits":"42ff2066","status":"exact","ulp_distance":"0"}]}],"structure":"as-recorded","trace_sha256":"a50362535cc4cb3c7e79e06ff2cf2d808cdd1295db2178e578cf1f7c4c16c762"},"scope":{"shows":[{"code":"input-integrity","text":"The data in window.npy are, bit for bit, the input the producer signed for.","established":true},{"code":"model-integrity","text":"model.onnx, graph and weights, is byte for byte the file the producer signed for, and is self-contained.","established":true},{"code":"output-integrity","text":"The outputs in the record are the ones the producer signed, and they agree with the trace digest.","established":true},{"code":"replayability","text":"An independent runtime, run on that model and that input under the execution settings of the specification, gives those outputs exactly or within the signed tolerance. This is established only when the replay step ran and passed.","established":true}],"does_not_show":[{"code":"detection-correctness","text":"That the flagged posts are in fact coordinated, or that the model is accurate, calibrated or fit for the purpose."},{"code":"independent-time","text":"That the record existed at its stated creation time or at any other time. All times are the producer's or the log operator's own."},{"code":"custody-outside-producer","text":"That any copy of the record, or the log, is beyond the producer's control. The producer may run the log."},{"code":"input-provenance","text":"That the input numbers were derived correctly from the posts they stand for, or which posts those are."},{"code":"predecessor-relation","text":"What the predecessor member says about an earlier certificate. A verifier checks only its form."}],"not_yet_given":["Independent time-stamping. Every time in a record or a tree head comes from the clock of the producer or of the log operator, who are the same organisation.","A log run by someone other than the producer. 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, shows the same log to everyone, or has not rebuilt it.","Bit-exact replay across machines. On another machine or runtime release the replay may be exact, within tolerance, or outside it.","Proof that the detection is right. A record certifies that a computation took place as stated, not that its result is correct.","Privacy of the input when it is shared. Replay needs the input, so the pack contains it, and numerical representations of text can reveal things about the text.","Rotation or revocation of keys, signed verification reports, element types other than float32, more than one input tensor, and a safe way to run a model of unknown origin."],"record_scope":{"does_not_prove":["detection-correctness","independent-time","custody-outside-producer","input-provenance","predecessor-relation"],"proves":["input-integrity","model-integrity","output-integrity","replayability"]}},"environment":{"arch":"arm64","crypto_library":"node:crypto, OpenSSL 4.1.0","execution_provider":"cpu","graph_optimization":"runtime default","language":"javascript-node","language_version":"26.12.1","os":"macOS","overlay":"","pack":"pack","runtime":"onnxruntime-node","runtime_loaded":"yes","runtime_version":"1.31.1","started_utc":"2026-11-14T21:22:53Z","threads":"runtime default","trusted_keys":"trusted-keys.json","verifier":"verify_record.mjs","verifier_version":"1.0.0"},"reference_report":{"computed":{"input_sha256":"7f72c8346e0965d2cd6ebc8189c044083645fcbc9f5a07d7c504dabe339cdc9b","leaf_hash":"7a235e1f544f9c8ee7723be4397c8a4ba08796d7716489a15177907e07375c78","model_sha256":"40bf2492b9b63d5678a21a5ee81ce355406deb1e48d356637432902ef2f9b451","record_sha256":"b06ed72edf7d22f09727740100970bc9e13496e18a828d9c3d3f1c0a9822ca87","signed_message_sha256":"c942af9dff53282ec70c8b259043532ac1872b63ff982dbac856440210990aa2","trace_sha256":"a50362535cc4cb3c7e79e06ff2cf2d808cdd1295db2178e578cf1f7c4c16c762"},"environment":{"arch":"arm64","crypto_library":"node:crypto, OpenSSL 4.1.0","execution_provider":"cpu","graph_optimization":"runtime default","language":"javascript-node","language_version":"26.12.1","os":"macOS","overlay":"","pack":"pack","runtime":"onnxruntime-node","runtime_loaded":"yes","runtime_version":"1.31.1","started_utc":"2026-11-14T21:22:53Z","threads":"runtime default","trusted_keys":"trusted-keys.json","verifier":"verify_record.mjs","verifier_version":"1.0.0"},"exit_code":0,"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":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"423a4698","rel_deviation":"0.000000000000","replayed_bits":"423a4698","status":"exact","ulp_distance":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"3f1e8184","rel_deviation":"0.000000000000","replayed_bits":"3f1e8184","status":"exact","ulp_distance":"0"},{"abs_deviation":"0.000000000000","recorded_bits":"42ff2066","rel_deviation":"0.000000000000","replayed_bits":"42ff2066","status":"exact","ulp_distance":"0"}]}],"structure":"as-recorded","trace_sha256":"a50362535cc4cb3c7e79e06ff2cf2d808cdd1295db2178e578cf1f7c4c16c762"},"replay_accepted":"yes","replay_policy":"signed","report":"qriton.computation-record.verification-report","report_version":1,"scope":{"does_not_prove":["detection-correctness","independent-time","custody-outside-producer","input-provenance","predecessor-relation"],"proves":["input-integrity","model-integrity","output-integrity","replayability"]},"steps":{"s01_trusted_keys":"TRUST_OK","s02_record":"RECORD_OK","s03_signature":"SIG_OK","s04_input":"INPUT_OK","s05_model_digest":"MODEL_DIGEST_OK","s06_model_profile":"MODEL_PROFILE_OK","s07_trace":"TRACE_OK","s08_tree_head":"STH_OK","s09_earlier_tree_head":"STH_OK","s10_inclusion":"INCLUSION_OK","s11_consistency":"CONSISTENCY_OK","s12_log_entries":"ENTRIES_OK","s13_pack_keys":"PACK_KEYS_CONSISTENT","s14_replay":"REPLAY_EXACT"},"subject":{"case_label":"sample record","created_time_utc":"2026-11-11T22:09:23Z","producer_name":"Qriton Technologies S.R.L."},"trusted_keys_sha256":"3e4a459d9552ee417b2c7e0da3f9cd4a9b1c8a59cf49b6f93e637f9fb4860cd8","verdict":"PASS"}}},"no_trusted_keys":{"summary":"The same pack without trusted keys: signature trust not established","value":{"verdict":"TRUST_NOT_ESTABLISHED","verifier_verdict":"FAIL","summary":"No step that can be decided without trusted keys failed, but signature trust was not established because no trusted keys were supplied.","signature_trust":{"established":false,"source":"none","trusted_keys_sha256":null,"message":"No trusted keys were supplied, so signature trust was not established. The key copy inside the pack was not used: the specification requires that the key which counts reaches the checker by a separate route. Every check that does not depend on a trusted key was run."},"replay_policy":"signed","replay_accepted":"not_decided","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":"TRUSTED_KEYS_NOT_SUPPLIED","result":"not_established","note":"No trusted keys were supplied. The reference verifier ran with placeholder keys that nobody holds, so that no key from the pack could be trusted."},{"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_KEY_UNTRUSTED","result":"not_established","note":"This step depends on trusted keys, and none were supplied."},{"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_KEY_UNTRUSTED","result":"not_established","note":"This step depends on trusted keys, and none were supplied."},{"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_KEY_UNTRUSTED","result":"not_established","note":"This step depends on trusted keys, and none were supplied."},{"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_CONFLICT","result":"not_established","note":"This step depends on trusted keys, and none were supplied."},{"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":"NOT_EVALUATED","result":"not_established","note":"Under the replay policy signed, the model is run only after the record signature has been found valid under a trusted key."}],"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":{},"scope":{"shows":[{"code":"input-integrity","text":"The data in window.npy are, bit for bit, the input the producer signed for.","established":false},{"code":"model-integrity","text":"model.onnx, graph and weights, is byte for byte the file the producer signed for, and is self-contained.","established":false},{"code":"output-integrity","text":"The outputs in the record are the ones the producer signed, and they agree with the trace digest.","established":false},{"code":"replayability","text":"An independent runtime, run on that model and that input under the execution settings of the specification, gives those outputs exactly or within the signed tolerance. This is established only when the replay step ran and passed.","established":false}],"does_not_show":[{"code":"detection-correctness","text":"That the flagged posts are in fact coordinated, or that the model is accurate, calibrated or fit for the purpose."},{"code":"independent-time","text":"That the record existed at its stated creation time or at any other time. All times are the producer's or the log operator's own."},{"code":"custody-outside-producer","text":"That any copy of the record, or the log, is beyond the producer's control. The producer may run the log."},{"code":"input-provenance","text":"That the input numbers were derived correctly from the posts they stand for, or which posts those are."},{"code":"predecessor-relation","text":"What the predecessor member says about an earlier certificate. A verifier checks only its form."}],"not_yet_given":["Independent time-stamping. Every time in a record or a tree head comes from the clock of the producer or of the log operator, who are the same organisation.","A log run by someone other than the producer. 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, shows the same log to everyone, or has not rebuilt it.","Bit-exact replay across machines. On another machine or runtime release the replay may be exact, within tolerance, or outside it.","Proof that the detection is right. A record certifies that a computation took place as stated, not that its result is correct.","Privacy of the input when it is shared. Replay needs the input, so the pack contains it, and numerical representations of text can reveal things about the text.","Rotation or revocation of keys, signed verification reports, element types other than float32, more than one input tensor, and a safe way to run a model of unknown origin."],"record_scope":{"does_not_prove":["detection-correctness","independent-time","custody-outside-producer","input-provenance","predecessor-relation"],"proves":["input-integrity","model-integrity","output-integrity","replayability"]}},"environment":{"arch":"arm64","crypto_library":"node:crypto, OpenSSL 4.1.0","execution_provider":"cpu","graph_optimization":"runtime default","language":"javascript-node","language_version":"26.12.1","os":"macOS","overlay":"","pack":"pack","runtime":"onnxruntime-node","runtime_loaded":"not loaded in this run","runtime_version":"unknown","started_utc":"2026-11-14T21:22:53Z","threads":"runtime default","trusted_keys":"trusted-keys.json","verifier":"verify_record.mjs","verifier_version":"1.0.0"},"reference_report":{"computed":{"input_sha256":"7f72c8346e0965d2cd6ebc8189c044083645fcbc9f5a07d7c504dabe339cdc9b","leaf_hash":"7a235e1f544f9c8ee7723be4397c8a4ba08796d7716489a15177907e07375c78","model_sha256":"40bf2492b9b63d5678a21a5ee81ce355406deb1e48d356637432902ef2f9b451","record_sha256":"b06ed72edf7d22f09727740100970bc9e13496e18a828d9c3d3f1c0a9822ca87","signed_message_sha256":"c942af9dff53282ec70c8b259043532ac1872b63ff982dbac856440210990aa2","trace_sha256":"a50362535cc4cb3c7e79e06ff2cf2d808cdd1295db2178e578cf1f7c4c16c762"},"environment":{"arch":"arm64","crypto_library":"node:crypto, OpenSSL 4.1.0","execution_provider":"cpu","graph_optimization":"runtime default","language":"javascript-node","language_version":"26.12.1","os":"macOS","overlay":"","pack":"pack","runtime":"onnxruntime-node","runtime_loaded":"not loaded in this run","runtime_version":"unknown","started_utc":"2026-11-14T21:22:53Z","threads":"runtime default","trusted_keys":"trusted-keys.json","verifier":"verify_record.mjs","verifier_version":"1.0.0"},"exit_code":1,"log_operator_is_record_producer":"yes","replay":{},"replay_accepted":"not_decided","replay_policy":"signed","report":"qriton.computation-record.verification-report","report_version":1,"scope":{"does_not_prove":["detection-correctness","independent-time","custody-outside-producer","input-provenance","predecessor-relation"],"proves":["input-integrity","model-integrity","output-integrity","replayability"]},"steps":{"s01_trusted_keys":"TRUST_OK","s02_record":"RECORD_OK","s03_signature":"SIG_KEY_UNTRUSTED","s04_input":"INPUT_OK","s05_model_digest":"MODEL_DIGEST_OK","s06_model_profile":"MODEL_PROFILE_OK","s07_trace":"TRACE_OK","s08_tree_head":"STH_KEY_UNTRUSTED","s09_earlier_tree_head":"STH_KEY_UNTRUSTED","s10_inclusion":"INCLUSION_OK","s11_consistency":"CONSISTENCY_OK","s12_log_entries":"ENTRIES_OK","s13_pack_keys":"PACK_KEYS_CONFLICT","s14_replay":"NOT_EVALUATED"},"subject":{"case_label":"sample record","created_time_utc":"2026-11-11T22:09:23Z","producer_name":"Qriton Technologies S.R.L."},"trusted_keys_sha256":"987ebbcf2037c2eb764aff6572c46e6ed5556c7bf8a2c6718a8b5ccbfc72d3ce","verdict":"FAIL"},"reference_report_note":"No trusted keys were supplied, so the reference verifier ran with a placeholder trusted-keys file whose keys nobody holds. Its s01 code and trusted_keys_sha256 describe that placeholder, not trust material of yours."}}}}}},"400":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_json","message":"The request body is not valid JSON.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body exceeds the size limit of the endpoint.","details":{}}}}}},"422":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_zip","message":"The archive is not a well-formed ZIP file.","details":{}}}}}},"500":{"description":"`verifier_failed`: The reference verifier did not produce a report. `internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"verifier_failed","message":"The reference verifier did not produce a report.","details":{}}}}}},"503":{"description":"`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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"verifier_timeout","message":"The verification exceeded its time limit and was stopped.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/verify/specs":{"get":{"tags":["Verification API"],"operationId":"listSpecifications","summary":"List the specifications","responses":{"200":{"description":"The published specifications.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_SpecList"},"example":{"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"}]}}}},"400":{"description":"`method_not_allowed`: The endpoint does not accept this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"method_not_allowed","message":"The endpoint does not accept this HTTP method.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"500":{"description":"`internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/verify/specs/{name}":{"get":{"tags":["Verification API"],"operationId":"getSpecification","summary":"Get one specification as Markdown text","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","enum":["receipt-chain","computation-record-v2"]}}],"responses":{"200":{"description":"The specification, as published in the open verifier package.","content":{"text/markdown":{"schema":{"type":"string"},"example":"# Receipt chain: format and verification rule\n\nThis is everything needed to write your own verifier. ..."}}},"400":{"description":"`method_not_allowed`: The endpoint does not accept this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"method_not_allowed","message":"The endpoint does not accept this HTTP method.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"`not_found`: No such endpoint or file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"not_found","message":"No such endpoint or file.","details":{}}}}}},"500":{"description":"`internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/verify/verifiers":{"get":{"tags":["Verification API"],"operationId":"listVerifiers","summary":"List the published verifier archives with their SHA-256","responses":{"200":{"description":"The open verifier package and the sample trusted keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_VerifierListing"},"example":{"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."}}}},"400":{"description":"`method_not_allowed`: The endpoint does not accept this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"method_not_allowed","message":"The endpoint does not accept this HTTP method.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"500":{"description":"`internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/verify/verifiers/{file}":{"get":{"tags":["Verification API"],"operationId":"downloadVerifier","summary":"Download a published file","description":"One of the files listed by GET /verifiers, or SHA256SUMS. A file is served only while its content matches the digest in SHA256SUMS.","parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string","enum":["qriton-open-verifiers-1.0.0.zip","qriton-open-verifiers-1.0.0.tar.gz","SHA256SUMS"]}}],"responses":{"200":{"description":"The file.","content":{"application/zip":{"schema":{"type":"string","contentMediaType":"application/zip"}},"application/gzip":{"schema":{"type":"string","contentMediaType":"application/gzip"}},"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"},"example":"12da34f0e60ee3f7e3672fdf88714b663d36ce3c0b9b8b3b1a1159337cad2c50  qriton-open-verifiers-1.0.0.zip\n7bd48aa9222e289ddf7b07255cf5cf26d4e64639d6bca6e8219ec03e8932ac55  qriton-open-verifiers-1.0.0.tar.gz\n"}}},"400":{"description":"`method_not_allowed`: The endpoint does not accept this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"method_not_allowed","message":"The endpoint does not accept this HTTP method.","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"`not_found`: No such endpoint or file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"not_found","message":"No such endpoint or file.","details":{}}}}}},"500":{"description":"`internal_error`: An unexpected error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/verify_Error"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","details":{}}}}}}},"security":[{"bearer":[]}]}},"/v1/memory/keys":{"get":{"summary":"Signing keys","description":"The Ed25519 public key that signs receipt hashes and head statements.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"keys":[{"key_id":"4f0c2a9e71b3d856","algorithm":"Ed25519","public_key_hex":"a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1","public_key_pem":"-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----\n","created_utc":"2026-11-14T09:00:00Z","status":"active"}],"signed":"Each receipt_hash (its 64 ASCII characters) and each head statement."}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/facts":{"get":{"summary":"List facts","description":"Lists the live facts of the account.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"facts":[{"fact_id":"f0","prompt":"The capital of Wakanda is","subject":"Wakanda","relation":"capital","answer":"Rome","address":"atlas/africa/wakanda","target_ids":[21718],"tokens":1,"slot":0,"receipt":"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23","created_utc":"2026-11-14T10:15:02.418233Z","updated_utc":"2026-11-14T10:15:02.418233Z"}],"count":1}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]},"post":{"summary":"Register a fact","description":"Stores a fact in the frozen model and appends an inject receipt. The answer is screened first; a refusal writes nothing.","parameters":[],"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"fact":{"$ref":"#/components/schemas/memory_Fact"}}},"example":{"fact":{"fact_id":"f0","prompt":"The capital of Wakanda is","subject":"Wakanda","relation":"capital","answer":"Rome","address":"atlas/africa/wakanda","target_ids":[21718],"tokens":1,"slot":0,"receipt":"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23","created_utc":"2026-11-14T10:15:02.418233Z","updated_utc":"2026-11-14T10:15:02.418233Z"}}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"403":{"description":"Error codes: fact_limit_reached, subject_capacity_reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"fact_limit_reached","message":"This account has reached the number of facts its plan allows.","details":{}}}}}},"409":{"description":"Error codes: key_collision, address_taken.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"key_collision","message":"A stored fact already answers this subject and relation; edit it instead.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: validation_error, answer_not_expressible, answer_too_long, invalid_address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"validation_error","message":"The request is not valid.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_RegisterRequest"},"example":{"prompt":"The capital of Wakanda is","answer":"Rome","subject":"Wakanda","relation":"capital","address":"atlas/africa/wakanda"}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/facts/{fact_id}":{"get":{"summary":"Get a fact","description":"Returns one live fact.","parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"string"},"example":"f0"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"fact":{"$ref":"#/components/schemas/memory_Fact"}}},"example":{"fact":{"fact_id":"f0","prompt":"The capital of Wakanda is","subject":"Wakanda","relation":"capital","answer":"Rome","address":"atlas/africa/wakanda","target_ids":[21718],"tokens":1,"slot":0,"receipt":"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23","created_utc":"2026-11-14T10:15:02.418233Z","updated_utc":"2026-11-14T10:15:02.418233Z"}}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"Error codes: fact_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"fact_not_found","message":"No live fact has this id.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]},"delete":{"summary":"Forget a fact","description":"Removes the fact from memory and appends a forget receipt. Its earlier receipts are kept.","parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"string"},"example":"f0"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"forgotten":"f0","receipt":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b","reverted_to_base":true}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"Error codes: fact_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"fact_not_found","message":"No live fact has this id.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/facts/edit":{"post":{"summary":"Correct a fact","description":"Replaces the answer of a live fact, optionally moving it to a new address, and appends an edit receipt.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"fact":{"$ref":"#/components/schemas/memory_Fact"}}},"example":{"fact":{"fact_id":"f0","prompt":"The capital of Wakanda is","subject":"Wakanda","relation":"capital","answer":"Paris","address":"atlas/africa/wakanda","target_ids":[12095],"tokens":1,"slot":0,"receipt":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b","created_utc":"2026-11-14T10:15:02.418233Z","updated_utc":"2026-11-14T10:15:02.418233Z"}}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"Error codes: fact_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"fact_not_found","message":"No live fact has this id.","details":{}}}}}},"409":{"description":"Error codes: address_taken, address_ambiguous.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"address_taken","message":"A fact with this relation is already stored at this address.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: validation_error, answer_not_expressible, answer_too_long, invalid_address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"validation_error","message":"The request is not valid.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_EditRequest"},"example":{"fact_id":"f0","answer":"Paris"}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/facts/forget":{"post":{"summary":"Forget a fact by id or address","description":"Same as DELETE /facts/{fact_id}, but the fact may be named by its address.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"forgotten":"f0","receipt":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b","reverted_to_base":true}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"Error codes: fact_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"fact_not_found","message":"No live fact has this id.","details":{}}}}}},"409":{"description":"Error codes: address_ambiguous.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"address_ambiguous","message":"Several facts are stored at this address; name the relation.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: validation_error, invalid_address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"validation_error","message":"The request is not valid.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_ForgetRequest"},"example":{"address":"atlas/africa/wakanda","relation":"capital"}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/places":{"get":{"summary":"List place addresses","description":"Lists the addresses in use under a prefix, with their facts. The prefix matches whole segments: home/kitchen matches home/kitchen/shelf but not home/kitchenette.","parameters":[{"name":"prefix","in":"query","required":false,"schema":{"type":"string"},"example":"atlas/africa"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"prefix":"atlas/africa","count":1,"places":[{"address":"atlas/africa/wakanda","facts":[{"fact_id":"f0","relation":"capital","subject":"Wakanda","answer":"Rome"}]}]}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: invalid_address, validation_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_address","message":"An address is 1 to 5 segments of lowercase letters, digits and hyphens, separated by slashes.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/query":{"post":{"summary":"Query the memory","description":"Looks up a fact by key (mode keyed: subject and relation), by place address (mode address: exact match, no text interpretation) or from free text (mode natural: best effort). With generate true the model continues the text, steered by the matched fact. When nothing matches, the output is bit-identical to the unmodified model.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_QueryResponse"},"example":{"mode":"keyed","best_effort":false,"route":{"subject":"Wakanda","relation":"capital","fired":true,"fact_id":"f0","cosine":1,"matched_prompt":"The capital of Wakanda is","matched_answer":"Rome","matched_address":"atlas/africa/wakanda"},"answer":"Rome","prompt_used":"The capital of Wakanda is","response":" Rome, and the capital of","response_token_ids":[21718,11,323,279,6722,315],"memory_applied_steps":1}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"409":{"description":"Error codes: address_ambiguous.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"address_ambiguous","message":"Several facts are stored at this address; name the relation.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: validation_error, invalid_address, text_required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"validation_error","message":"The request is not valid.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_QueryRequest"},"example":{"mode":"keyed","subject":"Wakanda","relation":"capital","text":"The capital of Wakanda is","generate":true,"max_new_tokens":6}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/proof/locality":{"post":{"summary":"Locality proof","description":"Runs a positive control on one stored fact, then compares the logits with and without memory on near misses (a stored subject under another relation) and unrelated prompts.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"model":"Qwen/Qwen3-0.6B","facts_loaded":3,"control":{"fact_id":"f0","fired":true,"base_says":"a","memory_says":"Rome","output_changed":true},"rows":[],"identical":4,"total":4,"near_miss_total":2,"near_miss_leaked":0,"route_threshold":0.93,"valid":true,"informative":true,"disclosures":[]}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"409":{"description":"Error codes: knowledge_base_empty.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"knowledge_base_empty","message":"The proof needs at least one stored fact.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/proof/tamper":{"post":{"summary":"Tamper demonstration","description":"Verifies the account's chain, alters one receipt in a copy and shows that verification of the copy fails. Nothing stored is changed.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"receipts":3,"intact_verifies":true,"tampered_index":1,"tampered_verifies":false,"first_problem":{"position":1,"problem":"receipt_hash"},"detected":true}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"409":{"description":"Error codes: not_enough_receipts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"not_enough_receipts","message":"The tamper demonstration needs at least three receipts.","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/receipts":{"get":{"summary":"List receipts","description":"The account's receipts in order, each with its signature.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"receipts":[{"sequence":0,"timestamp_utc":"2026-11-14T10:15:02.418233Z","operation":"inject","previous_hash":null,"payload":{"fact_id":"f0","prompt":"The capital of Wakanda is","subject":"Wakanda","relation":"capital","answer":"Rome","target_id":21718,"slot":0,"address":"atlas/africa/wakanda"},"receipt_hash":"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23","signature":"5d1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","key_id":"4f0c2a9e71b3d856"}],"total":1,"limit":100,"offset":0}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"422":{"description":"Error codes: validation_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"validation_error","message":"The request is not valid.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/receipts/verify":{"get":{"summary":"Verify the chain","description":"Recomputes every link of the account's chain and checks every signature.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"valid":true,"links_valid":true,"receipts":3,"head":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b","first_problem":null,"signed_receipts":3,"signatures_valid":true,"key_id":"4f0c2a9e71b3d856"}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/receipts/export":{"get":{"summary":"Export the chain","description":"The account's chain as JSON Lines in the published receipt-chain format (six fields per receipt), ready for the open verifiers. Signatures are not part of this file; they are listed by GET /receipts. The X-Chain-Head header carries the head hash.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/x-ndjson":{"schema":{"type":"string"},"example":"{\"sequence\": 0, \"timestamp_utc\": \"2026-11-14T10:15:02.418233Z\", \"operation\": \"inject\", \"previous_hash\": null, \"payload\": {\"fact_id\": \"f0\", \"prompt\": \"The capital of Wakanda is\", \"subject\": \"Wakanda\", \"relation\": \"capital\", \"answer\": \"Rome\", \"target_id\": 21718, \"slot\": 0}, \"receipt_hash\": \"7aaaacb941d407c23e2a6be5183bcd63e06ed7ea9f491b55beaf861aeb647c23\"}\n"}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/head":{"get":{"summary":"Signed head statement","description":"A dated statement of the account's current chain head, signed with the service key. Keep a copy with a second party: only an earlier head held elsewhere reveals a rewritten or shortened chain.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"statement":{"type":"memory-chain-head","version":1,"tenant":"acc_3f9a1c0b7d2e4a51","receipts":3,"head":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b","issued_utc":"2026-11-14T10:15:02.418233Z","key_id":"4f0c2a9e71b3d856"},"algorithm":"Ed25519","signature":"5d1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","signed_bytes":"the statement serialised with keys sorted, no whitespace and non-ASCII characters escaped, encoded as UTF-8"}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/memory/usage":{"get":{"summary":"Usage","description":"Live facts, the fact limit in force, receipts and the chain head of the account.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"},"example":{"tenant":"acc_3f9a1c0b7d2e4a51","facts":12,"fact_limit":500,"receipts":15,"chain_head":"c9ef98e55fb075d4c3b5921f98573f981072dd9f6607aeea9f90353e960b994b"}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"413":{"description":"Error codes: payload_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"payload_too_large","message":"The request body is larger than 256 KB.","details":{}}}}}},"500":{"description":"Error codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"internal_error","message":"The service failed to complete the request.","details":{}}}}}},"503":{"description":"Error codes: model_loading, model_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/memory_Error"},"example":{"error":{"code":"model_loading","message":"The model is still loading; retry in a few seconds.","details":{}}}}}}},"tags":["Memory API"],"security":[{"bearer":[]}]}},"/v1/signals/days":{"get":{"operationId":"listDays","summary":"List the days of the sample.","description":"Returns the daily records of the sample period, one item per day, in order of date. Each day gives post counts, the verification of its record and the number of candidate groups that day.","x-example-request":"/days?from=2026-10-01&to=2026-10-31&page=1&page_size=2","parameters":[{"name":"from","in":"query","required":false,"description":"First day to include (YYYY-MM-DD).","schema":{"type":"string","format":"date"},"example":"2026-10-01"},{"name":"to","in":"query","required":false,"description":"Last day to include (YYYY-MM-DD).","schema":{"type":"string","format":"date"},"example":"2026-10-31"},{"name":"page","in":"query","required":false,"description":"Page number, from 1.","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"example":1},{"name":"page_size","in":"query","required":false,"description":"Items per page.","schema":{"type":"integer","minimum":1,"maximum":100,"default":31},"example":2}],"responses":{"200":{"description":"A page of days.","content":{"application/json":{"schema":{"type":"object","description":"A page of results.","additionalProperties":false,"required":["sample","notice","filters","page","page_size","total","total_pages","items"],"properties":{"sample":{"$ref":"#/components/schemas/signals_SampleRef"},"notice":{"$ref":"#/components/schemas/signals_Notice"},"filters":{"type":"object","description":"The filters applied.","additionalProperties":false,"required":["from","to"],"properties":{"from":{"type":["string","null"],"description":"From.","format":"date"},"to":{"type":["string","null"],"description":"To.","format":"date"}}},"page":{"type":"integer","description":"Page number."},"page_size":{"type":"integer","description":"Items per page."},"total":{"type":"integer","description":"Items matching the filters."},"total_pages":{"type":"integer","description":"Pages."},"items":{"type":"array","items":{"$ref":"#/components/schemas/signals_Day"}}}},"example":{"sample":{"version":"2026-10.1","period":{"from":"2026-10-01","to":"2026-10-31"},"built_at":"2026-11-14T20:36:50.144Z","digest":"daa2ea63f98e47f0f7dd649f86960185cd8c34343fd5d3e2dedac4060ab690f2"},"notice":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured.","filters":{"from":"2026-10-01","to":"2026-10-31"},"page":1,"page_size":2,"total":31,"total_pages":16,"items":[{"date":"2026-10-01","record_ref":"RO-TT-2026-10-01-001","record":{"status":"verified","seal":"digest_only","verification_report_sha256":"dcdfc4687d9cbd40a10baddac124435bf6144776ad00e35f1fe3251c11f76741"},"posts":{"collected":197,"analysed":137},"accounts_with_posts":38,"candidate_groups":0,"record_sha256":"f3006486949a73d6e29a0a203343a2af9c32f8d53a0e5414882af63a16fc20b0"},{"date":"2026-10-02","record_ref":"RO-TT-2026-10-02-001","record":{"status":"verified","seal":"digest_only","verification_report_sha256":"7d0f97a0dc59814154925fd8cd298813cff9f4c16afb56b755ffed40138217da"},"posts":{"collected":164,"analysed":119},"accounts_with_posts":38,"candidate_groups":0,"record_sha256":"b8cbe827d7eb8e687afb645733ac2441c07690a7135af515613050d9f73e94b2"}]}}}},"400":{"description":"Invalid query. Codes: invalid_parameter, unknown_parameter, invalid_range, request_too_long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"invalid_parameter","message":"The parameter \"page_size\" must be a whole number from 1 to 100.","details":{"parameter":"page_size","minimum":1,"maximum":100}}}}}},"405":{"description":"Method other than GET. Codes: method_not_allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"method_not_allowed","message":"This service accepts GET requests only.","details":{"allowed":["GET"]}}}}}},"500":{"description":"Unexpected failure. Codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"internal_error","message":"The service could not complete the request.","details":{}}}}}}},"tags":["Signals API"],"security":[{"bearer":[]}]}},"/v1/signals/days/{date}":{"get":{"operationId":"getDay","summary":"Get one day of the sample.","description":"Returns the record of one day of the sample period.","x-example-request":"/days/2026-10-01","parameters":[{"name":"date","in":"path","required":true,"description":"The day (YYYY-MM-DD).","schema":{"type":"string","format":"date"},"example":"2026-10-01"}],"responses":{"200":{"description":"The day.","content":{"application/json":{"schema":{"type":"object","description":"One day.","additionalProperties":false,"required":["sample","notice","day"],"properties":{"sample":{"$ref":"#/components/schemas/signals_SampleRef"},"notice":{"$ref":"#/components/schemas/signals_Notice"},"day":{"$ref":"#/components/schemas/signals_Day"}}},"example":{"sample":{"version":"2026-10.1","period":{"from":"2026-10-01","to":"2026-10-31"},"built_at":"2026-11-14T20:36:50.144Z","digest":"daa2ea63f98e47f0f7dd649f86960185cd8c34343fd5d3e2dedac4060ab690f2"},"notice":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured.","day":{"date":"2026-10-01","record_ref":"RO-TT-2026-10-01-001","record":{"status":"verified","seal":"digest_only","verification_report_sha256":"dcdfc4687d9cbd40a10baddac124435bf6144776ad00e35f1fe3251c11f76741"},"posts":{"collected":197,"analysed":137},"accounts_with_posts":38,"candidate_groups":0,"record_sha256":"f3006486949a73d6e29a0a203343a2af9c32f8d53a0e5414882af63a16fc20b0"}}}}},"400":{"description":"Malformed date. Codes: invalid_parameter, unknown_parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"invalid_parameter","message":"The day must be a date written as YYYY-MM-DD.","details":{"parameter":"date"}}}}}},"404":{"description":"No record for the day. Codes: day_not_found, not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"day_not_found","message":"The sample has no record for this day.","details":{"date":"2026-09-30","period":{"from":"2026-10-01","to":"2026-10-31"}}}}}}},"405":{"description":"Method other than GET. Codes: method_not_allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"method_not_allowed","message":"This service accepts GET requests only.","details":{"allowed":["GET"]}}}}}},"500":{"description":"Unexpected failure. Codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"internal_error","message":"The service could not complete the request.","details":{}}}}}}},"tags":["Signals API"],"security":[{"bearer":[]}]}},"/v1/signals/groups":{"get":{"operationId":"listGroups","summary":"List candidate groups.","description":"Returns candidate groups: sets of posts that may show the same clip, formed by the daily comparison of clips, and sets of accounts connected by links in a weekly map. Each group states the basis of its links. A group is a lead for review by a person, not a finding of coordination; no group in the sample was reviewed.","x-example-request":"/groups?min_size=2&basis=co_narrative&page=1&page_size=1","parameters":[{"name":"from","in":"query","required":false,"description":"Include groups whose last member was seen on or after this day.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Include groups whose first member was seen on or before this day.","schema":{"type":"string","format":"date"}},{"name":"min_size","in":"query","required":false,"description":"Minimum number of members.","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"example":2},{"name":"basis","in":"query","required":false,"description":"Only groups with at least one link of this kind.","schema":{"type":"string","enum":["identical_media","same_sound_and_duration","same_duration_within_window","shared_sound","shared_hashtag","co_narrative"]},"example":"co_narrative"},{"name":"kind","in":"query","required":false,"description":"Only groups of this kind.","schema":{"type":"string","enum":["linked_accounts","possible_same_clip"]}},{"name":"page","in":"query","required":false,"description":"Page number, from 1.","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"example":1},{"name":"page_size","in":"query","required":false,"description":"Items per page, at most 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"example":1}],"responses":{"200":{"description":"A page of groups.","content":{"application/json":{"schema":{"type":"object","description":"A page of results.","additionalProperties":false,"required":["sample","notice","filters","page","page_size","total","total_pages","items"],"properties":{"sample":{"$ref":"#/components/schemas/signals_SampleRef"},"notice":{"$ref":"#/components/schemas/signals_Notice"},"filters":{"type":"object","description":"The filters applied.","additionalProperties":false,"required":["from","to","min_size","basis","kind"],"properties":{"from":{"type":["string","null"],"description":"From.","format":"date"},"to":{"type":["string","null"],"description":"To.","format":"date"},"min_size":{"type":"integer","description":"Minimum size."},"basis":{"type":["string","null"],"description":"Basis code."},"kind":{"type":["string","null"],"description":"Kind."}}},"page":{"type":"integer","description":"Page number."},"page_size":{"type":"integer","description":"Items per page."},"total":{"type":"integer","description":"Items matching the filters."},"total_pages":{"type":"integer","description":"Pages."},"items":{"type":"array","items":{"$ref":"#/components/schemas/signals_Group"}}}},"example":{"sample":{"version":"2026-10.1","period":{"from":"2026-10-01","to":"2026-10-31"},"built_at":"2026-11-14T20:36:50.144Z","digest":"daa2ea63f98e47f0f7dd649f86960185cd8c34343fd5d3e2dedac4060ab690f2"},"notice":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured.","filters":{"from":null,"to":null,"min_size":2,"basis":"co_narrative","kind":null},"page":1,"page_size":1,"total":2,"total_pages":2,"items":[{"id":"grp_9fd129741813397ebc73a165","kind":"linked_accounts","formed_by":"weekly_map","period":{"from":"2026-10-19","to":"2026-10-25"},"first_seen":"2026-10-19","last_seen":"2026-10-25","size":38,"member_type":"account","accounts":38,"posts":899,"cross_account":true,"linked_pairs":193,"basis":[{"code":"co_narrative","label":"The same narrative group in the daily synthesis. Narrative groups are written by an automated language model and were not reviewed by a person.","rule":"model_assigned","strength":null,"links":203},{"code":"same_duration_within_window","label":"Posts with their original sound and the same uncommon length, by different accounts, inside the time window. Length alone can coincide.","rule":"fixed_rule","strength":null,"links":87},{"code":"shared_hashtag","label":"The same rare hashtag.","rule":"fixed_rule","strength":null,"links":54},{"code":"shared_sound","label":"The same sound that is not the original sound of the post.","rule":"fixed_rule","strength":null,"links":28}],"strength":null,"themes":[{"id":"electoral_party_mobilization","label":"Electoral, candidate, and party mobilization","posts":311},{"id":"russia_related_messaging","label":"Russia-related state, leader, or national messaging","posts":219},{"id":"war_military_security","label":"War, military, mobilization, and security","posts":146}],"clip":null,"review":{"status":"not_reviewed","is_finding":false,"note":"No person has reviewed this group. It records what the posts or accounts have in common and is not a finding of coordination, common control, payment or intent."},"evidence":{"source_file_sha256":"2c1c4a71df8728ef9c060db0b8d6fd9443100b9eba01c481cad866c75c05d973","members_commitment":"521995cce1ec6d1cb876ab6630b1c54f8895c2061dd498fc0f94c5b2f0675745"},"record_sha256":"d1abe3ca2dd760b59f994be1502790ee85b4ef77d8cf11dc7fa51f7a9f86d1a3"}]}}}},"400":{"description":"Invalid query. Codes: invalid_parameter, unknown_parameter, invalid_range, request_too_long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"invalid_parameter","message":"The parameter \"page_size\" must be a whole number from 1 to 100.","details":{"parameter":"page_size","minimum":1,"maximum":100}}}}}},"405":{"description":"Method other than GET. Codes: method_not_allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"method_not_allowed","message":"This service accepts GET requests only.","details":{"allowed":["GET"]}}}}}},"500":{"description":"Unexpected failure. Codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"internal_error","message":"The service could not complete the request.","details":{}}}}}}},"tags":["Signals API"],"security":[{"bearer":[]}]}},"/v1/signals/groups/{id}":{"get":{"operationId":"getGroup","summary":"Get one candidate group.","description":"Returns one candidate group with the basis of its links, its review state and the digests for checking it.","x-example-request":"/groups/grp_a60e482fc3cd368880da07fc","parameters":[{"name":"id","in":"path","required":true,"description":"Group identifier.","schema":{"type":"string","pattern":"^grp_[0-9a-f]{24}$"},"example":"grp_a60e482fc3cd368880da07fc"}],"responses":{"200":{"description":"The group.","content":{"application/json":{"schema":{"type":"object","description":"One group.","additionalProperties":false,"required":["sample","notice","group"],"properties":{"sample":{"$ref":"#/components/schemas/signals_SampleRef"},"notice":{"$ref":"#/components/schemas/signals_Notice"},"group":{"$ref":"#/components/schemas/signals_Group"}}},"example":{"sample":{"version":"2026-10.1","period":{"from":"2026-10-01","to":"2026-10-31"},"built_at":"2026-11-14T20:36:50.144Z","digest":"daa2ea63f98e47f0f7dd649f86960185cd8c34343fd5d3e2dedac4060ab690f2"},"notice":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured.","group":{"id":"grp_a60e482fc3cd368880da07fc","kind":"possible_same_clip","formed_by":"daily_clip_comparison","period":{"from":"2026-10-16","to":"2026-10-16"},"comparison_day":"2026-10-16","first_seen":"2026-10-16","last_seen":"2026-10-16","size":2,"member_type":"post","accounts":2,"posts":2,"cross_account":true,"linked_pairs":null,"basis":[{"code":"same_sound_and_duration","label":"The same library sound and the same length, within a tolerance, published inside the time window.","rule":"fixed_rule","strength":"probable","links":null}],"strength":"probable","themes":null,"clip":{"duration_seconds":[285],"time_span_hours":3.16,"first_seen_known_for_posts":2},"review":{"status":"not_reviewed","is_finding":false,"note":"No person has reviewed this group. It records what the posts or accounts have in common and is not a finding of coordination, common control, payment or intent."},"evidence":{"source_file_sha256":"5c3532ca98566d44e9658c73121da65cc8e9e4534b20ee33228abbba90a4d686","verification_report_sha256":"ba6dff81f269cbbaddee3ff533c33a642a5397caa0b90167483f041bfc30ed91","members_commitment":"4df9d8c97b3a2af6ebe6062dbfdd9690769006f990dcb6aa592d829efbdcf002"},"record_sha256":"6d7398e43955f8ea031e8ccbb7c96cb3e2c530a484fe24977014f0cefaff4f4b"}}}}},"400":{"description":"Malformed identifier. Codes: invalid_parameter, unknown_parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"invalid_parameter","message":"The group identifier must be \"grp_\" followed by 24 lowercase hexadecimal characters.","details":{"parameter":"id"}}}}}},"404":{"description":"No such group. Codes: group_not_found, not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"group_not_found","message":"The sample has no group with this identifier.","details":{"id":"grp_000000000000000000000000"}}}}}},"405":{"description":"Method other than GET. Codes: method_not_allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"method_not_allowed","message":"This service accepts GET requests only.","details":{"allowed":["GET"]}}}}}},"500":{"description":"Unexpected failure. Codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"internal_error","message":"The service could not complete the request.","details":{}}}}}}},"tags":["Signals API"],"security":[{"bearer":[]}]}},"/v1/signals/sample":{"get":{"operationId":"getSample","summary":"Get the metadata of the sample.","description":"Returns the period, the build time and the digest of the sample, what it covers, its totals, the weeks with a weekly map and their themes, and the meaning of every label. The digest is the SHA-256 of the canonical JSON of the sample file without its digest field.","x-example-request":"/sample","responses":{"200":{"description":"The sample metadata.","content":{"application/json":{"schema":{"type":"object","description":"Sample metadata.","additionalProperties":false,"required":["sample","notice","coverage_statement","totals","weeks","labels"],"properties":{"sample":{"type":"object","description":"The sample.","additionalProperties":false,"required":["schema_version","version","period","built_at","digest","records_as_of","digest_algorithm","digest_canonicalisation"],"properties":{"schema_version":{"type":"string","description":"Schema of the sample file."},"version":{"type":"string","description":"Version of the sample."},"period":{"$ref":"#/components/schemas/signals_Period"},"built_at":{"type":"string","description":"Build time (ISO 8601 UTC).","format":"date-time"},"digest":{"type":"string","description":"SHA-256 digest of the sample.","pattern":"^[0-9a-f]{64}$"},"records_as_of":{"type":"string","description":"Day on which the source records were read.","format":"date"},"digest_algorithm":{"type":"string","description":"Digest algorithm.","const":"sha256"},"digest_canonicalisation":{"type":"string","description":"How the digested text is formed."}}},"notice":{"$ref":"#/components/schemas/signals_Notice"},"coverage_statement":{"type":"array","items":{"type":"string"},"description":"What the sample covers, in full sentences."},"totals":{"type":"object","description":"Totals over the sample.","additionalProperties":false,"required":["days","days_with_record","posts_collected","posts_analysed","candidate_groups","candidate_groups_by_kind"],"properties":{"days":{"type":"integer","description":"Days in the period."},"days_with_record":{"type":"integer","description":"Days with a daily record."},"posts_collected":{"type":"integer","description":"Posts recorded."},"posts_analysed":{"type":"integer","description":"Posts analysed."},"candidate_groups":{"type":"integer","description":"Candidate groups."},"candidate_groups_by_kind":{"type":"object","description":"Candidate groups by kind.","additionalProperties":{"type":"integer"}}}},"weeks":{"type":"array","items":{"$ref":"#/components/schemas/signals_Week"}},"labels":{"type":"object","description":"The meaning of every label.","additionalProperties":false,"required":["basis","strength","themes"],"properties":{"basis":{"type":"object","description":"Basis codes.","additionalProperties":{"type":"object","description":"A basis code.","additionalProperties":false,"required":["label","rule"],"properties":{"label":{"type":"string","description":"Meaning."},"rule":{"type":"string","description":"fixed_rule or model_assigned."}}}},"strength":{"type":"object","description":"Strengths of a same-clip match.","additionalProperties":{"type":"string"}},"themes":{"type":"object","description":"Theme labels by identifier.","additionalProperties":{"type":"string"}}}}}},"example":{"sample":{"schema_version":"qriton.signals.sample.v1","version":"2026-10.1","period":{"from":"2026-10-01","to":"2026-10-31"},"built_at":"2026-11-14T20:36:50.144Z","digest":"daa2ea63f98e47f0f7dd649f86960185cd8c34343fd5d3e2dedac4060ab690f2","records_as_of":"2026-11-11","digest_algorithm":"sha256","digest_canonicalisation":"JSON with object keys sorted at every level, no whitespace, without the digest field"},"notice":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured.","coverage_statement":["The sample covers 1 October 2026 to 31 October 2026 and does not change. It is not live data.","It was built from outputs that the monitor already publishes: one platform (TikTok), public Romanian-language political content read without logging in, four scheduled runs a day at 00:00, 06:00, 12:00 and 18:00 UTC.","It contains daily counts, candidate groups and service figures. It contains no account names, no links to posts or profiles, no post identifiers and no captions or transcripts.","Candidate groups were formed by fixed rules, with one exception: the narrative-group link is assigned by an automated language model. No group was reviewed by a person, and none is a finding of coordination.","The accuracy of the monitor has not been measured. No figure in the sample is an accuracy, precision or recall figure."],"totals":{"days":31,"days_with_record":31,"posts_collected":4497,"posts_analysed":3530,"candidate_groups":5,"candidate_groups_by_kind":{"possible_same_clip":3,"linked_accounts":2}},"weeks":[{"week_start":"2026-10-19","week_end":"2026-10-25","days_in_sample_period":7,"days_with_record":7,"accounts":45,"posts":913,"linked_pairs":193,"account_groups":1,"accounts_without_link":7,"strict_links":{"pairs":50,"largest_group_accounts":27,"groups":1,"accounts_linked":27},"themes":[{"id":"electoral_party_mobilization","label":"Electoral, candidate, and party mobilization","posts":313},{"id":"russia_related_messaging","label":"Russia-related state, leader, or national messaging","posts":220},{"id":"war_military_security","label":"War, military, mobilization, and security","posts":148},{"id":"sovereignty_nationalism","label":"Sovereignty, nationalism, and patriotic identity","posts":120},{"id":"religion_history_identity","label":"Religion, history, and civilizational identity","posts":116},{"id":"protest_civic_mobilization","label":"Protest and civic mobilization","posts":107},{"id":"institutional_trust_corruption","label":"Institutional distrust, corruption, and alleged wrongdoing","posts":95},{"id":"gender_family_social_values","label":"Gender, family, and social-values framing","posts":57}],"weekly_map_sha256":"2c1c4a71df8728ef9c060db0b8d6fd9443100b9eba01c481cad866c75c05d973"},{"week_start":"2026-10-26","week_end":"2026-11-01","days_in_sample_period":6,"days_with_record":6,"accounts":44,"posts":749,"linked_pairs":204,"account_groups":1,"accounts_without_link":7,"strict_links":{"pairs":43,"largest_group_accounts":23,"groups":2,"accounts_linked":26},"themes":[{"id":"electoral_party_mobilization","label":"Electoral, candidate, and party mobilization","posts":307},{"id":"russia_related_messaging","label":"Russia-related state, leader, or national messaging","posts":204},{"id":"sovereignty_nationalism","label":"Sovereignty, nationalism, and patriotic identity","posts":146},{"id":"protest_civic_mobilization","label":"Protest and civic mobilization","posts":140},{"id":"war_military_security","label":"War, military, mobilization, and security","posts":126},{"id":"religion_history_identity","label":"Religion, history, and civilizational identity","posts":113},{"id":"gender_family_social_values","label":"Gender, family, and social-values framing","posts":78},{"id":"institutional_trust_corruption","label":"Institutional distrust, corruption, and alleged wrongdoing","posts":67}],"weekly_map_sha256":"e667ded2e43d9fd99126d99244978510cb55f292868a5b5d0a58c4214ded5c42"}],"labels":{"basis":{"identical_media":{"label":"The archived files are byte-identical.","rule":"fixed_rule"},"same_sound_and_duration":{"label":"The same library sound and the same length, within a tolerance, published inside the time window.","rule":"fixed_rule"},"same_duration_within_window":{"label":"Posts with their original sound and the same uncommon length, by different accounts, inside the time window. Length alone can coincide.","rule":"fixed_rule"},"shared_sound":{"label":"The same sound that is not the original sound of the post.","rule":"fixed_rule"},"shared_hashtag":{"label":"The same rare hashtag.","rule":"fixed_rule"},"co_narrative":{"label":"The same narrative group in the daily synthesis. Narrative groups are written by an automated language model and were not reviewed by a person.","rule":"model_assigned"}},"strength":{"strong":"Byte-identical files: the only certain match.","probable":"Same sound and same length: a probable match.","possible":"Same length only: a possible match, which can coincide."},"themes":{"electoral_party_mobilization":"Electoral, candidate, and party mobilization","russia_related_messaging":"Russia-related state, leader, or national messaging","war_military_security":"War, military, mobilization, and security","sovereignty_nationalism":"Sovereignty, nationalism, and patriotic identity","religion_history_identity":"Religion, history, and civilizational identity","protest_civic_mobilization":"Protest and civic mobilization","institutional_trust_corruption":"Institutional distrust, corruption, and alleged wrongdoing","gender_family_social_values":"Gender, family, and social-values framing"}}}}}},"400":{"description":"A parameter was given. Codes: unknown_parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"unknown_parameter","message":"The parameter \"page\" is not accepted by this endpoint.","details":{"parameter":"page","accepted":[]}}}}}},"405":{"description":"Method other than GET. Codes: method_not_allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"method_not_allowed","message":"This service accepts GET requests only.","details":{"allowed":["GET"]}}}}}},"500":{"description":"Unexpected failure. Codes: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signals_Error"},"example":{"error":{"code":"internal_error","message":"The service could not complete the request.","details":{}}}}}}},"tags":["Signals API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces":{"post":{"operationId":"create_space","summary":"Create a space","description":"Creates an empty space with the default policy.The example data are illustrative.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_CreateSpace"},"example":{"name":"Workshop bench"}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Space"},"example":{"space_id":"sp_32177cc0db9fe1a6","name":"Workshop bench","created_at":"2026-11-14T21:04:55.255Z","observations":0,"latest_observation_at":null,"instances":0,"provisional_instances":0,"unconfirmed_instances":0,"receipts":0,"receipt_head":null}}}},"400":{"description":"invalid_json: The request body is not valid JSON. invalid_limit_header: A limit header is not a whole number. invalid_name: The space name must be 1 to 80 characters. invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"403":{"description":"space_limit_reached: The account has as many spaces as its plan allows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_limit_reached","message":"This account has reached its limit of 1 spaces.","details":{"spaces":1,"max_spaces":1}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]},"get":{"operationId":"list_spaces","summary":"List spaces","description":"Lists the spaces of the account.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_SpaceList"},"example":{"spaces":[{"space_id":"sp_32177cc0db9fe1a6","name":"Workshop bench","created_at":"2026-11-14T21:04:55.255Z","observations":4,"latest_observation_at":"2026-11-14T09:30:06.000Z","instances":1,"provisional_instances":0,"unconfirmed_instances":0,"receipts":15,"receipt_head":"0d8469f5310c48a76a22b9614cebd1e6d5a4fbee5366bd4ad89f88bb72accbb6"}],"count":1,"max_spaces":3}}}},"400":{"description":"invalid_limit_header: A limit header is not a whole number.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}":{"get":{"operationId":"get_space","summary":"Get a space","description":"Returns counts and the receipt head of one space.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Space"},"example":{"space_id":"sp_32177cc0db9fe1a6","name":"Workshop bench","created_at":"2026-11-14T21:04:55.255Z","observations":4,"latest_observation_at":"2026-11-14T09:30:06.000Z","instances":1,"provisional_instances":0,"unconfirmed_instances":0,"receipts":15,"receipt_head":"0d8469f5310c48a76a22b9614cebd1e6d5a4fbee5366bd4ad89f88bb72accbb6"}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]},"delete":{"operationId":"delete_space","summary":"Delete a space","description":"Deletes the space with all its instances, history and receipt chain. Export the chain first if you need it.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_SpaceDeleted"},"example":{"deleted":true,"space_id":"sp_32177cc0db9fe1a6","final_receipt_head":"0d8469f5310c48a76a22b9614cebd1e6d5a4fbee5366bd4ad89f88bb72accbb6","receipts_deleted":15}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/policy":{"get":{"operationId":"get_policy","summary":"Get the update policy","description":"Returns the policy settings of the space with their defaults, ranges and meaning.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_PolicyView"},"example":{"space_id":"sp_32177cc0db9fe1a6","policy":{"update_rule":"adaptive","match_radius_m":0.25,"ambiguity_margin_m":0.03,"shape_weight":0.25,"position_sigma_m":0.02,"surprise_sigma":3,"change_radius_m":0.05,"revise_after_observations":3,"revise_after_seconds":0,"consolidate_after_observations":3,"consolidate_after_seconds":1,"fast_half_life_seconds":1,"slow_half_life_observations":5,"unconfirmed_after_misses":3,"velocity_horizon_seconds":2},"settings":[{"name":"update_rule","default":"adaptive","description":"How the consolidated state is updated: adaptive, last_observation (every match overwrites it) or first_observation (it never changes after the first sighting).","choices":["adaptive","last_observation","first_observation"]},{"name":"match_radius_m","default":0.25,"description":"A segment can match an instance only if it lies within this distance of one of the instance's reference positions.","minimum":0.01,"maximum":5},{"name":"ambiguity_margin_m","default":0.03,"description":"If the two best candidates differ in cost by less than this, the service abstains.","minimum":0,"maximum":1},{"name":"shape_weight","default":0.25,"description":"Weight of the shape descriptor distance in the match cost; 0 disables the shape term.","minimum":0,"maximum":1},{"name":"position_sigma_m","default":0.02,"description":"Expected spread of the observed position of an object at rest.","minimum":0.001,"maximum":1},{"name":"surprise_sigma","default":3,"description":"An observation is surprising when its distance from the consolidated position exceeds this many position sigmas.","minimum":0.5,"maximum":20},{"name":"change_radius_m","default":0.05,"description":"Surprising observations count as the same change when they lie within this distance of each other.","minimum":0.005,"maximum":2},{"name":"revise_after_observations","default":3,"description":"Number of agreeing surprising observations needed before the consolidated state is revised.","minimum":1,"maximum":100},{"name":"revise_after_seconds","default":0,"description":"Minimum time the change must persist before the consolidated state is revised.","minimum":0,"maximum":86400},{"name":"consolidate_after_observations","default":3,"description":"Number of sightings needed to consolidate a provisional instance.","minimum":1,"maximum":100},{"name":"consolidate_after_seconds","default":1,"description":"Minimum time between the first and the consolidating sighting.","minimum":0,"maximum":86400},{"name":"fast_half_life_seconds","default":1,"description":"Half-life of the smoothed recent position.","minimum":0.01,"maximum":3600},{"name":"slow_half_life_observations","default":5,"description":"A consistent observation moves the consolidated position by 1 - 0.5^(1/this) of the residual.","minimum":1,"maximum":1000},{"name":"unconfirmed_after_misses","default":3,"description":"Consecutive observations whose coverage box contains an instance without seeing it before the instance is marked unconfirmed.","minimum":1,"maximum":1000},{"name":"velocity_horizon_seconds","default":2,"description":"Longest time over which the recent velocity is extrapolated for matching.","minimum":0,"maximum":60}]}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]},"put":{"operationId":"put_policy","summary":"Change the update policy","description":"Changes some policy settings; the others keep their values. The change is a receipt.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Policy"},"example":{"revise_after_observations":4,"match_radius_m":0.2}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_PolicyUpdated"},"example":{"space_id":"sp_32177cc0db9fe1a6","policy":{"update_rule":"adaptive","match_radius_m":0.2,"ambiguity_margin_m":0.03,"shape_weight":0.25,"position_sigma_m":0.02,"surprise_sigma":3,"change_radius_m":0.05,"revise_after_observations":4,"revise_after_seconds":0,"consolidate_after_observations":3,"consolidate_after_seconds":1,"fast_half_life_seconds":1,"slow_half_life_observations":5,"unconfirmed_after_misses":3,"velocity_horizon_seconds":2},"changed":["match_radius_m","revise_after_observations"],"receipt":{"sequence":13,"timestamp_utc":"2026-11-14T21:04:55.272Z","operation":"edit","previous_hash":"907ce5ce0bc3e224866145e9a6bc5601e2548d9f9e4b16d1edfbd3d5ce06995b","payload":{"kind":"policy","fact_id":"sp_32177cc0db9fe1a6","changed":["match_radius_m","revise_after_observations"],"policy_sha256":"2daf6190687eef971d6c05e12fab6b53873356d0644cfd7b7d44b09767acbd69"},"receipt_hash":"fb7df1a82ff9eaa6f5c7bd0d1b0949de07d52e94ec992adb4aeea1cef8ee9df2"}}}}},"400":{"description":"invalid_json: The request body is not valid JSON. invalid_policy: A policy setting is unknown or out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/observations":{"post":{"operationId":"observe","summary":"Send an observation","description":"Sends one point cloud. The service segments it (or uses the given segments), matches each segment to the instances of the space by position and motion history with an optional shape term, creates a provisional instance when nothing is within the match radius, and abstains when two candidates are too close to separate. Each segment's novelty, surprise, change evidence, action and evidence are returned, and every action is appended to the receipt chain. The body may also be application/octet-stream: a 16-byte little-endian header (the 4 bytes QSPC, uint32 version 1, uint32 point count, uint32 flags; flag 1 means per-point uint32 segment ids follow the points, 4294967295 for none) and then the points as float32 x, y, z; timestamp, sensor_pose (7 comma-separated numbers x,y,z,w,qx,qy,qz), coverage (6 numbers: min then max), voxel_size_m, min_segment_points and remove_dominant_plane are then query parameters. The example data are illustrative.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Observation"},"example":{"points":[[-0.2615,0.0949,0.0289],[-0.1604,0.0679,0.0193],[-0.2618,0.1118,0.0372],[-0.2255,0.1343,0.0058],[-0.1623,0.075,0.0558],[-0.1423,0.1175,0.0052],[-0.21,0.128,0.0356],[-0.2584,0.0882,0.0223],[-0.1784,0.0769,0.0495],[-0.2438,0.0705,0.0239],[-0.2351,0.072,0.0079],[-0.1393,0.0705,0.0348],[-0.167,0.1306,0.0221],[-0.2558,0.113,0.0198],[-0.1769,0.0678,0.0175],[-0.1658,0.1088,0.0465],[-0.2031,0.1309,0.0159],[-0.1927,0.0758,0.0501],[-0.2606,0.0782,0.0054],[-0.246,0.1329,0.043],[-0.1803,0.1304,0.046],[-0.2042,0.0665,0.0356],[-0.1365,0.1008,0.015],[-0.1407,0.1158,0.0464],[-0.2607,0.1107,0.0401],[-0.1901,0.1154,0.0509],[-0.1894,0.0709,0.0241],[-0.2241,0.0865,0.0486],[-0.2543,0.0734,0.0516],[-0.208,0.1323,0.0466],[-0.2306,0.1315,0.0196],[-0.1401,0.0922,0.0091],[-0.1546,0.0713,0.0139],[-0.234,0.0701,0.0265],[-0.2543,0.0706,0.0111],[-0.225,0.1168,0.0506],[-0.2246,0.1163,0.0532],[-0.1847,0.0688,0.0372],[-0.1963,0.0989,0.0507],[-0.1642,0.1289,0.033],[0.2833,-0.0245,0.0938],[0.2851,-0.0719,0.1163],[0.2547,-0.0095,0.0621],[0.2868,-0.0409,0.0202],[0.2109,-0.0652,0.0021],[0.2241,-0.021,0.0302],[0.2709,-0.0834,0.0169],[0.269,-0.0878,0.0773],[0.2368,-0.0144,0.0148],[0.2909,-0.0649,0.0583],[0.2366,-0.0129,0.0842],[0.2238,-0.052,0.1172],[0.2439,-0.0099,0.0688],[0.2877,-0.0642,0.0242],[0.272,-0.0152,0.0976],[0.287,-0.0392,0.0862],[0.2191,-0.0367,0.121],[0.2894,-0.0522,0.0903],[0.2771,-0.0778,0.0128],[0.245,-0.0914,0.0163],[0.2804,-0.0749,0.1135],[0.284,-0.075,0.0504],[0.2449,-0.0523,0.1188],[0.2309,-0.0152,0.0354],[0.2571,-0.0862,0.0559],[0.2297,-0.0861,0.0805],[0.2217,-0.0251,0.1165],[0.2819,-0.0287,0.0322],[0.2479,-0.0891,0.1106],[0.2475,-0.0094,0.0056],[0.2862,-0.0684,0.0688],[0.2501,-0.0346,0.1208],[0.2784,-0.0214,0.08],[0.2737,-0.0848,0.013],[0.275,-0.0189,0.0175],[0.2671,-0.0133,0.0486],[0.2144,-0.0775,0.1137],[0.2773,-0.0789,0.0754],[0.2654,-0.0142,0.1127],[0.2344,-0.0134,0.0969]],"timestamp":"2026-11-14T09:30:00Z","coverage":{"min":[-0.6,-0.4,-0.05],"max":[0.6,0.4,0.5]},"options":{"min_segment_points":20}}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_ObservationResult"},"examples":{"first_sighting":{"summary":"Two new provisional instances","value":{"observation_id":"ob_229af90f8d16ef16","space_id":"sp_32177cc0db9fe1a6","timestamp":"2026-11-14T09:30:00.000Z","point_count":80,"points_sha256":"fc2478b170ae701b4cf117b43598bff6beb6ea4b6f4b2808a7acfb760eb119a7","segmentation":{"method":"voxel_connected_components","voxel_size_m":0.025,"plane_points_removed":0,"segments_dropped":0,"points_in_small_clusters":0},"update_rule":"adaptive","segments":[{"segment":0,"point_count":40,"position":[-0.203585,0.09784,0.031407],"extent":[0.1253,0.0678,0.0506],"outcome":"new","novelty":1,"instance_id":"in_7019266d587b2c13","action":"provisional","status":"provisional","match_score":null,"surprise":null,"change_evidence":null,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":null}},{"segment":1,"point_count":40,"position":[0.258553,-0.04756,0.066935],"extent":[0.08,0.082,0.1189],"outcome":"new","novelty":1,"instance_id":"in_46b3645f7a7fbf95","action":"provisional","status":"provisional","match_score":null,"surprise":null,"change_evidence":null,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":null}}],"missing":[],"receipts":{"appended":3,"first_sequence":0,"head":"b10d30b12801dce2365b6da62dc1636cb0563fd66fd6e5c7197dea338d9c4d2a"}}},"consolidation":{"summary":"Third sighting consolidates both","value":{"observation_id":"ob_40ad8a9e0f981ddf","space_id":"sp_32177cc0db9fe1a6","timestamp":"2026-11-14T09:30:04.000Z","point_count":80,"points_sha256":"a52706bd874dd470bc62cbd07c78535d7d4853dc60d80b535bcc9f70518fc517","segmentation":{"method":"voxel_connected_components","voxel_size_m":0.025,"plane_points_removed":0,"segments_dropped":0,"points_in_small_clusters":0},"update_rule":"adaptive","segments":[{"segment":0,"point_count":40,"position":[-0.19304,0.098555,0.033762],"extent":[0.122,0.0677,0.0542],"outcome":"matched","novelty":0.0472,"instance_id":"in_7019266d587b2c13","action":"consolidate","status":"consolidated","match_score":0.9311,"surprise":0.5712,"change_evidence":0,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":{"instance_id":"in_7019266d587b2c13","distance_m":0.011802,"reference":"last_seen","reference_position":[-0.203763,0.093798,0.032467],"shape_distance":0.021646,"cost":0.017213},"match":{"instance_id":"in_7019266d587b2c13","distance_m":0.011802,"reference":"last_seen","reference_position":[-0.203763,0.093798,0.032467],"shape_distance":0.021646,"cost":0.017213},"runner_up":null,"residual_from_consolidated_m":0.011423,"reconfirmed":false,"revised_from":null}},{"segment":1,"point_count":40,"position":[0.253495,-0.055627,0.06946],"extent":[0.0808,0.0841,0.1209],"outcome":"matched","novelty":0.0473,"instance_id":"in_46b3645f7a7fbf95","action":"consolidate","status":"consolidated","match_score":0.912,"surprise":0.495,"change_evidence":0,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":{"instance_id":"in_46b3645f7a7fbf95","distance_m":0.011825,"reference":"last_seen","reference_position":[0.248125,-0.04632,0.074395],"shape_distance":0.04066,"cost":0.02199},"match":{"instance_id":"in_46b3645f7a7fbf95","distance_m":0.011825,"reference":"last_seen","reference_position":[0.248125,-0.04632,0.074395],"shape_distance":0.04066,"cost":0.02199},"runner_up":null,"residual_from_consolidated_m":0.0099,"reconfirmed":false,"revised_from":null}}],"missing":[],"receipts":{"appended":3,"first_sequence":6,"head":"9c1ae697ec316d7cc622d9f93cc86abd2a8b72d75fc6a1ede9aabe7365887ee0"}}},"surprise":{"summary":"One object moved: kept as an alternative","value":{"observation_id":"ob_fc421f581cbff2d9","space_id":"sp_32177cc0db9fe1a6","timestamp":"2026-11-14T09:30:06.000Z","point_count":80,"points_sha256":"30a08eff0432cfb02110a0f8fa5f0219f5b2867cbd561a3d6508377e9e440178","segmentation":{"method":"voxel_connected_components","voxel_size_m":0.025,"plane_points_removed":0,"segments_dropped":0,"points_in_small_clusters":0},"update_rule":"adaptive","segments":[{"segment":0,"point_count":40,"position":[-0.05073,0.09772,0.031725],"extent":[0.1238,0.0656,0.0529],"outcome":"matched","novelty":0.527,"instance_id":"in_7019266d587b2c13","action":"alternative","status":"consolidated","match_score":0.4536,"surprise":7.4702,"change_evidence":1,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":{"instance_id":"in_7019266d587b2c13","distance_m":0.131748,"reference":"predicted","reference_position":[-0.182317,0.103312,0.035057],"shape_distance":0.019408,"cost":0.1366},"match":{"instance_id":"in_7019266d587b2c13","distance_m":0.131748,"reference":"predicted","reference_position":[-0.182317,0.103312,0.035057],"shape_distance":0.019408,"cost":0.1366},"runner_up":null,"residual_from_consolidated_m":0.149405,"reconfirmed":false,"revised_from":null}},{"segment":1,"point_count":40,"position":[0.250225,-0.042938,0.075302],"extent":[0.0859,0.082,0.1198],"outcome":"matched","novelty":0.0364,"instance_id":"in_46b3645f7a7fbf95","action":"reinforce","status":"consolidated","match_score":0.9405,"surprise":0.4555,"change_evidence":0,"change_evidence_needed":3,"evidence":{"match_radius_m":0.25,"ambiguity_margin_m":0.03,"nearest":{"instance_id":"in_46b3645f7a7fbf95","distance_m":0.009111,"reference":"consolidated","reference_position":[0.253391,-0.049836,0.070263],"shape_distance":0.0231,"cost":0.014886},"match":{"instance_id":"in_46b3645f7a7fbf95","distance_m":0.009111,"reference":"consolidated","reference_position":[0.253391,-0.049836,0.070263],"shape_distance":0.0231,"cost":0.014886},"runner_up":null,"residual_from_consolidated_m":0.009111,"reconfirmed":false,"revised_from":null}}],"missing":[],"receipts":{"appended":3,"first_sequence":10,"head":"907ce5ce0bc3e224866145e9a6bc5601e2548d9f9e4b16d1edfbd3d5ce06995b"}}}}}}},"400":{"description":"invalid_coverage: The coverage box is malformed. invalid_json: The request body is not valid JSON. invalid_limit_header: A limit header is not a whole number. invalid_points: The points are not finite [x, y, z] triples within range. invalid_request: The request does not have the documented shape. invalid_segments: The given segments are malformed, overlapping or out of range. invalid_sensor_pose: The sensor pose is malformed. invalid_timestamp: A time is not ISO 8601 UTC ending in Z.unsupported_content_type: The body is neither application/json nor application/octet-stream.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"403":{"description":"instance_limit_reached: The observation would exceed the instance limit of the space.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"409":{"description":"timestamp_out_of_order: The observation is older than the latest observation of the space.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}},"413":{"description":"body_too_large: The request body is larger than 10 MB. too_many_points: The observation has more points than allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"too_many_points","message":"The observation has 11 points; the limit is 10.","details":{"points":11,"max_points":10}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/instances":{"get":{"operationId":"list_instances","summary":"List instances","description":"Lists the instances of the space. include_provisional=false leaves provisional instances out.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"include_provisional","in":"query","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_InstanceList"},"example":{"space_id":"sp_32177cc0db9fe1a6","instances":[{"instance_id":"in_46b3645f7a7fbf95","label":null,"status":"consolidated","unconfirmed":false,"misses":0,"created_at":"2026-11-14T09:30:00.000Z","sightings":4,"last_seen_at":"2026-11-14T09:30:06.000Z","last_seen_position":[0.250225,-0.042938,0.075302],"consolidated_position":[0.252981,-0.048943,0.070916],"revision_pending":false},{"instance_id":"in_7019266d587b2c13","label":"torque wrench","status":"consolidated","unconfirmed":false,"misses":0,"created_at":"2026-11-14T09:30:00.000Z","sightings":4,"last_seen_at":"2026-11-14T09:30:06.000Z","last_seen_position":[-0.05073,0.09772,0.031725],"consolidated_position":[-0.200129,0.096731,0.032546],"revision_pending":true}],"count":2}}}},"400":{"description":"invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/instances/{instance_id}":{"get":{"operationId":"get_instance","summary":"Get an instance and its history","description":"Returns the instance's consolidated and recent state, any pending alternative, and its history of positions and actions with times, newest first.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","pattern":"^in_[0-9a-f]{16}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_InstanceDetail"},"example":{"instance_id":"in_7019266d587b2c13","label":"torque wrench","status":"consolidated","unconfirmed":false,"misses":0,"created_at":"2026-11-14T09:30:00.000Z","sightings":4,"last_seen_at":"2026-11-14T09:30:06.000Z","last_seen_position":[-0.05073,0.09772,0.031725],"consolidated_position":[-0.200129,0.096731,0.032546],"revision_pending":true,"recent_position":[-0.086975,0.097695,0.032137],"alternative":{"position":[-0.05073,0.09772,0.031725],"change_evidence":1,"first_seen_at":"2026-11-14T09:30:06.000Z","last_seen_at":"2026-11-14T09:30:06.000Z"},"provisional_support":null,"space_id":"sp_32177cc0db9fe1a6","history":[{"timestamp":"2026-11-14T09:30:06.000Z","observation_id":"ob_fc421f581cbff2d9","action":"alternative","observed_position":[-0.05073,0.09772,0.031725],"consolidated_position":[-0.200129,0.096731,0.032546],"status":"consolidated","unconfirmed":false,"novelty":0.5269937649536282,"surprise":7.470234805337447,"change_evidence":1,"match_score":0.4535983097841727},{"timestamp":"2026-11-14T09:30:04.000Z","observation_id":"ob_40ad8a9e0f981ddf","action":"consolidate","observed_position":[-0.19304,0.098555,0.033762],"consolidated_position":[-0.200129,0.096731,0.032546],"status":"consolidated","unconfirmed":false,"novelty":0.047207260034871815,"surprise":0.5711720970540536,"change_evidence":0,"match_score":0.9311471603914161},{"timestamp":"2026-11-14T09:30:02.000Z","observation_id":"ob_104870ff6a3f1461","action":"provisional","observed_position":[-0.203763,0.093798,0.032467],"consolidated_position":null,"status":"provisional","unconfirmed":false,"novelty":0.016731724358236392,"surprise":0.20914655447795488,"change_evidence":0,"match_score":0.9687116719138604}],"history_total":4,"limit":3,"offset":0}}}},"400":{"description":"invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"instance_not_found: No instance with this id exists in this space. space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]},"delete":{"operationId":"forget_instance","summary":"Forget an instance","description":"Deletes the instance's state and history. The receipt chain keeps a forget receipt; earlier receipts hold no positions.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","pattern":"^in_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Forgotten"},"example":{"forgotten":true,"instance_id":"in_46b3645f7a7fbf95","history_records_deleted":4,"receipt":{"sequence":14,"timestamp_utc":"2026-11-14T21:04:55.273Z","operation":"forget","previous_hash":"fb7df1a82ff9eaa6f5c7bd0d1b0949de07d52e94ec992adb4aeea1cef8ee9df2","payload":{"kind":"forget","fact_id":"in_46b3645f7a7fbf95","instance_id":"in_46b3645f7a7fbf95","answer":null,"reverted_to_base":true,"history_records_deleted":4},"receipt_hash":"0d8469f5310c48a76a22b9614cebd1e6d5a4fbee5366bd4ad89f88bb72accbb6"}}}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"instance_not_found: No instance with this id exists in this space. space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/instances/{instance_id}/label":{"post":{"operationId":"label","summary":"Confirm a label","description":"Sets the operator-confirmed label of an instance. Labels are unique within a space. The change is a receipt.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","pattern":"^in_[0-9a-f]{16}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Label"},"example":{"label":"torque wrench"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Labelled"},"example":{"instance_id":"in_7019266d587b2c13","label":"torque wrench","status":"consolidated","unconfirmed":false,"misses":0,"created_at":"2026-11-14T09:30:00.000Z","sightings":3,"last_seen_at":"2026-11-14T09:30:04.000Z","last_seen_position":[-0.19304,0.098555,0.033762],"consolidated_position":[-0.200129,0.096731,0.032546],"revision_pending":false,"receipt":{"sequence":9,"timestamp_utc":"2026-11-14T21:04:55.264Z","operation":"edit","previous_hash":"9c1ae697ec316d7cc622d9f93cc86abd2a8b72d75fc6a1ede9aabe7365887ee0","payload":{"kind":"label","fact_id":"in_7019266d587b2c13","instance_id":"in_7019266d587b2c13","previous_answer":null,"answer":"torque wrench"},"receipt_hash":"5aba6f58e8c8fbaf0f2b8b4449c8a082a2594f9eec469dbfb655a00e1b63f1c4"}}}}},"400":{"description":"invalid_json: The request body is not valid JSON. invalid_label: The label does not meet the label rules. invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"instance_not_found: No instance with this id exists in this space. space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"409":{"description":"label_in_use: Another instance in the space already has this label.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/find":{"post":{"operationId":"find","summary":"Find an object","description":"Answers from consolidated memory by exact label or instance id: the consolidated position and when the object was last seen, or not_seen, ambiguous or unconfirmed instead of a guess. A pending revision is reported when recent observations disagree. Provisional instances are left out unless include_provisional is true. The example data are illustrative.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Find"},"example":{"label":"torque wrench"}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_FindAnswer"},"example":{"space_id":"sp_32177cc0db9fe1a6","query":{"label":"torque wrench"},"instance_id":"in_7019266d587b2c13","label":"torque wrench","status":"consolidated","last_seen_at":"2026-11-14T09:30:06.000Z","seen_in_latest_observation":true,"answer":"seen","position":[-0.200129,0.096731,0.032546],"revision_pending":true,"alternative":{"position":[-0.05073,0.09772,0.031725],"change_evidence":1,"change_evidence_needed":3}}}}},"400":{"description":"invalid_json: The request body is not valid JSON. invalid_label: The label does not meet the label rules. invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/at":{"get":{"operationId":"at","summary":"State of the space at a time","description":"Returns each instance that existed at time t with its consolidated position and status as recorded at or before t.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"t","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_SpaceAt"},"example":{"space_id":"sp_32177cc0db9fe1a6","t":"2026-11-14T09:30:03.000Z","instances":[{"instance_id":"in_46b3645f7a7fbf95","label":null,"status":"provisional","unconfirmed":false,"consolidated_position":null,"last_seen_at":"2026-11-14T09:30:02.000Z","last_event":"provisional","last_event_at":"2026-11-14T09:30:02.000Z"},{"instance_id":"in_7019266d587b2c13","label":"torque wrench","status":"provisional","unconfirmed":false,"consolidated_position":null,"last_seen_at":"2026-11-14T09:30:02.000Z","last_event":"provisional","last_event_at":"2026-11-14T09:30:02.000Z"}],"count":2,"note":"Labels are the current labels; positions are the consolidated state recorded at or before t."}}}},"400":{"description":"invalid_timestamp: A time is not ISO 8601 UTC ending in Z.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/receipts":{"get":{"operationId":"receipts","summary":"Read the receipt chain","description":"Returns receipts in order with the current head.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_ReceiptPage"},"example":{"space_id":"sp_32177cc0db9fe1a6","count":15,"head":"0d8469f5310c48a76a22b9614cebd1e6d5a4fbee5366bd4ad89f88bb72accbb6","limit":2,"offset":0,"receipts":[{"operation":"inject","payload":{"fact_id":"ob_229af90f8d16ef16","kind":"observation","observation_id":"ob_229af90f8d16ef16","outcomes":{"ambiguous":0,"matched":0,"new":2},"point_count":80,"points_sha256":"fc2478b170ae701b4cf117b43598bff6beb6ea4b6f4b2808a7acfb760eb119a7","result_sha256":"ef6ab83bd606d553640f8eae2ce551cf51727ac77be7f1f4f17905347a1985db","segment_count":2,"timestamp":"2026-11-14T09:30:00.000Z"},"previous_hash":null,"receipt_hash":"3a1af60c24e8ecddaa51af72cbe90ec5df57f8583ece41099331abcdd8c9abd7","sequence":0,"timestamp_utc":"2026-11-14T21:04:55.258Z"},{"operation":"edit","payload":{"action":"provisional","change_evidence":null,"fact_id":"in_7019266d587b2c13","instance_id":"in_7019266d587b2c13","kind":"action","novelty_milli":1000,"observation_id":"ob_229af90f8d16ef16","outcome":"new","previous_state_sha256":null,"segment":0,"state_sha256":"a480a70057f39e5639281f9af06d045fae084d685dff71e4d291fc71badb347d","surprise_milli":null},"previous_hash":"3a1af60c24e8ecddaa51af72cbe90ec5df57f8583ece41099331abcdd8c9abd7","receipt_hash":"14983a8efc7ef96fd85ec6f73f8be0933a5c5e1840f841e7b65194e594bfe155","sequence":1,"timestamp_utc":"2026-11-14T21:04:55.258Z"}]}}}},"400":{"description":"invalid_request: The request does not have the documented shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}},"/v1/spatial/spaces/{space_id}/receipts/export":{"get":{"operationId":"export_receipts","summary":"Export the receipt chain","description":"Returns the whole chain as JSON Lines, one receipt per line, which the published verifiers check unchanged. The X-Receipt-Head header carries the head.","parameters":[{"name":"space_id","in":"path","required":true,"schema":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Success.","content":{"application/x-ndjson":{"schema":{"type":"string"},"example":"{\"operation\": \"inject\", \"payload\": {\"fact_id\": \"ob_229af90f8d16ef16\", \"kind\": \"observation\", \"observation_id\": \"ob_229af90f8d16ef16\", \"outcomes\": {\"ambiguous\": 0, \"matched\": 0, \"new\": 2}, \"point_count\": 80, \"points_sha256\": \"fc2478b170ae701b4cf117b43598bff6beb6ea4b6f4b2808a7acfb760eb119a7\", \"result_sha256\": \"ef6ab83bd606d553640f8eae2ce551cf51727ac77be7f1f4f17905347a1985db\", \"segment_count\": 2, \"timestamp\": \"2026-11-14T09:30:00.000Z\"}, \"previous_hash\": null, \"receipt_hash\": \"3a1af60c24e8ecddaa51af72cbe90ec5df57f8583ece41099331abcdd8c9abd7\", \"sequence\": 0, \"timestamp_utc\": \"2026-11-14T21:04:55.258Z\"}\n{\"operation\": \"edit\", \"payload\": {\"action\": \"provisional\", \"change_evidence\": null, \"fact_id\": \"in_7019266d587b2c13\", \"instance_id\": \"in_7019266d587b2c13\", \"kind\": \"action\", \"novelty_milli\": 1000, \"observation_id\": \"ob_229af90f8d16ef16\", \"outcome\": \"new\", \"previous_state_sha256\": null, \"segment\": 0, \"state_sha256\": \"a480a70057f39e5639281f9af06d045fae084d685dff71e4d291fc71badb347d\", \"surprise_milli\": null}, \"previous_hash\": \"3a1af60c24e8ecddaa51af72cbe90ec5df57f8583ece41099331abcdd8c9abd7\", \"receipt_hash\": \"14983a8efc7ef96fd85ec6f73f8be0933a5c5e1840f841e7b65194e594bfe155\", \"sequence\": 1, \"timestamp_utc\": \"2026-11-14T21:04:55.258Z\"}\n"}}},"400":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"invalid_api_key","message":"Send a valid API key in the Authorization header as \"Bearer <key>\".","details":{}}}}}},"404":{"description":"space_not_found: No space with this id exists for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"},"example":{"error":{"code":"space_not_found","message":"No space with this id exists for this account.","details":{"space_id":"sp_0000000000000000"}}}}}},"500":{"description":"internal_error: The service failed to handle the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/spatial_Error"}}}}},"tags":["Spatial Memory API"],"security":[{"bearer":[]}]}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key such as qk_live_… from the console."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}}}}},"AccountSummary":{"type":"object","properties":{"account":{"type":"string"},"plan":{"type":"object"},"trial":{"type":["object","null"]},"quota":{"type":"object","properties":{"window":{"type":"string","enum":["month","trial"]},"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"limit":{"type":"integer"},"used":{"type":"integer"},"remaining":{"type":"integer"}}},"billing":{"type":["object","null"]}}},"Usage":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"totals":{"$ref":"#/components/schemas/UsageFigures"},"daily":{"type":"array","items":{"type":"object"}},"by_key":{"type":"array","items":{"$ref":"#/components/schemas/UsageFigures"}},"by_operation":{"type":"array","items":{"$ref":"#/components/schemas/UsageFigures"}}}},"UsageFigures":{"type":"object","properties":{"calls":{"type":"integer"},"counted":{"type":"integer"},"ok":{"type":"integer"},"client_errors":{"type":"integer"},"server_errors":{"type":"integer"},"rate_limited":{"type":"integer"},"error_rate":{"type":"number"},"latency_ms":{"type":"object","properties":{"mean":{"type":["integer","null"]},"p50":{},"p95":{}}},"bytes_out":{"type":"integer"}}},"verify_Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","enum":["not_found","method_not_allowed","unsupported_media_type","invalid_json","invalid_request","unknown_field","invalid_expected_head","chain_required","pack_required","invalid_base64","invalid_multipart","invalid_trusted_keys","invalid_replay_policy","payload_too_large","too_many_receipts","archive_too_large","trusted_keys_too_large","empty_chain","receipt_not_json","duplicate_key","nesting_too_deep","invalid_zip","unsupported_archive","unsafe_archive","unknown_pack_member","busy","verifier_timeout","verifier_memory_limit","verifier_failed","internal_error"]},"message":{"type":"string","description":"One plain English sentence."},"details":{"type":"object"}}}}},"verify_Receipt":{"type":"object","description":"One receipt (receipt-chain specification, section 1). The service accepts any JSON value in the array and reports a receipt of another form as a failure of the fields check.","required":["sequence","timestamp_utc","operation","previous_hash","payload","receipt_hash"],"additionalProperties":false,"properties":{"sequence":{"type":"integer","minimum":0},"timestamp_utc":{"type":"string"},"operation":{"type":"string","enum":["inject","edit","forget"]},"previous_hash":{"oneOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}]},"payload":{"type":"object"},"receipt_hash":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"verify_ReceiptsRequest":{"type":"object","additionalProperties":false,"description":"Exactly one of receipts and jsonl.","properties":{"receipts":{"type":"array","maxItems":10000,"items":{"$ref":"#/components/schemas/verify_Receipt"}},"jsonl":{"type":"string","description":"The chain as JSON Lines text: one receipt per line; blank lines are skipped."},"expected_head":{"type":["string","null"],"pattern":"^[0-9a-fA-F]{64}$","description":"The head you hold from a separate channel. Compared without regard to letter case."}},"oneOf":[{"required":["receipts"]},{"required":["jsonl"]}]},"verify_ReceiptCheck":{"type":"object","required":["id","rule","description","result","receipts_checked"],"properties":{"id":{"type":"string","enum":["fields","sequence","previous_hash","receipt_hash","expected_head"]},"rule":{"type":"string"},"description":{"type":"string"},"result":{"type":"string","enum":["pass","fail","not_run"]},"receipts_checked":{"type":"integer","minimum":0}}},"verify_ReceiptsResponse":{"type":"object","required":["valid","links_valid","verified","length","head","expected_head","head_matches_expected","first_failure","checks","stops_at_first_failure","summary","scope"],"properties":{"valid":{"type":"boolean","description":"True if the chain is link-valid and, when expected_head was supplied, its head matches. This is the valid of the published verifiers."},"links_valid":{"type":"boolean","description":"Every receipt passed the fields, sequence, previous_hash and receipt_hash checks."},"verified":{"type":"boolean","description":"Link-valid and the head matches the expected head: verified in the sense of the specification. False when no expected head was supplied."},"length":{"type":"integer","description":"Number of receipts in the request."},"head":{"oneOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}],"description":"The receipt_hash of the last receipt, if the chain is link-valid; otherwise null."},"expected_head":{"oneOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}]},"head_matches_expected":{"type":["boolean","null"],"description":"Null when no expected head was supplied; false when the chain is not link-valid."},"first_failure":{"oneOf":[{"type":"null"},{"type":"object","required":["index","sequence","check","message"],"properties":{"index":{"type":"integer","description":"Position of the receipt in the request, from 0."},"sequence":{"type":["integer","string","null"],"description":"The sequence field of that receipt, if it is an integer (as a string beyond 2^53 - 1)."},"check":{"type":"string","enum":["fields","sequence","previous_hash","receipt_hash"]},"message":{"type":"string"}}}]},"checks":{"type":"array","items":{"$ref":"#/components/schemas/verify_ReceiptCheck"}},"stops_at_first_failure":{"type":"boolean","const":true},"summary":{"type":"string"},"scope":{"$ref":"#/components/schemas/verify_Scope"}}},"verify_Scope":{"type":"object","required":["shows","does_not_show"],"properties":{"shows":{"type":"array","items":{"type":"string"}},"does_not_show":{"type":"array","items":{"type":"string"}}}},"verify_TrustedKey":{"type":"object","required":["role","public_key"],"properties":{"role":{"type":"string","enum":["record-signing","log-signing"]},"public_key":{"type":"string","pattern":"^[0-9a-f]{64}$"},"key_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the 32 public key bytes. Computed by the service if omitted."},"holder":{"type":"string","description":"Who holds the private key, for the reader. Defaults to \"supplied by the caller\". If the pack carries a key copy, every key of the copy must equal a trusted key member for member, holder included; otherwise step s13 reports PACK_KEYS_CONFLICT."}}},"verify_RecordsRequest":{"type":"object","additionalProperties":false,"description":"Exactly one of pack and pack_zip.","properties":{"pack":{"type":"object","description":"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.","propertyNames":{"enum":["record.json","model.onnx","window.npy","log/tree-head.json","log/tree-head-earlier.json","log/inclusion-proof.json","log/consistency-proof.json","log/entries.json","untrusted-key-copy.json","README.md","SPEC.md","EXPECTED.json","MANIFEST.sha256"]},"additionalProperties":{"type":"string","contentEncoding":"base64"}},"pack_zip":{"type":"string","contentEncoding":"base64","contentMediaType":"application/zip"},"trusted_keys":{"description":"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).","oneOf":[{"type":"string"},{"type":"object"},{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/verify_TrustedKey"}}]},"replay":{"type":"string","enum":["signed","always","never"],"default":"signed"}},"oneOf":[{"required":["pack"]},{"required":["pack_zip"]}]},"verify_RecordCheck":{"type":"object","required":["id","title","description","code","result"],"properties":{"id":{"type":"string","enum":["s01_trusted_keys","s02_record","s03_signature","s04_input","s05_model_digest","s06_model_profile","s07_trace","s08_tree_head","s09_earlier_tree_head","s10_inclusion","s11_consistency","s12_log_entries","s13_pack_keys","s14_replay"]},"title":{"type":"string"},"description":{"type":"string"},"code":{"type":"string","description":"The code of the step (SPEC section 11.2). TRUSTED_KEYS_NOT_SUPPLIED replaces the s01 code when no trusted keys were supplied."},"result":{"type":"string","enum":["pass","fail","incomplete","error","not_evaluated","not_established"]},"note":{"type":"string"}}},"verify_RecordsResponse":{"type":"object","required":["verdict","verifier_verdict","summary","signature_trust","replay_policy","replay_accepted","checks","computed","subject","log_operator_is_record_producer","replay","scope","environment","reference_report"],"properties":{"verdict":{"type":"string","enum":["PASS","FAIL","INCOMPLETE","ERROR","TRUST_NOT_ESTABLISHED"],"description":"With trusted keys, the verdict of the specification. Without them, FAIL if a step that does not depend on trust failed, otherwise TRUST_NOT_ESTABLISHED."},"verifier_verdict":{"type":"string","enum":["PASS","FAIL","INCOMPLETE","ERROR"],"description":"The verdict in the report of the reference verifier."},"summary":{"type":"string"},"signature_trust":{"type":"object","required":["established","source","trusted_keys_sha256","message"],"properties":{"established":{"type":"boolean"},"source":{"type":"string","enum":["caller","none"]},"trusted_keys_sha256":{"oneOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}]},"message":{"type":"string"}}},"replay_policy":{"type":"string","enum":["signed","always","never"]},"replay_accepted":{"type":"string","enum":["yes","no","not_decided"]},"checks":{"type":"array","minItems":14,"maxItems":14,"items":{"$ref":"#/components/schemas/verify_RecordCheck"}},"computed":{"type":"object","description":"What the verifier calculated itself (SPEC section 12.1).","additionalProperties":{"type":"string"}},"subject":{"type":"object","description":"The record's case_label, created_time_utc and producer_name, copied, if the record could be read."},"log_operator_is_record_producer":{"type":"string","enum":["yes","no","unknown"]},"replay":{"type":"object","description":"Replay measurements: for every value the recorded and replayed bits, the status and the deviations (SPEC section 12.1)."},"scope":{"type":"object","required":["shows","does_not_show","not_yet_given","record_scope"],"properties":{"shows":{"type":"array","items":{"type":"object","required":["code","text","established"],"properties":{"code":{"type":"string"},"text":{"type":"string"},"established":{"type":"boolean"}}}},"does_not_show":{"type":"array","items":{"type":"object","required":["code","text"],"properties":{"code":{"type":"string"},"text":{"type":"string"}}}},"not_yet_given":{"type":"array","items":{"type":"string"},"description":"SPEC section 14."},"record_scope":{"type":"object","description":"The record's own scope block, copied (SPEC section 8.3)."}}},"environment":{"type":"object","additionalProperties":{"type":"string"},"description":"Where and with what the verification ran."},"reference_report":{"type":"object","description":"The complete report of the reference verifier (SPEC section 12.1)."},"reference_report_note":{"type":"string"}}},"verify_SpecList":{"type":"object","required":["specs"],"properties":{"specs":{"type":"array","items":{"type":"object","required":["name","title","description","media_type","bytes","sha256","url","verified_by"],"properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"media_type":{"type":"string"},"bytes":{"type":"integer"},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"url":{"type":"string"},"verified_by":{"type":"string"}}}}}},"verify_VerifierListing":{"type":"object","required":["package","version","licence","copyright","files","checksums","verifiers","note"],"properties":{"package":{"type":"string"},"version":{"type":["string","null"]},"licence":{"type":"string"},"copyright":{"type":"string"},"files":{"type":"array","items":{"type":"object","required":["name","bytes","sha256","media_type","url","description"],"properties":{"name":{"type":"string"},"bytes":{"type":"integer"},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"media_type":{"type":"string"},"url":{"type":"string"},"description":{"type":"string"}}}},"checksums":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"format":{"type":"string"}}},"verifiers":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string"},"language":{"type":"string"},"file":{"type":"string"},"dependencies":{"type":"array","items":{"type":"string"}},"version":{"type":["string","null"]}}}},"note":{"type":"string"}}},"verify_Limits":{"type":"object","required":["service","limits"],"properties":{"service":{"type":"string","const":"verify"},"limits":{"type":"array","items":{"type":"object","required":["id","title","text"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"text":{"type":"string"}}}}}},"memory_Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","enum":["address_ambiguous","address_taken","answer_not_expressible","answer_too_long","fact_limit_reached","fact_not_found","internal_error","invalid_address","key_collision","knowledge_base_empty","model_loading","model_unavailable","not_enough_receipts","not_found","payload_too_large","subject_capacity_reached","text_required","validation_error"]},"message":{"type":"string"},"details":{"type":"object"}}}}},"memory_Address":{"type":"string","pattern":"^[a-z0-9-]{1,40}(/[a-z0-9-]{1,40}){0,4}$","description":"A place address: 1 to 5 segments of lowercase letters, digits and hyphens, separated by slashes, for example home/kitchen/shelf. It is a key you choose; it is matched exactly and never interpreted."},"memory_Fact":{"type":"object","properties":{"fact_id":{"type":"string","description":"Identifier within the account, never reused."},"prompt":{"type":"string"},"subject":{"type":"string"},"relation":{"type":"string"},"answer":{"type":"string"},"address":{"type":["string","null"]},"target_ids":{"type":"array","items":{"type":"integer"},"description":"The model's token numbers for the answer, in order."},"tokens":{"type":"integer"},"slot":{"type":"integer"},"receipt":{"type":"string","description":"receipt_hash of the latest change."},"created_utc":{"type":"string","format":"date-time"},"updated_utc":{"type":"string","format":"date-time"}}},"memory_RegisterRequest":{"type":"object","additionalProperties":false,"required":["prompt","answer","subject","relation"],"properties":{"prompt":{"type":"string","minLength":1,"maxLength":1000,"description":"The text the answer follows, for example 'The capital of Wakanda is'."},"answer":{"type":"string","minLength":1,"maxLength":200,"description":"The text that follows the prompt after one space. At most 8 tokens of the model's vocabulary."},"subject":{"type":"string","minLength":1,"maxLength":200},"relation":{"type":"string","minLength":1,"maxLength":200},"address":{"$ref":"#/components/schemas/memory_Address"}}},"memory_EditRequest":{"type":"object","additionalProperties":false,"required":["answer"],"description":"Identify the fact by fact_id, or by address (plus relation when several facts share the address).","properties":{"answer":{"type":"string","minLength":1,"maxLength":200},"fact_id":{"type":"string"},"address":{"$ref":"#/components/schemas/memory_Address"},"relation":{"type":"string"},"new_address":{"$ref":"#/components/schemas/memory_Address"}}},"memory_ForgetRequest":{"type":"object","additionalProperties":false,"properties":{"fact_id":{"type":"string"},"address":{"$ref":"#/components/schemas/memory_Address"},"relation":{"type":"string"}}},"memory_QueryRequest":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["keyed","address","natural"],"default":"keyed","description":"keyed: you give subject and relation (reliable). address: you give a place address and optionally the relation (reliable, exact). natural: the service looks for a stored subject in the text (best effort)."},"text":{"type":"string","maxLength":4000,"description":"Prompt to continue when generate is true; required in mode natural."},"subject":{"type":"string"},"relation":{"type":"string"},"address":{"$ref":"#/components/schemas/memory_Address"},"generate":{"type":"boolean","default":false},"max_new_tokens":{"type":"integer","minimum":1,"maximum":64,"default":20},"logits_hash":{"type":"boolean","default":false,"description":"Return SHA-256 hashes of the first-position logits with and without memory, to check bit identity yourself."}}},"memory_QueryResponse":{"type":"object","properties":{"mode":{"type":"string"},"best_effort":{"type":"boolean"},"warning":{"type":"string"},"route":{"type":"object","properties":{"fired":{"type":"boolean"},"fact_id":{"type":["string","null"]},"subject":{"type":["string","null"]},"relation":{"type":["string","null"]},"address":{"type":["string","null"]},"cosine":{"type":["number","null"]},"matched_prompt":{"type":["string","null"]},"matched_answer":{"type":["string","null"]},"matched_address":{"type":["string","null"]}}},"answer":{"type":["string","null"]},"prompt_used":{"type":"string"},"response":{"type":"string"},"response_token_ids":{"type":"array","items":{"type":"integer"}},"memory_applied_steps":{"type":"integer"},"first_logits_sha256":{"type":"string"},"base_first_logits_sha256":{"type":"string"}}},"memory_Receipt":{"type":"object","required":["sequence","timestamp_utc","operation","previous_hash","payload","receipt_hash"],"properties":{"sequence":{"type":"integer"},"timestamp_utc":{"type":"string"},"operation":{"type":"string","enum":["inject","edit","forget"]},"previous_hash":{"type":["string","null"]},"payload":{"type":"object"},"receipt_hash":{"type":"string"}}},"memory_SignedReceipt":{"allOf":[{"$ref":"#/components/schemas/memory_Receipt"},{"type":"object","properties":{"signature":{"type":"string","description":"Ed25519 signature (hex) over the 64 ASCII characters of receipt_hash."},"key_id":{"type":"string"}}}]},"signals_Error":{"type":"object","description":"Error response.","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","description":"The error.","additionalProperties":false,"required":["code","message","details"],"properties":{"code":{"type":"string","description":"Machine-readable error code.","enum":["invalid_parameter","unknown_parameter","invalid_range","request_too_long","not_found","day_not_found","group_not_found","method_not_allowed","internal_error"]},"message":{"type":"string","description":"One plain English sentence."},"details":{"type":"object","description":"Further facts about the error, such as the parameter concerned."}}}}},"signals_SampleRef":{"type":"object","description":"The sample that answered the request.","additionalProperties":false,"required":["version","period","built_at","digest"],"properties":{"version":{"type":"string","description":"Version of the sample."},"period":{"$ref":"#/components/schemas/signals_Period"},"built_at":{"type":"string","description":"Time the sample was built (ISO 8601 UTC).","format":"date-time"},"digest":{"type":"string","description":"SHA-256 digest of the sample (see GET /sample for how it is computed).","pattern":"^[0-9a-f]{64}$"}}},"signals_Period":{"type":"object","description":"A period of whole days, both ends included.","additionalProperties":false,"required":["from","to"],"properties":{"from":{"type":"string","description":"First day.","format":"date"},"to":{"type":"string","description":"Last day.","format":"date"}}},"signals_Notice":{"type":"string","description":"Fixed notice carried by every data response.","const":"This is sample data for October 2026 from one platform's public Romanian-language political content. A candidate group is not a finding of coordination: it is a lead that needs review by a person. The accuracy of the monitor has not been measured."},"signals_Day":{"type":"object","description":"The record of one day of the sample.","additionalProperties":false,"required":["date","record_ref","record","posts","accounts_with_posts","candidate_groups","record_sha256"],"properties":{"date":{"type":"string","description":"The day (the monitor's date).","format":"date"},"record_ref":{"type":["string","null"],"description":"Reference of the daily record, the same as in the published monthly report."},"record":{"description":"The daily record and its verification, or null when the day has no record.","oneOf":[{"$ref":"#/components/schemas/signals_DayRecord"},{"type":"null"}]},"posts":{"description":"Post counts, or null when the day has no record.","oneOf":[{"$ref":"#/components/schemas/signals_DayPosts"},{"type":"null"}]},"accounts_with_posts":{"type":["integer","null"],"description":"Number of accounts with at least one recorded post on the day. Accounts are not named."},"candidate_groups":{"type":"object","description":"Possible same-clip groups formed by the daily comparison of clips.","additionalProperties":false,"required":["comparison_available","groups","cross_account_groups","by_basis"],"properties":{"comparison_available":{"type":"boolean","description":"Whether a daily comparison of clips exists for the day."},"groups":{"type":["integer","null"],"description":"Groups formed on the day."},"cross_account_groups":{"type":["integer","null"],"description":"Of those, groups that span more than one account."},"by_basis":{"description":"Groups by basis code, or null.","oneOf":[{"type":"object","description":"Groups by basis code.","additionalProperties":{"type":"integer"}},{"type":"null"}]}}},"record_sha256":{"type":"string","description":"SHA-256 of the canonical JSON of this object without this field.","pattern":"^[0-9a-f]{64}$"}}},"signals_DayRecord":{"type":"object","description":"The daily record and its verification.","additionalProperties":false,"required":["status","seal","verification_report_sha256"],"properties":{"status":{"type":["string","null"],"description":"Verification status of the daily record.","enum":["verified","unverified","failed"]},"seal":{"type":["string","null"],"description":"How the record is protected: digest_only means digests and no signature.","enum":["digest_only","signed"]},"verification_report_sha256":{"type":["string","null"],"description":"SHA-256 of the day's verification report, as listed in the published monthly report.","pattern":"^[0-9a-f]{64}$"}}},"signals_DayPosts":{"type":"object","description":"Post counts of the day.","additionalProperties":false,"required":["collected","analysed"],"properties":{"collected":{"type":"integer","description":"Posts recorded."},"analysed":{"type":"integer","description":"Posts analysed."}}},"signals_Basis":{"type":"object","description":"One kind of evidence behind a group.","additionalProperties":false,"required":["code","label","rule","strength","links"],"properties":{"code":{"type":"string","description":"Basis code.","enum":["identical_media","same_sound_and_duration","same_duration_within_window","shared_sound","shared_hashtag","co_narrative"]},"label":{"type":"string","description":"What the basis means, in plain words."},"rule":{"type":"string","description":"fixed_rule, or model_assigned for the narrative-group link.","enum":["fixed_rule","model_assigned"]},"strength":{"type":["string","null"],"description":"Strength of a same-clip match as stated in the data.","enum":["strong","probable","possible"]},"links":{"type":["integer","null"],"description":"For an account group: the number of links of this kind. Null for a same-clip group."}}},"signals_Theme":{"type":"object","description":"A theme assigned by fixed, written rules.","additionalProperties":false,"required":["id","label","posts"],"properties":{"id":{"type":"string","description":"Theme identifier."},"label":{"type":"string","description":"Theme label."},"posts":{"type":"integer","description":"Posts that carry the theme."}}},"signals_Group":{"type":"object","description":"A candidate group: a lead for review by a person, not a finding of coordination.","additionalProperties":false,"required":["id","kind","formed_by","period","first_seen","last_seen","size","member_type","accounts","posts","cross_account","linked_pairs","basis","strength","themes","clip","review","evidence","record_sha256"],"properties":{"id":{"type":"string","description":"Opaque, stable identifier.","pattern":"^grp_[0-9a-f]{24}$"},"kind":{"type":"string","description":"possible_same_clip (posts that may show the same clip) or linked_accounts (accounts connected by links in a weekly map).","enum":["possible_same_clip","linked_accounts"]},"formed_by":{"type":"string","description":"The procedure that formed the group.","enum":["daily_clip_comparison","weekly_map"]},"period":{"$ref":"#/components/schemas/signals_Period"},"comparison_day":{"type":"string","description":"For a same-clip group: the day of the comparison that formed it.","format":"date"},"first_seen":{"type":"string","description":"First day on which the monitor recorded a member.","format":"date"},"last_seen":{"type":"string","description":"Last day on which the monitor recorded a member.","format":"date"},"size":{"type":"integer","description":"Number of members."},"member_type":{"type":"string","description":"What the members are.","enum":["post","account"]},"accounts":{"type":"integer","description":"Accounts involved. Accounts are not named."},"posts":{"type":"integer","description":"Posts involved."},"cross_account":{"type":"boolean","description":"Whether the group spans more than one account."},"linked_pairs":{"type":["integer","null"],"description":"For an account group: linked pairs of accounts."},"basis":{"type":"array","description":"The kinds of evidence behind the group.","items":{"$ref":"#/components/schemas/signals_Basis"}},"strength":{"type":["string","null"],"description":"For a same-clip group: strength of the match.","enum":["strong","probable","possible"]},"themes":{"description":"For an account group: the most frequent themes.","oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/signals_Theme"}},{"type":"null"}]},"clip":{"description":"For a same-clip group: the facts of the match.","oneOf":[{"type":"object","description":"Facts of the match.","additionalProperties":false,"required":["duration_seconds","time_span_hours","first_seen_known_for_posts"],"properties":{"duration_seconds":{"type":"array","items":{"type":"number"},"description":"Clip lengths in seconds."},"time_span_hours":{"type":["number","null"],"description":"Hours between the first and the last member."},"first_seen_known_for_posts":{"type":"integer","description":"Members whose first-seen day is known."}}},{"type":"null"}]},"review":{"type":"object","description":"Review state.","additionalProperties":false,"required":["status","is_finding","note"],"properties":{"status":{"type":"string","description":"Review status.","enum":["not_reviewed"]},"is_finding":{"type":"boolean","const":false,"description":"Always false: a group is not a finding."},"note":{"type":"string","description":"What the group does and does not show."}}},"evidence":{"type":"object","description":"Digests for checking the group.","additionalProperties":false,"required":["source_file_sha256","members_commitment"],"properties":{"source_file_sha256":{"type":"string","description":"SHA-256 of the provider's file that formed the group.","pattern":"^[0-9a-f]{64}$"},"verification_report_sha256":{"type":["string","null"],"description":"For a same-clip group: SHA-256 of the verification report of the comparison day.","pattern":"^[0-9a-f]{64}$"},"members_commitment":{"type":"string","description":"Keyed digest of the member list. Only the provider can confirm a member list against it.","pattern":"^[0-9a-f]{64}$"}}},"record_sha256":{"type":"string","description":"SHA-256 of the canonical JSON of this object without this field.","pattern":"^[0-9a-f]{64}$"}}},"signals_Week":{"type":"object","description":"A week with a weekly map.","additionalProperties":false,"required":["week_start","week_end","days_in_sample_period","days_with_record","accounts","posts","linked_pairs","account_groups","accounts_without_link","strict_links","themes","weekly_map_sha256"],"properties":{"week_start":{"type":"string","description":"First day of the week.","format":"date"},"week_end":{"type":"string","description":"Last day of the week.","format":"date"},"days_in_sample_period":{"type":"integer","description":"Days of the week inside the sample period."},"days_with_record":{"type":"integer","description":"Days of the week with a verified daily record."},"accounts":{"type":"integer","description":"Accounts in the map."},"posts":{"type":"integer","description":"Posts in the map."},"linked_pairs":{"type":"integer","description":"Linked pairs of accounts."},"account_groups":{"type":"integer","description":"Groups of linked accounts."},"accounts_without_link":{"type":"integer","description":"Accounts without any link."},"strict_links":{"type":"object","description":"Links by file, sound or hashtag only.","additionalProperties":false,"required":["pairs","largest_group_accounts","groups","accounts_linked"],"properties":{"pairs":{"type":"integer","description":"Linked pairs."},"largest_group_accounts":{"type":"integer","description":"Accounts in the largest group."},"groups":{"type":"integer","description":"Groups."},"accounts_linked":{"type":"integer","description":"Accounts with such a link."}}},"themes":{"type":"array","items":{"$ref":"#/components/schemas/signals_Theme"},"description":"Themes of the week."},"weekly_map_sha256":{"type":"string","description":"SHA-256 of the provider's weekly map file.","pattern":"^[0-9a-f]{64}$"}}},"spatial_Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","enum":["body_too_large","instance_limit_reached","instance_not_found","internal_error","invalid_coverage","invalid_json","invalid_label","invalid_name","invalid_points","invalid_policy","invalid_request","invalid_request_shape","invalid_segments","invalid_sensor_pose","invalid_timestamp","label_in_use","not_found","space_limit_reached","space_not_found","timestamp_out_of_order","too_many_points","unsupported_content_type"]},"message":{"type":"string"},"details":{"type":"object"}}}}},"spatial_Health":{"type":"object","required":["ok","service","version"],"properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"}}},"spatial_Limits":{"type":"object","required":["service","limits"],"properties":{"service":{"type":"string"},"limits":{"type":"array","items":{"type":"object","required":["id","title","text"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"text":{"type":"string"}}}}}},"spatial_CreateSpace":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":80}}},"spatial_Space":{"type":"object","properties":{"space_id":{"type":"string","pattern":"^sp_[0-9a-f]{16}$"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"observations":{"type":"integer"},"latest_observation_at":{"type":["string","null"],"format":"date-time"},"instances":{"type":"integer"},"provisional_instances":{"type":"integer"},"unconfirmed_instances":{"type":"integer"},"receipts":{"type":"integer"},"receipt_head":{"type":["string","null"]}}},"spatial_SpaceList":{"type":"object","properties":{"spaces":{"type":"array","items":{"$ref":"#/components/schemas/spatial_Space"}},"count":{"type":"integer"},"max_spaces":{"type":"integer"}}},"spatial_SpaceDeleted":{"type":"object","properties":{"deleted":{"type":"boolean"},"space_id":{"type":"string"},"final_receipt_head":{"type":["string","null"]},"receipts_deleted":{"type":"integer"}}},"spatial_Policy":{"type":"object","properties":{"update_rule":{"type":"string","enum":["adaptive","last_observation","first_observation"],"default":"adaptive","description":"How the consolidated state is updated: adaptive, last_observation (every match overwrites it) or first_observation (it never changes after the first sighting)."},"match_radius_m":{"type":"number","minimum":0.01,"maximum":5,"default":0.25,"description":"A segment can match an instance only if it lies within this distance of one of the instance's reference positions."},"ambiguity_margin_m":{"type":"number","minimum":0,"maximum":1,"default":0.03,"description":"If the two best candidates differ in cost by less than this, the service abstains."},"shape_weight":{"type":"number","minimum":0,"maximum":1,"default":0.25,"description":"Weight of the shape descriptor distance in the match cost; 0 disables the shape term."},"position_sigma_m":{"type":"number","minimum":0.001,"maximum":1,"default":0.02,"description":"Expected spread of the observed position of an object at rest."},"surprise_sigma":{"type":"number","minimum":0.5,"maximum":20,"default":3,"description":"An observation is surprising when its distance from the consolidated position exceeds this many position sigmas."},"change_radius_m":{"type":"number","minimum":0.005,"maximum":2,"default":0.05,"description":"Surprising observations count as the same change when they lie within this distance of each other."},"revise_after_observations":{"type":"integer","minimum":1,"maximum":100,"default":3,"description":"Number of agreeing surprising observations needed before the consolidated state is revised."},"revise_after_seconds":{"type":"number","minimum":0,"maximum":86400,"default":0,"description":"Minimum time the change must persist before the consolidated state is revised."},"consolidate_after_observations":{"type":"integer","minimum":1,"maximum":100,"default":3,"description":"Number of sightings needed to consolidate a provisional instance."},"consolidate_after_seconds":{"type":"number","minimum":0,"maximum":86400,"default":1,"description":"Minimum time between the first and the consolidating sighting."},"fast_half_life_seconds":{"type":"number","minimum":0.01,"maximum":3600,"default":1,"description":"Half-life of the smoothed recent position."},"slow_half_life_observations":{"type":"integer","minimum":1,"maximum":1000,"default":5,"description":"A consistent observation moves the consolidated position by 1 - 0.5^(1/this) of the residual."},"unconfirmed_after_misses":{"type":"integer","minimum":1,"maximum":1000,"default":3,"description":"Consecutive observations whose coverage box contains an instance without seeing it before the instance is marked unconfirmed."},"velocity_horizon_seconds":{"type":"number","minimum":0,"maximum":60,"default":2,"description":"Longest time over which the recent velocity is extrapolated for matching."}},"additionalProperties":false},"spatial_PolicyView":{"type":"object","properties":{"space_id":{"type":"string"},"policy":{"$ref":"#/components/schemas/spatial_Policy"},"settings":{"type":"array","items":{"type":"object"}}}},"spatial_PolicyUpdated":{"type":"object","properties":{"space_id":{"type":"string"},"policy":{"$ref":"#/components/schemas/spatial_Policy"},"changed":{"type":"array","items":{"type":"string"}},"receipt":{"$ref":"#/components/schemas/spatial_Receipt"}}},"spatial_Observation":{"type":"object","required":["points"],"additionalProperties":false,"properties":{"points":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"minItems":1,"description":"Points in metres."},"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"sensor_pose":{"type":"object","required":["position","orientation"],"properties":{"position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"orientation":{"type":"array","items":{"type":"number"},"minItems":4,"maxItems":4,"description":"Quaternion w, x, y, z."}},"description":"Applied as given to turn sensor coordinates into space coordinates."},"segments":{"type":"array","maxItems":64,"items":{"type":"array","items":{"type":"integer"},"minItems":3},"description":"Optional pre-segmented clusters as lists of point indices. Without it the service segments the cloud itself."},"coverage":{"type":"object","required":["min","max"],"properties":{"min":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"max":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}},"description":"Axis-aligned box the sensor fully covered. Only with it are objects that were expected but not seen counted as missed."},"options":{"type":"object","additionalProperties":false,"properties":{"voxel_size_m":{"type":"number","minimum":0.005,"maximum":0.2,"default":0.025},"min_segment_points":{"type":"integer","minimum":3,"maximum":100000,"default":30},"remove_dominant_plane":{"type":"boolean","default":false}}}}},"spatial_SegmentResult":{"type":"object","properties":{"segment":{"type":"integer"},"point_count":{"type":"integer"},"position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"extent":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"outcome":{"type":"string","enum":["matched","new","ambiguous"]},"action":{"type":"string","enum":["reinforce","provisional","alternative","revise","consolidate","abstain"]},"instance_id":{"type":["string","null"]},"status":{"type":["string","null"],"enum":["provisional","consolidated",null]},"match_score":{"type":["number","null"],"description":"1 - cost / match radius, from 0 to 1."},"novelty":{"type":"number","description":"Distance to the nearest instance over the match radius, capped at 1."},"surprise":{"type":["number","null"],"description":"Distance from the consolidated position in position sigmas."},"change_evidence":{"type":["integer","null"],"description":"Consecutive agreeing surprising observations so far."},"change_evidence_needed":{"type":"integer"},"evidence":{"type":"object","properties":{"match_radius_m":{"type":"number"},"ambiguity_margin_m":{"type":"number"},"nearest":{"type":["object","null"],"properties":{"instance_id":{"type":"string"},"distance_m":{"type":"number"},"reference":{"type":"string","enum":["predicted","last_seen","consolidated","alternative"]},"reference_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"shape_distance":{"type":["number","null"]},"cost":{"type":"number"}}},"match":{"type":["object","null"],"properties":{"instance_id":{"type":"string"},"distance_m":{"type":"number"},"reference":{"type":"string","enum":["predicted","last_seen","consolidated","alternative"]},"reference_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"shape_distance":{"type":["number","null"]},"cost":{"type":"number"}}},"runner_up":{"type":["object","null"],"properties":{"instance_id":{"type":"string"},"distance_m":{"type":"number"},"reference":{"type":"string","enum":["predicted","last_seen","consolidated","alternative"]},"reference_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"shape_distance":{"type":["number","null"]},"cost":{"type":"number"}}},"candidates":{"type":"array","items":{"type":["object","null"],"properties":{"instance_id":{"type":"string"},"distance_m":{"type":"number"},"reference":{"type":"string","enum":["predicted","last_seen","consolidated","alternative"]},"reference_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"shape_distance":{"type":["number","null"]},"cost":{"type":"number"}}}},"residual_from_consolidated_m":{"type":"number"},"reconfirmed":{"type":"boolean"},"revised_from":{"type":["array","null"],"items":{"type":"number"},"minItems":3,"maxItems":3}}}}},"spatial_ObservationResult":{"type":"object","properties":{"observation_id":{"type":"string"},"space_id":{"type":"string"},"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"point_count":{"type":"integer"},"points_sha256":{"type":"string"},"segmentation":{"type":"object"},"update_rule":{"type":"string","enum":["adaptive","last_observation","first_observation"]},"segments":{"type":"array","items":{"$ref":"#/components/schemas/spatial_SegmentResult"}},"missing":{"type":"array","items":{"type":"object","properties":{"instance_id":{"type":"string"},"label":{"type":["string","null"]},"misses":{"type":"integer"},"action":{"type":"string","enum":["missed","unconfirmed"]},"expected_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}}}},"receipts":{"type":"object","properties":{"appended":{"type":"integer"},"first_sequence":{"type":"integer"},"head":{"type":"string"}}}}},"spatial_Instance":{"type":"object","properties":{"instance_id":{"type":"string"},"label":{"type":["string","null"]},"status":{"type":"string","enum":["provisional","consolidated"]},"unconfirmed":{"type":"boolean"},"misses":{"type":"integer"},"created_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"sightings":{"type":"integer"},"last_seen_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"last_seen_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"consolidated_position":{"type":["array","null"],"items":{"type":"number"},"minItems":3,"maxItems":3},"revision_pending":{"type":"boolean"}}},"spatial_InstanceList":{"type":"object","properties":{"space_id":{"type":"string"},"instances":{"type":"array","items":{"$ref":"#/components/schemas/spatial_Instance"}},"count":{"type":"integer"}}},"spatial_InstanceDetail":{"allOf":[{"$ref":"#/components/schemas/spatial_Instance"},{"type":"object","properties":{"recent_position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"alternative":{"type":["object","null"]},"provisional_support":{"type":["object","null"]},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"observation_id":{"type":["string","null"]},"action":{"type":"string"},"observed_position":{"type":["array","null"],"items":{"type":"number"},"minItems":3,"maxItems":3},"consolidated_position":{"type":["array","null"],"items":{"type":"number"},"minItems":3,"maxItems":3},"status":{"type":"string"},"unconfirmed":{"type":"boolean"},"novelty":{"type":["number","null"]},"surprise":{"type":["number","null"]},"change_evidence":{"type":["integer","null"]},"match_score":{"type":["number","null"]}}}},"history_total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}]},"spatial_Label":{"type":"object","required":["label"],"additionalProperties":false,"properties":{"label":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9 ._-]{0,63}$"}}},"spatial_Labelled":{"allOf":[{"$ref":"#/components/schemas/spatial_Instance"},{"type":"object","properties":{"receipt":{"$ref":"#/components/schemas/spatial_Receipt"}}}]},"spatial_Forgotten":{"type":"object","properties":{"forgotten":{"type":"boolean"},"instance_id":{"type":"string"},"history_records_deleted":{"type":"integer"},"receipt":{"$ref":"#/components/schemas/spatial_Receipt"}}},"spatial_Find":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string"},"instance_id":{"type":"string"},"include_provisional":{"type":"boolean","default":false}},"description":"Exactly one of label or instance_id."},"spatial_FindAnswer":{"type":"object","required":["answer"],"properties":{"space_id":{"type":"string"},"query":{"type":"object"},"answer":{"type":"string","enum":["seen","provisional","not_seen","ambiguous","unconfirmed"]},"instance_id":{"type":"string"},"label":{"type":["string","null"]},"status":{"type":"string"},"position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"last_seen_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"seen_in_latest_observation":{"type":"boolean"},"revision_pending":{"type":"boolean"},"alternative":{"type":"object"},"ambiguous_observation":{"type":"object"},"misses":{"type":"integer"},"provisional_instance_exists":{"type":"boolean"},"message":{"type":"string"}}},"spatial_SpaceAt":{"type":"object","properties":{"space_id":{"type":"string"},"t":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"count":{"type":"integer"},"note":{"type":"string"},"instances":{"type":"array","items":{"type":"object","properties":{"instance_id":{"type":"string"},"label":{"type":["string","null"]},"status":{"type":"string"},"unconfirmed":{"type":"boolean"},"consolidated_position":{"type":["array","null"],"items":{"type":"number"},"minItems":3,"maxItems":3},"last_seen_at":{"type":["string","null"],"format":"date-time"},"last_event":{"type":"string"},"last_event_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."}}}}}},"spatial_Receipt":{"type":"object","required":["sequence","timestamp_utc","operation","previous_hash","payload","receipt_hash"],"additionalProperties":false,"description":"One receipt of the published receipt-chain format. receipt_hash is the SHA-256 of the canonical JSON of the first five fields. Payloads contain integers, strings, booleans, nulls, lists and objects only.","properties":{"sequence":{"type":"integer","minimum":0},"timestamp_utc":{"type":"string","format":"date-time","description":"ISO 8601 UTC ending in Z."},"operation":{"type":"string","enum":["inject","edit","forget"]},"previous_hash":{"type":["string","null"],"pattern":"^[0-9a-f]{64}$"},"payload":{"type":"object"},"receipt_hash":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"spatial_ReceiptPage":{"type":"object","properties":{"space_id":{"type":"string"},"count":{"type":"integer"},"head":{"type":["string","null"]},"limit":{"type":"integer"},"offset":{"type":"integer"},"receipts":{"type":"array","items":{"$ref":"#/components/schemas/spatial_Receipt"}}}}}}}