BoardDocs School Board Agendas Scraper by District
Pricing
from $5.00 / 1,000 results
BoardDocs School Board Agendas Scraper by District
Pulls school board agenda items from BoardDocs portals, with filters for district, committee, date range and keywords, optional item text and attachment links, charged per result.
What does BoardDocs School Board Agendas Scraper do?
It reads the public agendas of school boards and other public bodies that publish on BoardDocs, and returns one clean record per agenda item: district, meeting date, committee, agenda category, item number, title, action type (Action, Information, Consent and so on), and links back to the item and the meeting. Optionally it adds the item description text and the links to public attachments such as contracts and resolutions. Filters for district, committee, date window and keywords keep runs small, and pricing is per result.
Data source
The public BoardDocs portal of each district (go.boarddocs.com/<state>/<district>/Board.nsf/Public), read through the same anonymous endpoints the portal itself calls, so results are as fresh as the district's published agenda.
Why use it?
- Sales and lead generation for vendors that sell to schools: spot contracts, RFP style items, budget lines and technology purchases as they reach the agenda.
- Monitoring: watch a list of districts for keywords such as "curriculum", "bond", "transportation" or a competitor name, and send hits to Slack or a sheet.
- Research and journalism: build a searchable history of what boards voted on, with direct links to the source and the attachments.
- It replaces opening each district portal by hand and copying items out of meeting pages.
How to use it
- Open the Actor and enter one or more districts, for example
ca/sandi. - Click Start. Download results as JSON, CSV or Excel, or read them through the API.
- Add a Schedule and an Integration (Slack, Google Sheets, webhook) to get new records automatically.
To find a district, open its BoardDocs page. The address looks like https://go.boarddocs.com/ca/sandi/Board.nsf/Public, and the district value is the ca/sandi part. You can also paste the full address.
Input
| Field | Description |
|---|---|
districts | BoardDocs portals to read, as state/slug or a full URL. |
committees | Only read committees whose name contains one of these words. Empty means the main governing board (the first committee listed). Use * for every committee. |
dateFrom / dateTo | Meeting date window, YYYY-MM-DD. Empty means no bound. |
keywords | Keep only items whose category, title or text contains any of these words. |
maxMeetingsPerCommittee | Newest meetings to read per committee inside the date window. Default 2. |
includeItemDetails | Adds item text and attachment links. Slower, because it needs extra requests per item. |
maxResults | Hard stop for the run. You are billed per result, so this caps the cost. |
proxyConfiguration | Apify proxy is recommended for larger runs. |
Example input:
{"districts": ["ca/sandi", "tx/hisd"],"keywords": ["contract", "bond"],"dateFrom": "2024-01-01","maxMeetingsPerCommittee": 10,"includeItemDetails": true,"maxResults": 200}
Output
Every record has the same shape:
{"id": "ca/sandi:DA6MAR5A560C","district": "ca/sandi","meetingDate": "2024-11-12","committee": "Main Governing Board","meetingName": "Regular Meeting, 5:00 p.m.","category": "Report of Closed Session Actions, Administrative Assignments and Superintendent's Information Report","itemNumber": "2","title": "Administrative Assignments","actionType": "Information","hasAttachment": true,"itemUrl": "https://go.boarddocs.com/ca/sandi/Board.nsf/goto?open&id=D3GUWY7A915B","meetingUrl": "https://go.boarddocs.com/ca/sandi/Board.nsf/goto?open&id=D3GUWA7A9133","meetingDescription": "Eugene Brucker Education Center Auditorium, 4100 Normal Street, San Diego, CA 92103 ...","bodyText": null,"attachments": null,"scrapedAt": "2026-10-18T08:55:20.537Z"}
With includeItemDetails on, bodyText holds the item description and attachments is a list of { name, url } for the public files.
| Field | Meaning |
|---|---|
id | Stable key (state/slug:itemId), safe for deduplication between runs |
meetingDate | Meeting date, ISO YYYY-MM-DD |
committee | Board or committee the meeting belongs to |
category | Agenda section the item sits in |
itemNumber | Position of the item inside its section |
actionType | Action, Information, Consent, Discussion and similar labels set by the district |
itemUrl, meetingUrl | Links to the item and the meeting on BoardDocs |
meetingDescription | Location and notes the district put on the meeting, trimmed to 500 characters |
bodyText, attachments | Only filled when includeItemDetails is on |
Pricing
Pay per event: a small fee when a run starts, then a fixed price per result returned. You only pay for records that pass your filters. Set maxResults to cap any run.
Limitations
- Only public agendas are read. Items and files marked private by the district are not visible without a login and are not returned.
- The Actor reads agendas, not minutes documents or policy manuals. Minutes appear only when a district attaches them to an agenda item.
- There is no district directory: you supply the
state/slugvalues. Some districts disable the public portal, and those return no records. - Very large attachment lists make
includeItemDetailsruns slower.
FAQ
Is this legal? The Actor reads agendas the sites publish for any visitor without a login and stores only business information published for that purpose. You are responsible for how you use the data.
Something is missing or broken? Open an issue in the Issues tab; response time is usually under a day.