API for developers
Read the Grease Cleaning data as JSON. The API is free, needs no key and reads only. Base URL: https://greasecleaning.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 |
GET /api/v1/products | List the live products, all or one category's |
|
GET /api/v1/products/{slug} | Read one product |
|
GET /api/v1/product-categories | List the product categories with their product counts | None |
GET /api/v1/academy/courses | List the published academy courses |
|
GET /api/v1/academy/courses/{slug} | Read one published course with its objectives, lessons and FAQ. No exam questions or answers |
|
GET /api/v1/certificates/{code} | Verify one certificate of completion by its code |
|
Examples
Find cleaning companies
curl "https://greasecleaning.fyi/api/v1/listings?category=hood-cleaning&country=US&limit=5"Read the next page
curl "https://greasecleaning.fyi/api/v1/listings?limit=5&cursor=<page.nextCursor from the last response>"Read one cleaning company
slug=$(curl -s "https://greasecleaning.fyi/api/v1/listings?limit=1" | jq -r '.data[0].slug')
curl "https://greasecleaning.fyi/api/v1/listings/$slug"List the places and categories you can filter by
curl "https://greasecleaning.fyi/api/v1/places"
curl "https://greasecleaning.fyi/api/v1/categories"MCP server
An AI agent can use the same data through MCP at https://greasecleaning.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 cleaning companies by text, place and category.
get_listing- : Get one published cleaning company by its slug.
list_places- : List countries, regions and cities that have cleaning companies.
list_categories- : List categories with their cleaning company counts.
get_stats- : Get the number of published cleaning companies, places and categories, and when the data last changed.
list_sources- : List where the cleaning company data comes from, with the license and refresh of each source.
list_products- : List the products, with the price each had on the day it was checked. Filter by product category.
get_product- : Get one product by its slug, with its page and outbound link.
list_product_categories- : List the product categories with their product counts.
list_courses- : List the published academy courses with their level, length, pass mark and certificate validity.
get_course- : Get one published academy course by its slug, with its objectives, lessons and FAQ. Exam questions and answers are never returned.
Add it to Claude Code
claude mcp add --transport http greasecleaning https://greasecleaning.fyi/mcpAdd it to a client that reads an mcpServers file, such as Cursor (.cursor/mcp.json)
{
"mcpServers": {
"greasecleaning": {
"url": "https://greasecleaning.fyi/mcp"
}
}
}List the tools with curl
curl -X POST "https://greasecleaning.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, unavailable.
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 Grease Cleaning (https://greasecleaning.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.
- City of Boston Fire Department: license no explicit licence; factual business listing, refreshed manual
- Capital Regional District (BC) trucked liquid waste service directory: license no explicit licence; factual business listing, refreshed manual
- Listing enrichment: license source, refreshed manual
- Georgia Restaurant Association: license no explicit licence; factual business listing, refreshed manual
- City of Grand Prairie Public Health and Environmental Quality Department: license no explicit licence; factual business listing, refreshed manual
- Michigan Restaurant & Lodging Association buyers guide: license no explicit licence; factual business listing, refreshed manual
- National Air Duct Cleaners Association (NADCA): license no explicit licence; factual business listing, refreshed manual
- City of Oklahoma City FOG transporters and waste haulers: license no explicit licence; factual business listing, refreshed manual
- Overture Maps Places: license CDLA-Permissive-2.0, refreshed manual
- Pennsylvania Restaurant & Lodging Association: license no explicit licence; factual business listing, refreshed manual
- Public government registers and trade-association directories: license no explicit licence; factual business listing, refreshed manual
- County of Santa Clara Consumer and Environmental Protection Agency (CEPA): license no explicit licence; factual business listing, refreshed manual
- Southeastern FOG Alliance approved commercial grease-hauler lists: license no explicit licence; factual business listing, refreshed manual
- Texas Restaurant Association buyers guide: license no explicit licence; factual business listing, refreshed manual
- Washington Hospitality Association vendor directory: license no explicit licence; factual business listing, refreshed manual
- Business websites: license Business website facts; original text and images retain their rights., refreshed manual
Published by Grease Cleaning. How we check each cleaning company.