BayCounty.me Español
Learn and reuse · API

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.

Open the API26 datasets

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

RequestReturns
GET /api/v1Index: every dataset with row counts and links
GET /api/v1/datasetsCatalog 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}/schemaColumns and types for one dataset
GET /api/v1/governmentsA 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/statusRows 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}.jsonThe 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 _min or _max to a number column (amount_min=500000) and _from or _to to a date (date_from=2025-10-01).
  • Text: _contains on a column (vendor_contains=roberts), or q= to search every column.
  • Not equal: _ne leaves out values (outcome_ne=passed; commas for several).
  • Empty or not: _null=true finds rows where a column is blank, _null=false rows where it has a value (amount_null=false). Blank values never match _min, _max, _from or _to.
  • Totals: group_by=government&sum=amount returns one row per group with count, sum_amount and n_amount (how many numbers were added), largest group first. Filters apply first, and it works with format=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) and offset. The response's meta.next is the link to the next page.
  • Caching: responses carry an ETag (and Last-Modified where the data's date is known). Send it back as If-None-Match (or If-Modified-Since) and you get 304 Not Modified with no body when nothing changed.

Datasets

Updated 2026-10-23
Dataset idRowsLinks
government-profilesGovernment profiles9 Try it · Columns · CSV
votesRecorded votes606 Try it · Columns · CSV
member-votesVotes by member3,023 Try it · Columns · CSV
contractsContracts339 Try it · Columns · CSV
change-ordersChange orders51 Try it · Columns · CSV
emergency-purchasesEmergency purchases12 Try it · Columns · CSV
cra-paymentsCRA spending168 Try it · Columns · CSV
property-tax-ratesProperty tax rates90 Try it · Columns · CSV
debtDebt by government13 Try it · Columns · CSV
audit-findingsAudit findings106 Try it · Columns · CSV
fema-michael-projectsHurricane Michael FEMA projects765 Try it · Columns · CSV
sales-tax-projectsHalf-cent sales tax projects1,062 Try it · Columns · CSV
bed-tax-collectionsTourist tax collections33 Try it · Columns · CSV
fees-assessmentsFees on tax bills18 Try it · Columns · CSV
officials-payOfficials and pay33 Try it · Columns · CSV
meetingsUpcoming meetings50 Try it · Columns · CSV
campaign-financeCampaign finance totals48 Try it · Columns · CSV
vendor-paymentsWho gets paid446 Try it · Columns · CSV
bondsBonds and notes61 Try it · Columns · CSV
budget-per-residentBudget cost per resident, by service64 Try it · Columns · CSV
budget-detailBudgets by fund and department216 Try it · Columns · CSV
salary-positionsPublic salaries by job title1,455 Try it · Columns · CSV
salary-leadersSalaries of officials and leaders94 Try it · Columns · CSV
candidates-20262026 local candidates36 Try it · Columns · CSV
campaign-contributions-20262026 contributions from organizations154 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> or X-API-Key: <key> header, or ?api_key=<key> on the URL. The MCP server takes the same header.
  • Every response carries X-RateLimit-Limit and X-RateLimit-Remaining (per minute), plus X-RateLimit-Limit-Day and X-RateLimit-Remaining-Day when a daily limit applies. Daily limits reset at midnight Central time.
  • Over a limit, you get status 429 with a Retry-After header in seconds. A wrong key gets 401; a paused, revoked or expired key gets 403.

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) and vendor_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.