Discover/SDPB API
live

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.

Endpoint health
verified 2h ago
get_schedule
1/1 passing latest checkself-healing
Endpoints
1
Updated
2h ago

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.

This call costs10 credits / call— charged only on success
Try it
Calendar day to list, YYYYMMDD (e.g. 20260210). Omitted = today in America/Chicago. Malformed values are rejected.
Maximum number of items per page; values above 200 are clamped to 200.
Zero-based index of the first item to return within the day's sorted list.
→ api.parse.bot/scraper/748a8f05-3b06-4bf3-b4e9-9a2300b415c5/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/748a8f05-3b06-4bf3-b4e9-9a2300b415c5/get_schedule?date=20261021' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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")
All endpoints · 1 totalmissing one? ·

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.

Input
ParamTypeDescription
datestringCalendar day to list, YYYYMMDD (e.g. 20260210). Omitted = today in America/Chicago. Malformed values are rejected.
limitintegerMaximum number of items per page; values above 200 are clamped to 200.
offsetintegerZero-based index of the first item to return within the day's sorted list.
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
2h ago
Latest check
1/1 endpoint passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Display today's live and upcoming South Dakota legislative hearings in a civic-tech dashboard using status and start_time_utc.
  • Send alerts when a specific committee hearing transitions to live status by polling get_schedule and checking the status field.
  • Build a weekly calendar of South Dakota government sessions by iterating date parameters across seven days.
  • Archive historical government event metadata by storing event_id, title, and date fields from completed sessions.
  • Filter for court argument streams specifically by parsing title values returned in the items array.
  • Power a public-record notification service that surfaces newly scheduled board and commission events each morning.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does SDPB have an official developer API for its Open Government schedule?+
SDPB does not publish a documented public developer API for its Open Government schedule. The Parse API provides structured, machine-readable access to that schedule data.
What does the `status` field in each event object represent?+
Each event's 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?+
Yes. Event objects include HLS live-stream references alongside the scheduling metadata such as 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?+
No. 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.
Are past or archived video recordings accessible through the API?+
Not currently. The API covers event scheduling metadata and live-stream references for a given day; it does not expose links to archived recordings of completed sessions. You can fork this API on Parse and revise it to add an endpoint targeting SDPB's archived video catalog.
Page content last updated . Spec covers 1 endpoint from sdpb.org.
Related APIs in Government PublicSee all →