{"openapi":"3.1.0","info":{"title":"Legislative Tracker API","version":"v1","description":"Public read-only API for bills, lawmakers, and session coverage. Anonymous requests are rate-limited by IP; authenticated requests use an X-API-Key header."},"servers":[{"url":"/api/v1"}],"security":[{},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Create keys from your /developers console."}},"schemas":{"Bill":{"type":"object","properties":{"state":{"type":"string","example":"VA"},"session_id":{"type":"string"},"bill_id":{"type":"string"},"bill_number":{"type":"string","example":"HB1234"},"bill_type":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"status_date":{"type":"string","format":"date"},"last_action":{"type":"string"},"last_action_date":{"type":"string","format":"date"},"chamber":{"type":"string"},"current_chamber":{"type":"string"},"committee":{"type":"string"},"sponsor":{"type":"object","properties":{"name":{"type":"string"},"party":{"type":"string"},"district":{"type":"string"}}},"subjects":{"type":"array","items":{"type":"string"}},"url":{"type":"string","format":"uri"}}},"Lawmaker":{"type":"object","properties":{"state":{"type":"string"},"people_id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"chamber":{"type":"string"},"party":{"type":"string"},"district":{"type":"string"},"ballotpedia":{"type":"string"},"votes":{"type":"number"},"committee":{"type":"string"}}},"StateCoverage":{"type":"object","properties":{"state":{"type":"string"},"session":{"type":"string"},"session_id":{"type":"number"},"session_name":{"type":"string"},"bill_count":{"type":"number"},"people_count":{"type":"number"},"vote_count":{"type":"number"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}},"Meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}},"Pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}},"paths":{"/bills":{"get":{"summary":"List bills across states","parameters":[{"name":"state","in":"query","schema":{"type":"string"},"description":"2-letter state code"},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"chamber","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Substring match on number/title/sponsor"},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Bill list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Bill"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bills/search":{"get":{"summary":"Full-text bill search (Postgres FTS, ranked + faceted)","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query (websearch syntax: phrases, -exclude, OR)"},{"name":"state","in":"query","schema":{"type":"string"}},{"name":"chamber","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"subject","in":"query","schema":{"type":"string"}},{"name":"committee","in":"query","schema":{"type":"string"},"description":"ILIKE match on committee name"},{"name":"sponsor","in":"query","schema":{"type":"string"},"description":"Exact match against denormalized sponsor names"},{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Ranked results + facets","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"facets":{"type":"object"},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"type":"object"}}}}}}}}},"/bills/{state}/{number}":{"get":{"summary":"Get a single bill by state + number","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string"}},{"name":"number","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bill detail"},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/lawmakers":{"get":{"summary":"List lawmakers across states","parameters":[{"name":"state","in":"query","schema":{"type":"string"}},{"name":"party","in":"query","schema":{"type":"string"}},{"name":"chamber","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":200,"maximum":1000}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Lawmaker list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Lawmaker"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}},"/states":{"get":{"summary":"List state session coverage","responses":{"200":{"description":"Coverage list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/StateCoverage"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}}}}