Committees & hearings
Five endpoints: search committees, fetch one, list its members, list its hearings, and sweep hearings across every committee in a state.
All paths are relative to https://delilah-api.jsv21b.workers.dev and require an X-API-Key header (Authentication). Field names in the samples are exactly what the API returns; values written as <type> are placeholders.
List committees
Search committees by jurisdiction, chamber, or name. Results are ordered by state, chamber, then committee name.
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Optional | 2-letter postal code (e.g. FL), DC, or US for Congress. |
chamber | string | Optional | Chamber name match. |
q | string | Optional | Substring match on the committee name. |
limit | integer | Optional | Max rows. Defaults to 100, clamped to 500. |
curl "https://delilah-api.jsv21b.workers.dev/v1/committees?state=FL&chamber=Senate" \ -H "X-API-Key: dk_live_…"
{
"data": [
{
"committee_id": "<int>",
"state_abbr": "<string>",
"chamber": "<string>",
"committee_name": "<string>",
"committee_type": "<string>",
"description": "<string>",
"chair_name": "<string>",
"vice_chair_name": "<string>",
"members_count": "<int>",
"website_url": "<string>",
"meeting_schedule": "<string>"
}
]
}Get one committee
The same record fetched by id, as { data: {…} }. Returns 404 not_found when no committee carries that id.
| Parameter | Type | Required | Description |
|---|---|---|---|
committee_id | integer (path) | Required | The committee identifier. Non-integer values return 400 bad_request. |
curl "https://delilah-api.jsv21b.workers.dev/v1/committees/1234" \ -H "X-API-Key: dk_live_…"
{
"data": {
"committee_id": "<int>",
"state_abbr": "<string>",
"chamber": "<string>",
"committee_name": "<string>",
"committee_type": "<string>",
"description": "<string>",
"chair_name": "<string>",
"vice_chair_name": "<string>",
"members_count": "<int>",
"website_url": "<string>",
"meeting_schedule": "<string>"
}
}Committee members
The committee roster, ordered by role then name. member_role is the seat — chair, vice chair, or member — and each people_id keys into /v1/legislators/{people_id}.
| Parameter | Type | Required | Description |
|---|---|---|---|
committee_id | integer (path) | Required | The committee identifier. Non-integer values return 400 bad_request. |
curl "https://delilah-api.jsv21b.workers.dev/v1/committees/1234/members" \ -H "X-API-Key: dk_live_…"
{
"data": [
{
"committee_id": "<int>",
"people_id": "<int>",
"name": "<string>",
"party_id": "<int>",
"party_name": "<string>",
"member_role": "<string>"
}
]
}Committee hearings
Hearings held by this committee, most recent first, capped at 100 rows. The committee is resolved to its jurisdiction and name first, so an unknown id returns 404 not_found rather than an empty list.
| Parameter | Type | Required | Description |
|---|---|---|---|
committee_id | integer (path) | Required | The committee identifier. Non-integer values return 400 bad_request. |
curl "https://delilah-api.jsv21b.workers.dev/v1/committees/1234/hearings" \ -H "X-API-Key: dk_live_…"
{
"data": [
{
"hearing_id": "<int>",
"state_code": "<string>",
"chamber": "<string>",
"committee_name": "<string>",
"hearing_title": "<string>",
"hearing_description": "<string>",
"hearing_date": "<date>",
"hearing_time": "<string>",
"hearing_datetime": "<timestamp>",
"is_live": "<bool>",
"status": "<string>",
"hearing_location": "<string>",
"room_number": "<string>",
"video_url": "<string>",
"video_source_type": "<string>",
"video_duration_seconds": "<int>",
"audio_url": "<string>",
"transcript_url": "<string>",
"transcript_text": "<string>",
"transcript_format": "<string>",
"has_captions": "<bool>",
"participants": "<json>",
"bills_discussed": "<json>",
"topics": "<json>",
"tags": "<json>",
"source_url": "<string>",
"scrape_date": "<timestamp>",
"last_updated": "<timestamp>",
"view_count": "<int>",
"transcript_extracted_at": "<timestamp>",
"transcript_polished_json": "<json>",
"transcript_polished_at": "<timestamp>"
}
]
}The media fields — video_url, audio_url, transcript_url, transcript_text — are present for the states that publish them and null elsewhere; the same is true of the polished-transcript fields. is_live and statusare what you watch for a “happening now” view, and bills_discussed is the link back to bills.
Hearings across committees
The same hearing rows, swept across every committee rather than one — the endpoint to poll for “what is on the calendar in this state”. Ordered by hearing date, most recent first.
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Optional | 2-letter postal code (e.g. FL), DC, or US for Congress. |
since | string (date-time) | Optional | ISO-8601 date or timestamp. Returns hearings dated on or after it; non-ISO values return 400. |
limit | integer | Optional | Max rows. Defaults to 100, clamped to 500. |
curl "https://delilah-api.jsv21b.workers.dev/v1/hearings?state=FL&since=2026-08-01" \ -H "X-API-Key: dk_live_…"
{
"data": [
{
"hearing_id": "<int>",
"state_code": "<string>",
"chamber": "<string>",
"committee_name": "<string>",
"hearing_title": "<string>",
"hearing_description": "<string>",
"hearing_date": "<date>",
"hearing_time": "<string>",
"hearing_datetime": "<timestamp>",
"is_live": "<bool>",
"status": "<string>",
"hearing_location": "<string>",
"room_number": "<string>",
"video_url": "<string>",
"video_source_type": "<string>",
"video_duration_seconds": "<int>",
"audio_url": "<string>",
"transcript_url": "<string>",
"transcript_text": "<string>",
"transcript_format": "<string>",
"has_captions": "<bool>",
"participants": "<json>",
"bills_discussed": "<json>",
"topics": "<json>",
"tags": "<json>",
"source_url": "<string>",
"scrape_date": "<timestamp>",
"last_updated": "<timestamp>",
"view_count": "<int>",
"transcript_extracted_at": "<timestamp>",
"transcript_polished_json": "<json>",
"transcript_polished_at": "<timestamp>"
}
]
}
