BayCounty.me API
Connect your own app, spreadsheet, newsroom tool or AI assistant to the public records on this site. Free, read-only, and no key needed.
Quick start
Every dataset on the Open data page is also available as an API. Responses are JSON (or CSV with format=csv), and every row carries a link to its source record. Rows are served live from the BayCounty.me database, so newly added records show up within about five minutes; each response says where its rows came from in meta.data_source.
curl 'https://baycounty.me/api/v1/datasets/contracts?government=Bay%20County%20BOCC&amount_min=1000000&sort=-amount&limit=5'
curl 'https://baycounty.me/api/v1/datasets/votes?board=Lynn%20Haven%20City%20Commission&split=true&date_from=2025-01-01'
curl 'https://baycounty.me/api/v1/datasets/salary-positions?category=law_enforcement&fields=employer,title,pay_min,pay_max&format=csv'
Base URL: https://baycounty.me/api/v1 · Machine-readable description: OpenAPI 3.1 (import it into Postman, a GPT action, or any OpenAPI tool).
Endpoints
| Request | Returns |
|---|---|
GET /api/v1 | Index: every dataset with row counts and links |
GET /api/v1/datasets | Catalog with every column, its type and, for short lists, its allowed values |
GET /api/v1/datasets/{id} | Rows: {data: [...], meta: {total, limit, offset, next}} |
GET /api/v1/datasets/{id}/schema | Columns and types for one dataset |
GET /api/v1/governments | A profile of each local government: budget, tax rate, debt, audits, votes, staff |
GET /api/v1/governments/{slug} | One profile, e.g. lynn-haven |
GET /api/v1/status | Rows in each dataset, when the database last loaded it, and any load errors |
GET /api/v1/changes?since= | Records added since a date or time, e.g. new contracts since Oct. 1. Add dataset= to pick datasets |
GET /api/v1/meetings.ics?gov= | Calendar feed of upcoming meetings for one government, e.g. Lynn Haven. Keys: county, schools, pc, pcb, lh, cw, sp, parker, mb; a board such as lh-cra works too, and commas combine them. Paste the link into Google Calendar, Outlook or Apple Calendar ("subscribe by URL"). Every board at once: /meetings.ics |
GET /api/v1/search?q= | Search every page on the site, e.g. martin theatre |
GET /downloads/{id}.json | The whole dataset as one file, for bulk use |
Filtering, sorting and paging
- Match a column:
?government=City%20of%20Callaway(spaces as%20; the catalog lists each column's allowed values). Matching ignores capitals. Separate several values with commas to match any of them:?outcome=failed,tabled. - Ranges: add
_minor_maxto a number column (amount_min=500000) and_fromor_toto a date (date_from=2025-10-01). - Text:
_containson a column (vendor_contains=roberts), orq=to search every column. - Not equal:
_neleaves out values (outcome_ne=passed; commas for several). - Empty or not:
_null=truefinds rows where a column is blank,_null=falserows where it has a value (amount_null=false). Blank values never match_min,_max,_fromor_to. - Totals:
group_by=government&sum=amountreturns one row per group withcount,sum_amountandn_amount(how many numbers were added), largest group first. Filters apply first, and it works withformat=csv. Example: contract dollars by government. - Sort:
sort=-amount,date(a minus sign sorts high to low). - Columns:
fields=vendor,amount,source_url. - Paging:
limit(up to 1,000, default 100) andoffset. The response'smeta.nextis the link to the next page. - Caching: responses carry an
ETag(andLast-Modifiedwhere the data's date is known). Send it back asIf-None-Match(orIf-Modified-Since) and you get304 Not Modifiedwith no body when nothing changed.
Datasets
Updated 2026-10-23| Dataset id | Rows | Links |
|---|---|---|
government-profilesGovernment profiles | 9 | Try it · Columns · CSV |
votesRecorded votes | 606 | Try it · Columns · CSV |
member-votesVotes by member | 3,023 | Try it · Columns · CSV |
contractsContracts | 339 | Try it · Columns · CSV |
change-ordersChange orders | 51 | Try it · Columns · CSV |
emergency-purchasesEmergency purchases | 12 | Try it · Columns · CSV |
cra-paymentsCRA spending | 168 | Try it · Columns · CSV |
property-tax-ratesProperty tax rates | 90 | Try it · Columns · CSV |
debtDebt by government | 13 | Try it · Columns · CSV |
audit-findingsAudit findings | 106 | Try it · Columns · CSV |
fema-michael-projectsHurricane Michael FEMA projects | 765 | Try it · Columns · CSV |
sales-tax-projectsHalf-cent sales tax projects | 1,062 | Try it · Columns · CSV |
bed-tax-collectionsTourist tax collections | 33 | Try it · Columns · CSV |
fees-assessmentsFees on tax bills | 18 | Try it · Columns · CSV |
officials-payOfficials and pay | 33 | Try it · Columns · CSV |
meetingsUpcoming meetings | 50 | Try it · Columns · CSV |
campaign-financeCampaign finance totals | 48 | Try it · Columns · CSV |
vendor-paymentsWho gets paid | 446 | Try it · Columns · CSV |
bondsBonds and notes | 61 | Try it · Columns · CSV |
budget-per-residentBudget cost per resident, by service | 64 | Try it · Columns · CSV |
budget-detailBudgets by fund and department | 216 | Try it · Columns · CSV |
salary-positionsPublic salaries by job title | 1,455 | Try it · Columns · CSV |
salary-leadersSalaries of officials and leaders | 94 | Try it · Columns · CSV |
candidates-20262026 local candidates | 36 | Try it · Columns · CSV |
campaign-contributions-20262026 contributions from organizations | 154 | Try it · Columns · CSV |
property-tax-exemptionsProperty tax exemptions (2026 roll) | 25 | Try it · Columns · CSV |
API keys and limits
You don't need a key. Without one, each connection can make a set number of requests a minute and per day (each response's headers show how many are left). If you need more, or want your use tracked separately, ask for a key.
Send a key in any of these ways (the header is best, so the key stays out of logs and browser history):
curl -H 'Authorization: Bearer bcm_your_key' 'https://baycounty.me/api/v1/datasets/votes?limit=5'
Authorization: Bearer <key>orX-API-Key: <key>header, or?api_key=<key>on the URL. The MCP server takes the same header.- Every response carries
X-RateLimit-LimitandX-RateLimit-Remaining(per minute), plusX-RateLimit-Limit-DayandX-RateLimit-Remaining-Daywhen a daily limit applies. Daily limits reset at midnight Central time. - Over a limit, you get status
429with aRetry-Afterheader in seconds. A wrong key gets401; a paused, revoked or expired key gets403.
Connect an AI assistant (MCP)
BayCounty.me runs a Model Context Protocol server, so AI assistants that support remote MCP servers can look up these records directly and cite them. There's no sign-in.
https://baycounty.me/api/mcp
- Claude: add a custom connector and paste the address above.
- Other assistants and tools: add it as a remote MCP server using the "Streamable HTTP" transport.
- Tools it offers:
list_datasets,query_dataset,get_government,search_site,upcoming_meetings(by government, days ahead or a keyword such as a street name),member_voting_record(one board member's votes, including when they were in the minority) andvendor_profile(one company's contracts, change orders, payments, CRA payments and business campaign contributions; a match doesn't show why anything happened). - Resources: each dataset is also an MCP resource at
baycounty://datasets/<id>(up to 2,000 rows; the full file is linked). - Example question: "Which Bay County contracts over $5 million went to campaign donors, and how did commissioners vote?"
Use and limits
- The data is compiled from public records and free to reuse. Please credit BayCounty.me and link to the source record for any figure you publish.
- Check the original record before relying on a single number. Each dataset's notes and gaps are on its page on this site.
- Individual campaign donors and rank-and-file public employees are not named, here or anywhere on the site.
- Each API and MCP request is logged with its time, query, key (if any) and IP address, to enforce limits and stop abuse. IP addresses are deleted from the log after 90 days.
- Requests are limited per connection or per key (see API keys). For bulk use, download the full files from
/downloads. Data refreshes as the site updates, and meetings and campaign reports refresh every morning. - Questions or a use you'd like supported? Get in touch.