{"openapi":"3.1.0","info":{"title":"Icom CI-V Explorer","description":"Read-only HTTPS REST API for the Icom CI-V protocol. Search CI-V commands by functionality or command code, filter by radio, and view top-level radio info (default transceiver IDs, capabilities). Feedback/corrections can be submitted for review.","version":"0.1.0"},"paths":{"/radios":{"get":{"tags":["radios"],"summary":"List Radios","description":"List all supported radios with default CI-V addresses and command counts.","operationId":"list_radios_radios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RadioSummary"},"type":"array","title":"Response List Radios Radios Get"}}}}}}},"/radios/{radio_id}":{"get":{"tags":["radios"],"summary":"Get Radio","operationId":"get_radio_radios__radio_id__get","parameters":[{"name":"radio_id","in":"path","required":true,"schema":{"type":"string","title":"Radio Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadioSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/radios/{radio_id}/capabilities":{"get":{"tags":["radios"],"summary":"Get Radio Capabilities","operationId":"get_radio_capabilities_radios__radio_id__capabilities_get","parameters":[{"name":"radio_id","in":"path","required":true,"schema":{"type":"string","title":"Radio Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Capability"},"title":"Response Get Radio Capabilities Radios  Radio Id  Capabilities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/commands":{"get":{"tags":["commands"],"summary":"List Commands","description":"List or search CI-V commands, optionally filtered by radio.\n\nThe query ``q`` matches any of: command code, sub-command code, data\npayload description, or the human-readable description.","operationId":"list_commands_commands_get","parameters":[{"name":"radio_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a single radio id","title":"Radio Id"},"description":"Filter to a single radio id"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search across cmd/sub_cmd/data/description","title":"Q"},"description":"Search across cmd/sub_cmd/data/description"},{"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"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/radios/{radio_id}/commands":{"get":{"tags":["commands"],"summary":"List Radio Commands","description":"List commands for a specific radio, with optional search.","operationId":"list_radio_commands_radios__radio_id__commands_get","parameters":[{"name":"radio_id","in":"path","required":true,"schema":{"type":"string","title":"Radio Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search within this radio's commands","title":"Q"},"description":"Search within this radio's commands"},{"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"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feedback":{"get":{"tags":["feedback"],"summary":"Download Feedback","description":"Download all submitted feedback as a JSONL file.\n\nReturns the accumulated feedback log (one JSON object per line) so it can\nbe reviewed offline. If no feedback has been submitted yet, an empty file\n(200) is returned rather than a 404 — an empty log is a valid state.","operationId":"download_feedback_feedback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Submit a correction or comment on a command entry.\n\nThe API is read-only; this is the single write path. Submissions are\nappended to a JSONL file for later review and never mutate the reference\ndata. The radio must exist; the command need not (it may be a missing\nentry being reported).","operationId":"submit_feedback_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackSubmission"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAck"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"Capability":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"command_evidence":{"type":"string","title":"Command Evidence"},"radios":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object","title":"Radios"}},"type":"object","required":["name","description","command_evidence","radios"],"title":"Capability","description":"A single radio capability with per-radio support values."},"Command":{"properties":{"radio_id":{"type":"string","title":"Radio Id"},"cmd":{"type":"string","title":"Cmd","description":"Primary command hex (e.g. '05')"},"sub_cmd":{"type":"string","title":"Sub Cmd","description":"Sub-command hex (e.g. '00'); empty if none","default":""},"data":{"type":"string","title":"Data","description":"Data payload description from the manual","default":""},"description":{"type":"string","title":"Description","description":"Human-readable command description","default":""}},"type":"object","required":["radio_id","cmd"],"title":"Command","description":"A single CI-V command row parsed from a radio's command table CSV."},"CommandListResponse":{"properties":{"radio_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Radio Id"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"items":{"items":{"$ref":"#/components/schemas/Command"},"type":"array","title":"Items"}},"type":"object","required":["total","limit","offset","items"],"title":"CommandListResponse","description":"Paginated command listing."},"FeedbackAck":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status","description":"One of: 'received'"},"received_at":{"type":"string","title":"Received At"}},"type":"object","required":["id","status","received_at"],"title":"FeedbackAck"},"FeedbackSubmission":{"properties":{"radio_id":{"type":"string","maxLength":16,"title":"Radio Id","description":"Radio id the feedback concerns"},"cmd":{"type":"string","maxLength":8,"pattern":"^$|^[0-9A-Fa-f]{1,4}$","title":"Cmd","description":"Primary command hex; empty or 1-4 hex chars (blank for capability feedback)","default":""},"sub_cmd":{"type":"string","maxLength":8,"pattern":"^$|^[0-9A-Fa-f]{1,4}$","title":"Sub Cmd","description":"Sub-command hex; empty or 1-4 hex chars","default":""},"field":{"type":"string","enum":["cmd","sub_cmd","data","description","capability"],"title":"Field","description":"Which field is wrong"},"capability_name":{"type":"string","maxLength":64,"title":"Capability Name","description":"Name of the capability being corrected (when field is 'capability')","default":""},"suggested_value":{"type":"string","maxLength":500,"title":"Suggested Value","description":"Corrected value for the field"},"notes":{"type":"string","maxLength":2000,"title":"Notes","description":"Free-text explanation or evidence","default":""},"submitter":{"type":"string","maxLength":100,"title":"Submitter","description":"Optional submitter handle/email","default":""}},"type":"object","required":["radio_id","field","suggested_value"],"title":"FeedbackSubmission","description":"User-submitted correction or comment on a command entry.\n\nThe API is read-only; this is the one write path. Submissions are stored\nlocally (JSONL) for later review and do not mutate the reference data.\n\nAll free-text fields are length-capped to prevent abuse and to keep the\nJSONL append log manageable. Cmd/sub_cmd are constrained to short hex\nstrings so no markup or script can be submitted through them. The\n``field`` value is an enum so attackers cannot invent field names."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"RadioSummary":{"properties":{"id":{"type":"string","title":"Id","description":"Short radio id, e.g. '7300'"},"name":{"type":"string","title":"Name","description":"Model name, e.g. 'IC-7300'"},"address":{"type":"string","title":"Address","description":"Default CI-V transceiver address (hex, no 0x)"},"command_count":{"type":"integer","title":"Command Count","description":"Number of CI-V command rows loaded for this radio"}},"type":"object","required":["id","name","address","command_count"],"title":"RadioSummary","description":"Top-level radio descriptor (used in list and detail responses)."},"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"}}}}