NY Senate APInysenate.gov ↗
Fetch New York State Senate floor sessions, committee meetings, public hearings, and senator events by date via the nysenate.gov Calendar API.
What is the NY Senate API?
The nysenate.gov Calendar API exposes one endpoint, get_schedule, that returns the full daily agenda of New York State Senate activity — floor sessions, committee meetings, public hearings, and senator-hosted events — for any given date. Each response includes up to 7 structured fields per calendar entry, including event_id, start_time_utc, status, and title, with built-in pagination so you can page through busy legislative days without over-fetching.
curl -X GET 'https://api.parse.bot/scraper/2012c33d-90ba-4f02-8e2f-c3c9b012a594/get_schedule?date=20260310' \ -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 nysenate-gov-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: NY Senate Schedule API — browse the daily calendar."""
from parse_apis.nysenate_gov_api import NYSenate, InvalidDateFormat
client = NYSenate()
# List today's senate calendar events (limit= caps total items fetched).
for event in client.events.list(limit=5):
print(event.title, event.start_time_utc, event.location.name)
# Fetch events for a specific date and drill into the first one.
event = client.events.list(date="20260310", limit=1).first()
if event is not None:
print(event.title, event.status)
print("Location:", event.location.name)
print("URL:", event.url)
if event.duration_minutes is not None:
print("Duration:", event.duration_minutes, "min")
# Handle an invalid date gracefully.
try:
client.events.list(date="not-a-date", limit=1).first()
except InvalidDateFormat as e:
print("Bad date format:", e.message)
print("exercised: events.list / InvalidDateFormat")
Returns the New York State Senate calendar entries for one calendar day (America/New_York): floor sessions, committee meetings, public hearings and senator-hosted events, in the site's chronological order. One row per calendar entry. date omitted means today in New York; data.date echoes the requested day in YYYYMMDD form. The whole day is read upstream (10 entries per upstream page, at most 10 pages) and then sliced locally by offset/limit, so total_available is the day's full accessible count, total is the rows in this slice, and has_more is true when offset + limit < total_available (or when the 100-entry read cap was hit). The first page is offset 0 or omitted; the next page is offset + limit. limit is clamped to 50. Each item carries event_id (the site's stable path identifier for the entry, e.g. one shape is calendar/sessions/<month-day-year>/session-<mm-dd-yyyy>), start_time_utc as an ISO-8601 UTC timestamp, status derived from the site's video badge (completed when an archived video is posted, live when a live badge is shown, otherwise scheduled), institution always senate, url for the entry page, player_url set to the entry page only when a video badge is present, location.name joining venue and room text. stream_url, video_file and description are not present on the day listing and are always null; duration_minutes is computed from the listed end time and is null when no end time is listed. A day with no entries returns an empty items array (valid). A date that is not a valid YYYYMMDD day returns a stale_input error.
| Param | Type | Description |
|---|---|---|
| date | string | Calendar day in YYYYMMDD form (New York local date). Omitted = today in New York. |
| limit | integer | Maximum entries to return in this call; values above 50 are clamped to 50. |
| offset | integer | Zero-based index of the first entry to return within the day's list. Pass offset + limit of the previous response to continue. |
{
"type": "object",
"fields": {
"date": "requested day echoed in YYYYMMDD form",
"items": "array of calendar entries, each with event_id, title, date (YYYY-MM-DD), start_time_utc, status (scheduled|live|completed), institution, url, player_url, stream_url, video_file, location.name, description, duration_minutes",
"limit": "limit applied after clamping",
"total": "number of items in this slice",
"offset": "offset applied",
"has_more": "true when another slice follows at offset + limit",
"total_available": "number of entries the site lists for the day"
},
"sample": {
"data": {
"date": "20260310",
"items": [
{
"url": "https://www.nysenate.gov/calendar/events/lea-webb/march-10-2026/senator-lea-webb-host-community-office-hours",
"date": "2026-03-10",
"title": "Senator Lea Webb to Host Community Office Hours",
"status": "scheduled",
"event_id": "calendar/events/lea-webb/march-10-2026/senator-lea-webb-host-community-office-hours",
"location": {
"name": "Cortland Community Center, Cortland, New York"
},
"player_url": null,
"stream_url": null,
"video_file": null,
"description": null,
"institution": "senate",
"start_time_utc": "2026-03-10T20:00:00Z",
"duration_minutes": 120
},
{
"url": "https://www.nysenate.gov/calendar/events/rob-rolison/march-10-2026/extended-office-hours-march-2026",
"date": "2026-03-10",
"title": "Extended Office Hours – March 2026",
"status": "scheduled",
"event_id": "calendar/events/rob-rolison/march-10-2026/extended-office-hours-march-2026",
"location": {
"name": "Senator Rolison's District Office, Senator Rolison District Office, Poughkeepsie, New York"
},
"player_url": null,
"stream_url": null,
"video_file": null,
"description": null,
"institution": "senate",
"start_time_utc": "2026-03-10T21:00:02Z",
"duration_minutes": 120
}
],
"limit": 5,
"total": 2,
"offset": 10,
"has_more": false,
"total_available": 12
},
"status": "success"
}
}About the NY Senate API
What the API Returns
The single get_schedule endpoint returns all calendar entries the New York State Senate publishes for a given calendar day in the America/New_York timezone. Each entry in the items array carries an event_id, a human-readable title, a date field in YYYY-MM-DD format, a start_time_utc timestamp, and a status value of scheduled, live, or completed. The status field is useful for distinguishing upcoming events from those currently in progress or already finished.
Date and Pagination Parameters
The date input accepts a string in YYYYMMDD form. Omitting it defaults to today's date in New York local time. For days with many entries, use limit (clamped to a maximum of 50) and offset (zero-based) to page through results. The response echoes back limit, offset, total, and has_more, so your code can detect when another slice is available by checking has_more and advancing by offset + limit.
Coverage Scope
The API reflects what the Senate's public events calendar lists for a given day: floor sessions, committee meetings, public hearings, and senator-hosted events. The total_available field tells you how many entries exist for that day, which is useful for setting pagination loops before making additional calls. All timestamps are normalized to UTC via start_time_utc, removing any ambiguity around daylight saving transitions.
The NY Senate API is a managed, monitored endpoint for nysenate.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when nysenate.gov 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 nysenate.gov 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?+
- Build a legislative day-at-a-glance dashboard that surfaces all
liveandscheduledSenate events for the current date. - Alert subscribers when a specific committee meeting appears in the
itemsarray for an upcoming date. - Archive Senate floor sessions by storing daily
get_scheduleresponses keyed bydateandevent_id. - Track how often public hearings are scheduled by filtering
titlefields for keyword matches across multiple dates. - Power a civic transparency app that shows constituents their senator's event schedule using the senator-hosted event entries.
- Detect in-session activity by polling for entries where
statusequalsliveduring legislative days.
| 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 the New York State Senate have an official developer API?+
What does the `status` field distinguish between entries?+
scheduled (event has not yet started), live (event is currently in progress), or completed (event has ended). This lets you filter the items array without needing to compare timestamps yourself.Can I retrieve entries for more than one day in a single call?+
get_schedule returns entries for exactly one calendar day per call, identified by the date parameter. To cover a date range, make one call per day and aggregate the results. You can fork this API on Parse and revise it to add a range endpoint if you need multi-day responses in a single call.Does the API include bill or vote data associated with floor sessions?+
How far back or forward does the calendar data go?+
total_available field tells you the total entry count for the day before you paginate.