Documentation
API & MCP server
Last updated October 24, 2026
Overview
reachpony is a directory of local home-service businesses (plumbing, HVAC, roofing, electrical and more). Each profile is built from the business's own website: the services it offers, its service area, emergency and same-day availability, licenses, published prices, brands serviced, and how to get a quote or book.
Who it's for: people and AI agents looking for a pro for a specific job, such as "a plumber in Round Rock who repairs tankless water heaters and does emergency calls".
What it does: search by job, trade, requirement and location; open one business's full profile; list which metros and trades are covered.
Why use it instead of a browser: an agent gets businesses filtered by the exact service and requirements in one call, as structured JSON, instead of opening and reading a dozen business websites to find out who does the job, who serves the area and who answers at night.
Restrictions: United States only. It currently covers Atlanta, Austin, Dallas-Fort Worth, Houston and Phoenix; other locations return covered: false and a message,
never an empty list presented as a result. Coverage grows over time; call
list_coverage for the current list. Free, no account, no plan,
no age limit. Content is in English.
What it does not do: reachpony does not book jobs, take payments, send messages or contact businesses. It returns contact and booking details; the user contacts the business directly.
Setup
| MCP endpoint | https://reachpony.com/mcp |
|---|---|
| Transport | Streamable HTTP, stateless (no session id), JSON responses |
| Authentication | None. No OAuth, no API key, no scopes. |
| Test vs production | One production endpoint. There are no credentials and no test account to set up; every tool is read-only, so testing against production has no side effects. |
| JSON API |
https://reachpony.com/v1/ (same data, see
JSON API)
|
| Agent summary |
/llms.txt
|
Client configuration (Claude Code, Cursor and most MCP clients):
{
"mcpServers": {
"reachpony": { "type": "http", "url": "https://reachpony.com/mcp" }
}
}
Try it with the MCP Inspector (npx @modelcontextprotocol/inspector, Streamable HTTP), or with curl:
curl https://reachpony.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Tools
Every tool is Read. None is a Write or a Sensitive write:
no tool creates, changes, sends, shares, publishes or pays for anything,
here or at a business. Each tool carries the MCP annotations
readOnlyHint: true, destructiveHint: false,
idempotentHint: true and openWorldHint: false.
| Tool | Classification | Sensitive | Side effects | Permissions |
|---|---|---|---|---|
search_businesses |
Read | No | None (the query is logged without user identifiers, see Data) | None needed |
get_business |
Read | No | None (the id is logged) | None needed |
list_coverage |
Read | No | None | None needed |
Because there is no sign-in, there are no user accounts to read from and no separate read-only permission to grant: the whole server is read-only.
search_businesses
Find businesses near a US city or ZIP code. service is the most
precise filter; trade matches a kind of business;
flags are requirements a business must all meet. 10 results per
page.
| Input | Type | Required | Description |
|---|---|---|---|
location |
string | Yes |
City ("Round Rock, TX"), county, metro or 5-digit ZIP
code.
|
service |
string[] (enum), max 10 | No |
Service codes such as plumbing.water_heater_repair. Matches
businesses offering any of them. Codes:
/v1/taxonomy.
|
trade |
string[] (enum), max 10 | No |
Trade codes (list). Matches businesses in any
of them. Not needed when service is given.
|
flags |
string[] (enum), max 10 | No |
Requirements such as emergency_24_7 (list). A business must have all of them.
|
query |
string, max 200 | No |
Keywords matched against names, summaries and services, e.g. a brand
("Rheem") or a business name.
|
page |
integer, 1–20 | No | Default 1. |
Output (structuredContent, with the same JSON as text):
| Field | Description |
|---|---|
covered |
false when the location or trade isn't covered yet.
message then says what is covered.
|
message |
Human-readable note, or null. |
resolved |
How the request was understood:
location (label, metro),
services, trades, flags,
text. Show this to the user when it differs from what
they asked.
|
results |
Organic results, ranked. Each has id,
name, url (profile page),
trades, city, metro,
summary, services, flags,
contact (phone, email,
quote_url, booking_url,
booking_platform, quotes),
website, rating,
review_count. Fields a business doesn't have are left
out.
|
sponsored |
Paid placements, same shape plus "sponsored": true.
Page 1 only, never mixed into results or their ranking.
Label them as sponsored when you show them.
|
page, total_pages,
total_results, next_page
|
Paging. next_page is null on the last
page.
|
{
"covered": true,
"message": null,
"resolved": {
"text": "",
"location": { "label": "Austin, TX", "metro": "austin" },
"services": ["plumbing.water_heater_repair"],
"trades": [],
"flags": ["emergency_24_7"]
},
"page": 1,
"total_pages": 16,
"total_results": 156,
"next_page": 2,
"results": [
{
"id": "hambone-plumbing-and-septic-pumping",
"name": "Hambone Plumbing and Septic Pumping",
"url": "https://reachpony.com/b/hambone-plumbing-and-septic-pumping",
"trades": ["plumbing", "appliance_repair", "septic"],
"city": "Taylor",
"metro": "austin",
"summary": "Family-owned plumbing and septic pumping company serving Taylor and Central Texas since 1982, …",
"services": ["plumbing.drain_cleaning", "plumbing.water_heater_repair", "…"],
"flags": ["emergency_24_7", "same_day", "free_estimates", "…"],
"contact": { "phone": "+15125030323", "quotes": "Quotes by online form or phone" },
"website": "https://hamboneplumbing.com",
"rating": 4.9,
"review_count": 178
}
],
"sponsored": []
}
get_business
The full profile of one business.
| Input | Type | Required | Description |
|---|---|---|---|
id |
string | Yes |
An id from search_businesses. Old ids of
renamed businesses still resolve.
|
Output: every field of a search result, plus address,
zip, founded_year, team_size_band,
maps_url, updated_at (when the profile was last
refreshed), highlights, service_area,
licenses, prices (as published by the business;
not quotes), brands and rating_source ("Google"
when a rating is present). Fields a business doesn't have are left out.
list_coverage
No inputs. Returns the metros and trades currently indexed, with business counts and the last refresh date.
{
"refreshed_at": "2026-10-13T13:15:32Z",
"metros": [
{
"metro": "austin",
"label": "Austin",
"trades": [{ "code": "plumbing", "label": "Plumbing", "businesses": 400 }, …]
}
]
}
Status handling
-
Results found:
covered: trueand a non-emptyresults. -
No match in a covered area:
covered: true,total_results: 0. Suggest dropping a flag or widening the service. -
Not covered:
covered: false, emptyresultsand amessagelisting what is covered. Tell the user; don't present this as "no businesses exist". -
Past the last page: empty
resultswithtotal_results > 0; go back to page 1. -
Data freshness: profiles are refreshed periodically, not
live.
updated_aton a profile andrefreshed_aton coverage give the dates. Availability, prices and licenses should be confirmed with the business.
Every tool is idempotent and has no side effects, so any call can be retried safely. There are no pending, confirmed or cancelled states: reachpony never starts a transaction.
Errors
Invalid arguments come back as a tool result with
isError: true and a message that says how to fix the call, so
the model can correct itself:
| Cause | Message (example) |
|---|---|
| Missing location |
`location` is required: a city, county, metro or ZIP code.
|
| Unknown service code |
Unknown service code "plumbing". "plumbing" is a trade: pass it
as `trade` instead.
|
| Unknown trade or flag | Unknown trade "plumber". Valid trades: … |
| Too many values |
At most 10 values each for service, trade and flags.
|
| Page out of range | `page` must be between 1 and 20. |
| Unknown id |
No business with id "…". Ids come from search_businesses.
|
| Search backend down | Temporarily unavailable, please retry. |
An unknown tool name is a JSON-RPC invalid_params error. Over
HTTP (MCP and JSON API): 400 bad arguments,
404 unknown id or endpoint, 429 rate limited,
503 temporarily unavailable. JSON API errors are
{"error": "…"}.
Rate limits
/mcp and /v1/* share a per-IP limit: bursts of 30
requests, then 4 per second. Over the limit, the response is HTTP
429 with Retry-After in whole seconds (often
0): wait that long, and at least 250 ms, then retry. Request
bodies are limited to 64 KB. Need more? Write to
[email protected].
JSON API
The same data over plain HTTP GET, for clients that don't speak MCP. CORS is open; no auth.
| Endpoint | Equivalent |
|---|---|
GET /v1/search
with location, service,
trade, flag (repeat or comma-separate),
q, page
|
search_businesses |
GET /v1/business/{id} (an old id answers
301 to the current one)
|
get_business |
GET /v1/coverage
|
list_coverage |
GET /v1/taxonomy
|
Every trade, service and flag code with its label |
Codes
Trades:
appliance_repairAppliance repairchimneyChimneycleaningCarpet and interior cleaningelectricianElectricalexterior_cleaningPressure washing and exterior cleaningflooringFlooringfoundationFoundation, concrete and masonrygarage_doorGarage doorshandymanHandymanhvacHVAClandscapingLandscaping and tree careoutdoor_livingFences, decks and outdoor livingpaintingPainting and drywallplumbingPlumbingpoolPools and spasremodelingRemodeling and general contractingrestorationDamage restorationroofingRoofingsecurity_avSecurity, AV and low voltagesepticSeptic
Flags:
emergency_24_724/7 emergency servicesame_daySame-day servicefree_estimatesFree estimatesfinancingFinancingupfront_pricingUpfront pricingowner_operatedOwner-operatedresidentialResidentialcommercialCommerciallicensed_claimedLicensedinsured_claimedInsuredsatisfaction_guaranteeSatisfaction guaranteediscountsDiscountsmaintenance_planMaintenance plansspanish_spokenSpanish spokenmanufacturer_certifiedManufacturer certifiedveteran_ownedVeteran-ownedinsurance_claims_helpInsurance claim helpnate_certifiedNATE-certified techniciansrebates_helpRebate help
Service codes (trade.service) are listed with descriptions at
/v1/taxonomy and as enums
in the tool schema.
Example prompts
- "My water heater is leaking. Find a plumber in Round Rock, TX who can come today."
- "Which HVAC companies near 77005 service Trane systems and offer financing?"
- "Find a licensed electrician in Phoenix who does EV charger installs, and tell me how to get a quote."
- "Compare three roofers in the Atlanta area that do free estimates."
- "Which cities does reachpony cover for plumbing?"
Data & security
-
What is collected: the tool arguments (search text,
location, codes, page) and the result counts, with a timestamp and the
tool name. No account, name, email, IP address or device id is stored with
it. Don't put personal details in
query. - Why: to run the search, keep the service reliable and decide which areas and trades to add.
- Retention: raw query events are deleted after 90 days.
- Never: sold, used for advertising or profiling, or used to train AI models.
- Security: HTTPS only; the search index is on a private network behind a search-only key; IP addresses are held in memory for rate limiting only.
- Business data: public information from each business's own website, plus its Google rating.
Full details: Privacy policy and Terms.
Support
- Support, corrections and removal requests: [email protected]
- Security reports and incidents: [email protected]