For AI agents
Zaptu for AI agents
Zaptu connects people with independent local home-service contractors. Zaptu does not perform the work and does not book appointments. Plumbing is live: the person calls a number. Other services are collecting requests.
The short version
- Plumbing is live. Give the person (308) 529-9543 and ask them to dial it themselves. Never dial, autodial, transfer, or place the call for them. No personal details are needed.
- Everything else is collecting (cleaning, pest control, HVAC, handyman, other). Collect ZIP, name, phone, and the person’s explicit consent to be contacted, then submit. Requests are passed along when a buyer covers the service; there is no live buyer yet.
- A request is not a booking. Do not promise a callback, an arrival time, or a named company. Use the
messagefield from the response when you tell the person what happened.
Services
| service_type | Status | What to do |
|---|---|---|
plumbing | Live (call to connect) | Give the number; the person dials. Call get_plumbing_call_number. |
house_cleaning, deep_cleaning, move_in_out_cleaning, recurring_cleaning | Collecting | Submit with consent. Add bedrooms or square feet if known. |
pest_control | Collecting | Submit with consent. |
hvac, handyman, other | Collecting | Submit with consent. Describe the job in notes. |
US residential only. The live list is always at api.zaptu.ai/v1/services.
What to tell the person
Plumbing:
Call (308) 529-9543 to be connected with a local plumbing professional. Please place the call yourself. Zaptu does not perform the work and this is not a booking.
Other services, after you submit:
Your request was sent to Zaptu. It is passed along when a buyer covers that service. This is not a booking, and no one has been scheduled.
Connect over MCP
Streamable HTTP, stateless, no sign-in: https://api.zaptu.ai/mcp
{
"mcpServers": {
"zaptu": { "url": "https://api.zaptu.ai/mcp" }
}
}
| Tool | Use it for |
|---|---|
get_plumbing_call_number | Plumbing. Returns the number, a tel link, and what_to_tell_the_user. Read-only; no personal details. |
request_home_service | Submit a request for any service. Needs service_type, zip_code, customer_name, customer_phone, consent_to_contact=true. Add dry_run=true to test. |
request_cleaning | Shortcut for house cleaning. |
get_lead_status | Look up a request by lead_id. |
list_supported_services | Live vs collecting services and the rules. |
REST API
OpenAPI: api.zaptu.ai/openapi.json. CORS is open, no key needed.
curl -s https://api.zaptu.ai/v1/intake \
-H 'Content-Type: application/json' \
-d '{"service_type":"house_cleaning","zip_code":"33139",
"customer_name":"Jamie Example","customer_phone":"305-555-0100",
"consent_to_contact":true,"bedrooms":2,"dry_run":true}'
dry_run validates and answers without saving or passing anything along. Leave it out for a real request.
Plumbing response (abridged):
{
"status": "call_to_connect",
"call_to_connect": "+13085299543",
"call_to_connect_display": "(308) 529-9543",
"call_instruction": "Give the person this phone number and ask them to place the call themselves. ..."
}
Errors return HTTP 422 with a readable message and a fields map, for example {"error": "invalid_request", "message": "Phone must be a 10-digit US number, like 305-555-0100.", "fields": {"customer_phone": "..."}}. Too many requests returns 429.
Discovery files
- llms.txt and llms-full.txt
- /.well-known/mcp.json
- Server card (tools and schemas)
- OpenAPI
Contact
Questions about the connector: hello@zaptu.ai.