Discover/NY Senate API
live

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.

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

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.

This call costs2 credits / call— charged only on success
Try it
Calendar day in YYYYMMDD form (New York local date). Omitted = today in New York.
Maximum entries to return in this call; values above 50 are clamped to 50.
Zero-based index of the first entry to return within the day's list. Pass offset + limit of the previous response to continue.
→ api.parse.bot/scraper/2012c33d-90ba-4f02-8e2f-c3c9b012a594/<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/2012c33d-90ba-4f02-8e2f-c3c9b012a594/get_schedule?date=20260310' \
  -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 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")
All endpoints · 1 totalmissing one? ·

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.

Input
ParamTypeDescription
datestringCalendar day in YYYYMMDD form (New York local date). Omitted = today in New York.
limitintegerMaximum entries to return in this call; values above 50 are clamped to 50.
offsetintegerZero-based index of the first entry to return within the day's list. Pass offset + limit of the previous response to continue.
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
3h 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
  • Build a legislative day-at-a-glance dashboard that surfaces all live and scheduled Senate events for the current date.
  • Alert subscribers when a specific committee meeting appears in the items array for an upcoming date.
  • Archive Senate floor sessions by storing daily get_schedule responses keyed by date and event_id.
  • Track how often public hearings are scheduled by filtering title fields 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 status equals live during legislative days.
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 the New York State Senate have an official developer API?+
Yes. The NY Senate publishes an open-data API at https://legislation.nysenate.gov/static/docs/html/index.html covering legislation, bills, and member data. That API does not expose the calendar/events surface this endpoint covers.
What does the `status` field distinguish between entries?+
Each calendar entry carries one of three values: 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?+
No. 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?+
Not currently. The API covers scheduling metadata — titles, times, statuses, and event IDs — but does not return bill numbers, vote records, or legislative text tied to a session. You can fork it on Parse and revise to add an endpoint that cross-references bill data from the Senate's public legislation API.
How far back or forward does the calendar data go?+
The API reflects what the Senate's public calendar publishes for any requested date. Historical dates are available as long as the source calendar retains them; future dates show pre-announced events. The total_available field tells you the total entry count for the day before you paginate.
Page content last updated . Spec covers 1 endpoint from nysenate.gov.
Related APIs in Government PublicSee all →