{"openapi":"3.1.0","info":{"title":"data.humanarchive.ai","description":"Plan vs actual, corpus composition, ledger state, and metadata correction over HA's capture data.","version":"0.1.0"},"paths":{"/api/distribution/overview":{"get":{"summary":"Overview","operationId":"overview_api_distribution_overview_get","parameters":[{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distribution/explorer":{"get":{"summary":"Explorer","operationId":"explorer_api_distribution_explorer_get","parameters":[{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distribution/explorer/{l1}":{"get":{"summary":"Explorer One","operationId":"explorer_one_api_distribution_explorer__l1__get","parameters":[{"name":"l1","in":"path","required":true,"schema":{"type":"string","title":"L1"}},{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distribution/limits":{"get":{"summary":"Limits","operationId":"limits_api_distribution_limits_get","parameters":[{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distribution/pace":{"get":{"summary":"Pace","description":"Filterable by phase or by week.\n\n⚠ PLAN AND ACTUAL ARE ALWAYS MEASURED OVER THE SAME SPAN, so no selection can compare\nunlike spans. `phase` and `week` can be combined into a contradictory request; week\nwins, which is the reference's documented precedence (§11 Q15).","operationId":"pace_api_distribution_pace_get","parameters":[{"name":"phase","in":"query","required":false,"schema":{"type":"string","default":"","title":"Phase"}},{"name":"week","in":"query","required":false,"schema":{"type":"string","default":"","title":"Week"}},{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distribution/roadmap":{"get":{"summary":"Roadmap","operationId":"roadmap_api_distribution_roadmap_get","parameters":[{"name":"basis_req","in":"query","required":false,"schema":{"type":"string","default":"accepted","title":"Basis Req"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/whoami":{"get":{"summary":"Whoami","description":"Who this request is. Also the cheapest way for the frontend to check a token is still good.","operationId":"whoami_api_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sources":{"get":{"summary":"Sources","description":"Where every page reads from: each route's planes, each page's non-ledger planes, and every\ngap with the substrate question that would close it (`app/sources.py`). The shell renders the\ncurrent page's non-ledger planes from this, so no page has to remember to say so.","operationId":"sources_api_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vocab":{"get":{"summary":"Vocab","operationId":"vocab_api_vocab_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/census":{"get":{"summary":"Census","description":"Everything the Overview, Diversity and Environment views need, in one round trip.\n\nOne endpoint rather than six because these are all group-bys over the same filtered set, and\nsix calls would let the page render a total from one filter state beside a distribution from\nanother — a mismatch nobody would notice and no chart would flag.\n\n⚠ FROM THE LEDGER (ha-architecture#309, 2026-09-30): `app/census_ledger.py` asks the mart for\nevery reporting number, after parity with the tracker was proven at one instant. The TRACKER\ncensus below is KEPT, and answers only when asked for by name (`?source=tracker`, the side-by-\nside the nightly parity and a person use) or when a filter is one the ledger cannot express\n(a date range, an offload batch). `meta.plane` and `meta.fallback` say which, and why.","operationId":"census_api_census_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mapping":{"get":{"summary":"Mapping Get","description":"The folding rules in force, and where they came from.","operationId":"mapping_get_api_mapping_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Mapping Put","description":"Replace the folding rules.\n\n⚠ THIS MOVES REAL HOURS BETWEEN PLAN CATEGORIES, so it is gated and attributed. The caller must\nbe signed in (the router requires it), the rules are validated before anything is written, and\neach rule records who saved it and when — a change that reshapes every per-category figure\nshould never be anonymous.\n\n⚠ VALIDATED, NOT TRUSTED. A rule folding a label into a category the plan does not contain\nwould silently move hours into a bucket that renders nowhere; two rules for one label would make\nthe result depend on list order. Both are refused here rather than absorbed.","operationId":"mapping_put_api_mapping_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lookup":{"get":{"summary":"Lookup","description":"Everything known about one capture, from a chunk id, an object key or a deployment id.\n\n⚠ THE CHAIN REPORTS WHERE IT STOPPED. Each hop fails for a different reason — qa does not know\nthe chunk, the object key carries no deployment id, the id names a shoot nobody logged — and\nthey send you to different systems. A bare \"not found\" would send you to the wrong one.","operationId":"lookup_api_lookup_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/corpus":{"get":{"summary":"Corpus","description":"Ledger counters. `meta.read` says `nightly-collection`, not `live`, and says why.","operationId":"corpus_api_corpus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ledger/edges":{"get":{"summary":"Ledger Edges","description":"`edge_completeness` — the one genuinely aggregate op the read contract already has, so this\none IS live. Kept separate from /corpus precisely so the freshness claims stay honest.","operationId":"ledger_edges_api_ledger_edges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ledger/value-proposals":{"get":{"summary":"Ledger Value Proposals","description":"What the tracker said that the ledger's value lists do not hold yet (`values.device` …): each\na PROPOSAL, stored as sent, counted here, approved by a person as one new list version\n(ha-substrate docs/VALUE-LISTS.md). Live: the read door's `value_proposals` op.","operationId":"ledger_value_proposals_api_ledger_value_proposals_get","parameters":[{"name":"value_list","in":"query","required":false,"schema":{"type":"string","default":"","title":"Value List"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ledger/recording/{recording_id}":{"get":{"summary":"Ledger Recording","description":"Live drill-down by id — the read path that does work today.","operationId":"ledger_recording_api_ledger_recording__recording_id__get","parameters":[{"name":"recording_id","in":"path","required":true,"schema":{"type":"string","title":"Recording Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ledger/entities":{"get":{"summary":"Ledger Entities","operationId":"ledger_entities_api_ledger_entities_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system-health":{"get":{"summary":"System Health","description":"The substrate's five-minute health beat (the door's `views` op, `system_health`) beside the nightly\ntracker↔ledger parity verdict. `app/system_health.py` says what each part is and where it comes from.","operationId":"system_health_api_system_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/linkage":{"get":{"summary":"Linkage","operationId":"linkage_api_linkage_get","parameters":[{"name":"sample","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":0,"default":0,"title":"Sample"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments":{"get":{"summary":"List Deployments","operationId":"list_deployments_api_deployments_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{run_hex}":{"get":{"summary":"Get Deployment","operationId":"get_deployment_api_deployments__run_hex__get","parameters":[{"name":"run_hex","in":"path","required":true,"schema":{"type":"string","title":"Run Hex"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{run_hex}/plan":{"post":{"summary":"Plan Edit","description":"Validate a patch and report what it would change and unlock. Never writes.","operationId":"plan_edit_api_deployments__run_hex__plan_post","parameters":[{"name":"run_hex","in":"path","required":true,"schema":{"type":"string","title":"Run Hex"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/{run_hex}/apply":{"post":{"summary":"Apply Edit","description":"Apply a patch. Audited before the write; refused (but still audited) when writes are off.","operationId":"apply_edit_api_deployments__run_hex__apply_post","parameters":[{"name":"run_hex","in":"path","required":true,"schema":{"type":"string","title":"Run Hex"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments/bulk/plan":{"post":{"summary":"Bulk Plan","description":"Plan one patch across many captures — the session grain, where purpose and permission\nactually live. Refusals are per capture so one bad row does not sink the batch.","operationId":"bulk_plan_api_deployments_bulk_plan_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/governance/{run_hex}":{"get":{"summary":"Admin Governance","description":"What the LEDGER currently says about this capture — consent, scope (its own or its\nproject's), hold, project. The read half of the Permission card: governing an unmarked corpus\nagainst a write-only form means typing blind.","operationId":"admin_governance_api_admin_governance__run_hex__get","parameters":[{"name":"run_hex","in":"path","required":true,"schema":{"type":"string","title":"Run Hex"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/project":{"post":{"summary":"Admin Assign Project","description":"This capture is in that project. The project's scope then reaches every file in it.","operationId":"admin_assign_project_api_admin_project_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/project/bulk":{"post":{"summary":"Admin Assign Project Bulk","description":"Every listed capture into one project — the session grain. At most 500 per call.","operationId":"admin_assign_project_bulk_api_admin_project_bulk_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scope":{"post":{"summary":"Admin Set Scope","description":"The PROJECT's scope, once: internal | research | non-exclusive | exclusive (+recipients,\npurpose, until). Exclusive means one recipient, refused otherwise — here and at the door.","operationId":"admin_set_scope_api_admin_scope_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hold":{"post":{"summary":"Admin Record Hold","description":"A legal hold on a capture, a project or a file. Erasure refuses while it stands.","operationId":"admin_record_hold_api_admin_hold_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/withdraw":{"post":{"summary":"Admin Withdraw Consent","description":"The participant withdrew. One note on the capture; every file and derivative then refuses.","operationId":"admin_withdraw_consent_api_admin_withdraw_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/project/remove":{"post":{"summary":"Admin Remove From Project","description":"Take a capture out of a project. The arrow is ended with the reason; it is not deleted.","operationId":"admin_remove_from_project_api_admin_project_remove_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/hold/lift":{"post":{"summary":"Admin Lift Hold","description":"Lift a hold. Retracted with the reason; the hold's history stays.","operationId":"admin_lift_hold_api_admin_hold_lift_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scope/retract":{"post":{"summary":"Admin Retract Scope","description":"Withdraw a project's scope: every file under it becomes unmarked for delivery.","operationId":"admin_retract_scope_api_admin_scope_retract_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blocks":{"get":{"summary":"Blocks List","description":"Every declared delivery block, its terms and computed status (`list_blocks`).","operationId":"blocks_list_api_blocks_get","parameters":[{"name":"recipient","in":"query","required":false,"schema":{"type":"string","default":"","title":"Recipient"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blocks/{block_id}":{"get":{"summary":"Blocks One","description":"One block: its captures (shipped / excluded / pending), a person's clip designations, and hours by state from\nthe delivery's own selection with the block (`delivery_tally block=`).","operationId":"blocks_one_api_blocks__block_id__get","parameters":[{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blocks/{block_id}/ready":{"get":{"summary":"Blocks Ready","description":"The exact tranche the delivery driver WOULD drive for this block, and the command the owner runs to open it.\nShown, never run.","operationId":"blocks_ready_api_blocks__block_id__ready_get","parameters":[{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blocks/{block_id}/preview":{"post":{"summary":"Blocks Preview","description":"What reserving these captures WOULD do — nothing is written: hours and holds with the block, and the captures\nthe door would refuse because another open block for the client holds them.","operationId":"blocks_preview_api_blocks__block_id__preview_post","parameters":[{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/block-captures":{"get":{"summary":"Blocks Capture Search","description":"Captures to reserve: the mart's shoots filtered by rig, site, project, environment, venue, task and date, each\nwith its deliverable hours for `delivery`, QA state and the blocks that hold it.","operationId":"blocks_capture_search_api_block_captures_get","parameters":[{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"site","in":"query","required":false,"schema":{"type":"string","default":"","title":"Site"}},{"name":"project","in":"query","required":false,"schema":{"type":"string","default":"","title":"Project"}},{"name":"environment","in":"query","required":false,"schema":{"type":"string","default":"","title":"Environment"}},{"name":"venue","in":"query","required":false,"schema":{"type":"string","default":"","title":"Venue"}},{"name":"task","in":"query","required":false,"schema":{"type":"string","default":"","title":"Task"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}},{"name":"capture","in":"query","required":false,"schema":{"type":"string","default":"","title":"Capture"}},{"name":"qa_state","in":"query","required":false,"schema":{"type":"string","default":"","title":"Qa State"}},{"name":"min_deliverable_h","in":"query","required":false,"schema":{"type":"string","default":"","title":"Min Deliverable H"}},{"name":"delivery","in":"query","required":false,"schema":{"type":"string","default":"","title":"Delivery"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/block-clips":{"get":{"summary":"Blocks Clip Search","description":"Clips going to a delivery (the clip-level read model, `ask delivery_clips`), filtered by capture, task,\nenvironment, rig, outcome and hold cause — what a person designates or excludes from.","operationId":"blocks_clip_search_api_block_clips_get","parameters":[{"name":"capture","in":"query","required":false,"schema":{"type":"string","default":"","title":"Capture"}},{"name":"environment","in":"query","required":false,"schema":{"type":"string","default":"","title":"Environment"}},{"name":"task","in":"query","required":false,"schema":{"type":"string","default":"","title":"Task"}},{"name":"cause","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cause"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","default":"","title":"Outcome"}},{"name":"delivery","in":"query","required":false,"schema":{"type":"string","default":"","title":"Delivery"}},{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"file","in":"query","required":false,"schema":{"type":"string","default":"","title":"File"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/review/blocks/{block_id}/sample":{"get":{"summary":"Review Sample","description":"`n` of the block's captures in the reviewer's seeded order — their own list, there before any clip is\n(`block_status`: shipped + pending). Each capture's clip is `/review/capture`.","operationId":"review_sample_api_review_blocks__block_id__sample_get","parameters":[{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}},{"name":"seed","in":"query","required":true,"schema":{"type":"integer","minimum":0,"title":"Seed"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/review/capture":{"get":{"summary":"Review Capture","description":"One rendered clip of a sampled capture: its review copy's playable link (the door's `resolve`; this service\nsigns nothing), the fields it ships with (`ask delivery_clip_fields`), and the flags people stated on it.","operationId":"review_capture_api_review_capture_get","parameters":[{"name":"delivery","in":"query","required":true,"schema":{"type":"string","pattern":"^[a-z0-9_]+$","title":"Delivery"}},{"name":"shoot","in":"query","required":true,"schema":{"type":"string","title":"Shoot"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/review/original":{"get":{"summary":"Review Original","description":"A link to download the rendered original — the delivery's MCAP, which no browser plays — asked for one clip at a\ntime (it counts against the door's budget).","operationId":"review_original_api_review_original_get","parameters":[{"name":"output","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Output"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/block":{"post":{"summary":"Admin Create Block","description":"Declare a delivery block: {block, recipient, delivery (the NAME), project}. New terms are a new block.","operationId":"admin_create_block_api_admin_block_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/block/add":{"post":{"summary":"Admin Block Add","description":"Reserve captures for a block (at most 2000 per call). The door refuses, per capture, one another open block\nfor the same client holds.","operationId":"admin_block_add_api_admin_block_add_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/block/release":{"post":{"summary":"Admin Block Release","description":"Take captures back out of a block: their arrows END, with the door's `released` reason.","operationId":"admin_block_release_api_admin_block_release_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/designations":{"post":{"summary":"Admin Designate","description":"Designate clip windows for a block (`include`) or exclude them from a block or a client (`exclude`, with a\nreason from the closed list), in bulk.","operationId":"admin_designate_api_admin_designations_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/designations/end":{"post":{"summary":"Admin End Designations","description":"End designations by their coordinate (file + window, under one scope). The rows stay, ended, with why.","operationId":"admin_end_designations_api_admin_designations_end_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/block/include-only":{"post":{"summary":"Admin Block Include Only","description":"Declare a block include-only (`on: true`: only designated clips ship) or end that declaration (`on: false`,\nwith a reason).","operationId":"admin_block_include_only_api_admin_block_include_only_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/log":{"get":{"summary":"Admin Log","description":"What people have written (or would have, with the switch off). This service's own store.","operationId":"admin_log_api_admin_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/edits":{"get":{"summary":"Recent Edits","description":"The audit tail. Served from this service's own store, not the deployments DB.","operationId":"recent_edits_api_edits_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hours/substrate":{"get":{"summary":"Hours Substrate","description":"The corpus's hours as the substrate's derived layer publishes them — the corpus document\nthe Dashboard reads its unlinked share and its unknown-cuts gate from.\n\nA GET under the authenticated router; no admin group, because it writes nothing. The ledger\ndoor being unreachable is a 503 (`_guard`); a BLIND document is a 200 whose `total` is None\nand whose `blind` says why — never a total of zero.","operationId":"hours_substrate_api_hours_substrate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard":{"get":{"summary":"Dashboard","description":"The hour breakdown for the stages of QA, and the drop into each stage.\n\n`dataset` is a rig: `gi`, `hacam`, `rc`, or `rigs` (the default) for every rig at once.\n\n⚠ THE SUBSTRATE IS THE SOURCE (step 2 of the rebuild, owner 2026-09-28). Recorded and review\nhours come from the ledger's mart by the rig's device; qa is read for its queue (the scope's\nown `/stats/dashboard`, one call), and the tracker ONLY when `dashboard.reads_needed` says a\nnumber falls back to it — under a filter, or when the substrate could not be read. Which\nnumber came from where travels on the payload (`provenance`).","operationId":"dashboard_api_dashboard_get","parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dataset"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kit_split":{"get":{"summary":"Kit Split","description":"The Rock5B's hours by its gloves as the ledger MEASURED them: with, mixed, without, not measured.\n\n⚠ THE LEDGER'S GLOVE DATA, NOT THE TRACKER (owner 2026-10-19). The tracker's kit is typed on the\nstart sheet and its glove hours are a copy; gloves record whenever they are plugged in, worn or\nnot (measured 2026-10-14: 3 of 10 sessions noted gloveless hold 0.5-1.3 GB of glove files). The\nlabel is `capture.glove_streams`: each recording session's measured tactile streams, so a capture\nwhose sessions differ is `mixed`, never forced to a side. `glove_data_agreement` is how often the\ncrew's `kit_setup` matches the label wherever both exist.\nThe HOURS are the ledger's: `kept_over` of the Rock5B's shoots relabelled by glove label — the one\nread every headline is — so the rows sum to the rig's own figures. Every Rock5B capture.","operationId":"kit_split_api_kit_split_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/streams":{"get":{"summary":"Streams","description":"A rig's hours by WHICH OPTIONAL STREAMS each recording has — wrist cameras, gloves, … (owner\n2026-10-22: \"sure you can add wrist cameras to data tracker\"). Per destination x the stored\nstreams-present label, and per filter (both wrists, one wrist, no wrists, gloves, unmeasured).\n\n⚠ THE SUBSTRATE'S MARKER, READ: `mart.status_file.streams` through the door's `status_files`\nsubject — the column `scripts/status.py --by-streams` sums, so the two agree (ha-substrate#2073).\nUnmeasured is its own group, never \"without\".","operationId":"streams_api_streams_get","parameters":[{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"rc","title":"Rig"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deliverable_for":{"get":{"summary":"Deliverable For","description":"Deliverable hours FOR ONE NAMED DELIVERY (owner 2026-10-01), grouped by rig, category (L1) or\nvenue (L2), with every excluded hour by cause — the substrate's `delivery_tally`, over the shoots\nof the dashboard's rig scope. `delivery` defaults to OpenAI's current delivery.","operationId":"deliverable_for_api_deliverable_for_get","parameters":[{"name":"delivery","in":"query","required":false,"schema":{"type":"string","default":"","title":"Delivery"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"rig","title":"Group By"}},{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/viewer/captures":{"get":{"summary":"Viewer Captures","description":"The captures matching a metadata filter, from the LEDGER, for any rig in the contract.","operationId":"viewer_captures_api_viewer_captures_get","parameters":[{"name":"rig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rig"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"l1_environment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L1 Environment Id"}},{"name":"l2_venue_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L2 Venue Id"}},{"name":"l3_scene_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"L3 Scene Id"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"session_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Uid"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Batch Id"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device"}},{"name":"age_range","in":"query","required":false,"schema":{"type":"string","default":"","title":"Age Range"}},{"name":"gender","in":"query","required":false,"schema":{"type":"string","default":"","title":"Gender"}},{"name":"handedness","in":"query","required":false,"schema":{"type":"string","default":"","title":"Handedness"}},{"name":"skill_group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Skill Group"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/viewer/captures/{run_hex}":{"get":{"summary":"Viewer Capture","description":"One capture: its metadata panel and EVERY file the ledger places in it (`arrival_files`:\nthe ledger's file->capture map joined to the byte door's sightings).","operationId":"viewer_capture_api_viewer_captures__run_hex__get","parameters":[{"name":"run_hex","in":"path","required":true,"schema":{"type":"string","title":"Run Hex"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/viewer/files/{sha256}":{"get":{"summary":"Viewer File","description":"One file, by its content hash: what the ledger knows of it, which captures it is believed\nin, its viewable derivations (qa's proxy, the renders), and the QA cuts stated on it.","operationId":"viewer_file_api_viewer_files__sha256__get","parameters":[{"name":"sha256","in":"path","required":true,"schema":{"type":"string","title":"Sha256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/viewer/files/{sha256}/play":{"get":{"summary":"Viewer Play","description":"A playable link for one file, minted and RECORDED by the substrate's byte door (`resolve`).\n\n⚠ A REFUSAL IS AN ANSWER, NOT AN ERROR TO ROUTE AROUND: it comes back verbatim with its\ncontract class, and the page says it. This service has no other way to the bytes.","operationId":"viewer_play_api_viewer_files__sha256__play_get","parameters":[{"name":"sha256","in":"path","required":true,"schema":{"type":"string","title":"Sha256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/preflight":{"get":{"summary":"Preflight","description":"Whether the columns this service reads exist in the live schema.\n\nIts own endpoint because the answer is the one thing that makes every other number\ntrustworthy, and because the deployments app's ORM model is known to disagree with\nproduction in both directions.","operationId":"preflight_api_preflight_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Api Health","operationId":"api_health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}