API for developers
Read the ESA Vendors data as JSON. The API is free, needs no key and reads only. Base URL: https://esavendors.fyi/api/v1.
The OpenAPI 3.1 description is at /api/v1/openapi.json. Any website may call the API from a browser.
Endpoints
Each endpoint in this table takes GET. Any other method gives 405. A parameter that is not listed gives 400.
| Endpoint | Returns | Parameters |
|---|---|---|
GET /api/v1/listings | Search and list listings |
|
GET /api/v1/listings/{slug} | Read one listing |
|
GET /api/v1/places | List countries, regions and cities with counts | None |
GET /api/v1/categories | List the category tree with counts | None |
GET /api/v1/sources | List the data sources with license and refresh | None |
GET /api/v1/stats | Counts and the last update | None |
Examples
Find education vendors
curl "https://esavendors.fyi/api/v1/listings?category=private-schools&country=US&limit=5"Read the next page
curl "https://esavendors.fyi/api/v1/listings?limit=5&cursor=<page.nextCursor from the last response>"Read one education vendor
slug=$(curl -s "https://esavendors.fyi/api/v1/listings?limit=1" | jq -r '.data[0].slug')
curl "https://esavendors.fyi/api/v1/listings/$slug"List the places and categories you can filter by
curl "https://esavendors.fyi/api/v1/places"
curl "https://esavendors.fyi/api/v1/categories"MCP server
An AI agent can use the same data through MCP at https://esavendors.fyi/mcp. It takes POST only: a GET in a browser gives 405. The server uses Streamable HTTP, keeps no session and needs no key. It reads only. It has the same rate limit, the same public fields and the same credit line as the API. The server card describes it.
search_listings- : Search published education vendors by text, place and category.
get_listing- : Get one published education vendor by its slug.
list_places- : List countries, regions and cities that have education vendors.
list_categories- : List categories with their education vendor counts.
get_stats- : Get the number of published education vendors, places and categories, and when the data last changed.
list_sources- : List where the education vendor data comes from, with the license and refresh of each source.
Add it to Claude Code
claude mcp add --transport http esavendors https://esavendors.fyi/mcpAdd it to a client that reads an mcpServers file, such as Cursor (.cursor/mcp.json)
{
"mcpServers": {
"esavendors": {
"url": "https://esavendors.fyi/mcp"
}
}
}List the tools with curl
curl -X POST "https://esavendors.fyi/mcp" -H "content-type: application/json" -H "accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Responses
A successful response has data and meta. A list response also has page, with these fields:
limit- : items on each page.
total- : items that match.
nextCursor- : send it back as
cursor, with the same filters andlimit. It is null on the last page. capped- : true when more items match than the cursor can reach.
fuzzy- : true when the items are close matches for
q.
An error has error (a sentence), code and sometimes details. Branch on code: invalid_parameter, invalid_cursor, not_found, method_not_allowed, rate_limited, internal_error.
A education vendor with indexable: false is public through the API. Its page is kept out of search engines. Do not link to it as if it were a normal page.
Rate limits and caching
Each client may send 300 requests in 60 seconds. Every GET response has RateLimit-Limit and RateLimit-Policy. Over the limit you get 429 with Retry-After: wait that many seconds. The limit is counted at each Cloudflare location.
A successful response sends Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=600 and an ETag. Send the ETag back as If-None-Match to get 304 with no body.
Credit and licenses
Show this credit line next to the data you display:
Data from ESA Vendors (https://esavendors.fyi). Each record keeps the license of its source, listed in meta.sources. A listing is a record, not an endorsement.
Every response lists its sources in meta.sources. Keep a source's license when you reuse its records.
- NCES Private School Universe Survey 2023-24: license Public domain (US federal government work; no copyright), refreshed yearly
- Ontario Ministry of Education, Private School Location List: license Open Government Licence Ontario, refreshed yearly
- Get Information About Schools (GIAS), Crown copyright: license Open Government Licence v3.0, refreshed monthly
- Victorian Department of Education, School Locations 2025: license Creative Commons Attribution 4.0 (DataVic), refreshed yearly
- ESA Vendors hand-verified vendor research: license Facts only; no third-party text reused, refreshed manual
- Arizona Department of Education, Empowerment Scholarship Account: license Public program page; reuse subject to the Department's terms, refreshed manual
- Step Up For Students (Florida): license Public program page; reuse subject to the organization's terms, refreshed manual
- Utah Fits All Scholarship: license Public program page; reuse subject to the program's terms, refreshed manual
- Texas Education Freedom Accounts: license Public program page; reuse subject to the program's terms, refreshed manual
- Iowa Students First Education Savings Accounts: license Public program page; reuse subject to the Department's terms, refreshed manual
- Arkansas Education Freedom Accounts: license Public program page; reuse subject to the Department's terms, refreshed manual
Published by ESA Vendors. How we check each education vendor.