SDPB APIsdpb.org ↗
Access South Dakota Public Broadcasting's daily Open Government schedule: legislative sessions, committee hearings, boards, and court feeds with live-stream status.
What is the SDPB API?
The SDPB Open Government API exposes one endpoint, get_schedule, that returns every government coverage event SDPB has scheduled for a given calendar day across all capitol rooms, chambers, board rooms, and court feeds. Each response includes up to 9 structured fields per event — including event_id, title, start_time_utc, and status — covering legislative floor sessions, committee hearings, boards and commissions, and court arguments broadcast by South Dakota Public Broadcasting.
curl -X GET 'https://api.parse.bot/scraper/748a8f05-3b06-4bf3-b4e9-9a2300b415c5/get_schedule?date=20261021' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace sdpb-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: SDPB Open Government Schedule — browse today's coverage events."""
from parse_apis.sdpb_org_api import Sdpb, InputFormatInvalid
client = Sdpb()
# List today's scheduled coverage events (limit caps total items fetched).
for event in client.events.list(limit=10):
print(event.title, "|", event.status, "|", event.start_time_utc)
print(" Location:", event.location.name)
if event.stream_url is not None:
print(" Stream:", event.stream_url)
# Fetch a specific date and drill into the first event.
event = client.events.list(date="20260210", limit=1).first()
if event is not None:
print(event.event_id, event.title)
print("Institution:", event.institution, "| Duration:", event.duration_minutes, "min")
# Demonstrate handling a malformed date.
try:
client.events.list(date="2026-02-10", limit=1).first()
except InputFormatInvalid:
print("Rejected: date must be YYYYMMDD with no dashes.")
print("exercised: events.list")
Returns the SDPB Open Government coverage events for one calendar day (America/Chicago), one row per scheduled stream across all of SDPB's capitol rooms, chambers, board rooms and court feeds. Sports and general SDPB programming are excluded, as are the station's internal test events. Each item carries a stable event_id, title, local date (YYYY-MM-DD), start_time_utc (ISO 8601 with Z), status (scheduled, live, or completed relative to the moment of the call), institution (house, senate, joint, committee, or legislature; boards, commissions and court feeds are reported as committee), the SDPB page url, location.name (the room or feed name), description when the site provides one, and duration_minutes computed from the published start and end. stream_url is the HLS .m3u8 of the room's live channel and is present only for scheduled and live items; completed items carry no media because the site does not publish per-event archives on this feed, so player_url and video_file are always null. date omitted means today in America/Chicago. Results are sorted by start time and paged with offset (first page 0) and limit (1-200, larger values are clamped to 200); total is the number of items on this page, total_available the count for the whole day, and has_more tells whether offset + limit reaches more rows. A day with no coverage returns items: [] with total 0. Each call reads about thirty upstream calendar feeds, so expect roughly 2-5 seconds per request.
| Param | Type | Description |
|---|---|---|
| date | string | Calendar day to list, YYYYMMDD (e.g. 20260210). Omitted = today in America/Chicago. Malformed values are rejected. |
| limit | integer | Maximum number of items per page; values above 200 are clamped to 200. |
| offset | integer | Zero-based index of the first item to return within the day's sorted list. |
{
"type": "object",
"fields": {
"date": "requested day as YYYYMMDD",
"items": "array of event objects: event_id, title, date (YYYY-MM-DD), start_time_utc (ISO 8601 Z), status (scheduled|live|completed), institution (house|senate|joint|committee|legislature), url, player_url (always null), stream_url (HLS .m3u8 for scheduled/live items, null when completed), video_file (always null), location {name}, description (string or null), duration_minutes (integer)",
"limit": "integer page size applied (after clamping)",
"total": "integer count of items on this page",
"offset": "integer offset applied",
"has_more": "boolean, true when offset + limit < total_available",
"total_available": "integer count of items for the whole day"
},
"sample": {
"data": {
"date": "20261021",
"items": [
{
"url": "https://www.sdpb.org/open-gov/bhb",
"date": "2026-10-21",
"title": "Railroad Board & Authority Meeting | 2026-10-21",
"status": "scheduled",
"event_id": "570114aCDc-556",
"location": {
"name": "DOT - Becker-Hansen Building – Commission Room"
},
"player_url": null,
"stream_url": "https://watch.sardius.media/channels/69A28AFcE4D9711/site_570114aCDc/live.m3u8",
"video_file": null,
"description": null,
"institution": "committee",
"start_time_utc": "2026-10-21T16:00:00Z",
"duration_minutes": 150
}
],
"limit": 50,
"total": 1,
"offset": 0,
"has_more": false,
"total_available": 1
},
"status": "success"
}
}About the SDPB API
What the API Returns
The single get_schedule endpoint returns an array of government coverage events for one calendar day in the America/Chicago timezone. Each event object in the items array carries an event_id, human-readable title, date (YYYY-MM-DD), start_time_utc (ISO 8601 with UTC offset), and a status field that reflects one of three states: scheduled, live, or completed. This lets you filter for in-progress streams or build ahead-of-time schedules. Sports programming and general SDPB broadcasts are excluded from results.
Filtering and Pagination
Pass a date parameter in YYYYMMDD format to retrieve any specific day's schedule; omitting it returns today's events. Malformed date strings are rejected with an error rather than silently defaulted. Results are paginated via limit (capped at 200) and offset (zero-based). The response includes total_available (full day count), total (items on the current page), and has_more (boolean) so you can walk through large days of hearings without missing events.
Coverage Scope
Coverage spans SDPB's Open Government feeds: South Dakota legislative floor sessions, standing committee hearings, state boards and commissions, and court arguments. The API does not include general SDPB radio or television programming schedules, and internal test events are also excluded. All times are normalized to UTC in the response regardless of the America/Chicago local time of the event.
The SDPB API is a managed, monitored endpoint for sdpb.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sdpb.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official sdpb.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Display today's live and upcoming South Dakota legislative hearings in a civic-tech dashboard using
statusandstart_time_utc. - Send alerts when a specific committee hearing transitions to
livestatus by pollingget_scheduleand checking thestatusfield. - Build a weekly calendar of South Dakota government sessions by iterating
dateparameters across seven days. - Archive historical government event metadata by storing
event_id,title, anddatefields from completed sessions. - Filter for court argument streams specifically by parsing
titlevalues returned in theitemsarray. - Power a public-record notification service that surfaces newly scheduled board and commission events each morning.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does SDPB have an official developer API for its Open Government schedule?+
What does the `status` field in each event object represent?+
status is one of three string values: scheduled (the event has not yet started), live (the stream is currently active), or completed (the event has ended). You can filter the items array on this field to isolate active streams.Does the API return HLS stream URLs or other playback details alongside each event?+
title, start_time_utc, and status. This allows direct integration with HLS-compatible video players.Can I retrieve schedules for multiple days in a single request?+
get_schedule returns events for exactly one calendar day per request, selected via the date parameter. To cover multiple days, make one request per day. You can fork this API on Parse and revise it to add a date-range endpoint if your use case requires bulk retrieval.