Build agents that book real-world services.
When your agent needs a plumber in Phoenix, a roofer in Charlotte, or a tree removed in Raleigh — call us. Free read API, free quote requests, MCP-native, no negotiation required. Booking with escrow ships Q4 2026.
Why this exists
Consumer AI agents are about to do real-world errands at scale. The infrastructure doesn't exist yet. Google's slow, Yelp's gated, Angi requires negotiation, and almost no local-services business has an MCP server.
We run a network of ~180 service-area pages across ~30 service categories. Each one ranks on Google, accepts leads, and forwards to vetted local contractors. We've wrapped the entire network in a free agent-callable API + MCP server. Your agent calls us; we route to real humans who do the work. You don't negotiate, we don't take a cut (Phase A) — Phase B adds bookings with escrow and a transparent take-rate.
Quickstart
Discover what's available
Read the discovery manifest. It tells you every endpoint + capability:
GET https://hirelocalcrew.com/.well-known/agent.jsonSearch providers by service + location
Find tree removal services in Raleigh:
GET https://hirelocalcrew.com/api/agent/v1/providers?service=tree-removal&location=raleigh
# Returns up to 20 providers with brand, location,
# cities served, rating, pricing tier.Get full detail on one provider
GET https://hirelocalcrew.com/api/agent/v1/providers/{id}
# Returns capabilities, sub-services, pricing tiers
# (small/medium/large jobs with $ ranges), service area
# (cities + ZIP prefixes), reviews, contact options.Submit a quote on behalf of the consumer
POST https://hirelocalcrew.com/api/agent/v1/quote
Content-Type: application/json
{
"provider_id": "abc123",
"consumer_name": "Jane Smith",
"consumer_phone": "+19195551234",
"consumer_zip": "27604",
"job_description": "Two dead pine trees near the driveway, need removal + stump grind. Photos available.",
"preferred_timing": "Within the next 2 weeks"
}
# Returns:
# {
# "ok": true,
# "data": {
# "quote_id": "...",
# "status": "received",
# "estimated_response_time_minutes": 30,
# "provider_name": "Raleigh Tree Removal Company",
# "tracking_url": "..."
# }
# }Drop-in code examples
Five ways to call us. Pick whichever fits your stack. All examples below submit a quote on a homeowner's behalf — replace the placeholder fields and you're done.
curl -X POST https://hirelocalcrew.com/api/agent/v1/quote \
-H "Content-Type: application/json" \
-d '{
"provider_id": "PROVIDER_ID",
"consumer_name": "Jane Smith",
"consumer_phone": "+19195551234",
"consumer_zip": "27604",
"job_description": "Two dead pines, need removal + stump grind."
}'import requests
# Optional: API key for attribution + higher rate limit
API_KEY = "YOUR_API_KEY" # or None
# 1. Search for providers
res = requests.get(
"https://hirelocalcrew.com/api/agent/v1/providers",
params={"service": "tree-removal", "location": "raleigh"},
headers={"Authorization": f"Bearer {API_KEY}"} if API_KEY else {},
)
providers = res.json()["data"]["providers"]
provider = providers[0]
# 2. Submit a quote on behalf of the consumer
res = requests.post(
"https://hirelocalcrew.com/api/agent/v1/quote",
json={
"provider_id": provider["id"],
"consumer_name": "Jane Smith",
"consumer_phone": "+19195551234",
"consumer_zip": "27604",
"job_description": "Two dead pines, need removal + stump grind.",
},
headers={"Authorization": f"Bearer {API_KEY}"} if API_KEY else {},
)
print(res.json())const API_KEY = process.env.HIRELOCALCREW_API_KEY; // optional
// 1. Search
const search = await fetch(
"https://hirelocalcrew.com/api/agent/v1/providers?service=tree-removal&location=raleigh",
{ headers: API_KEY ? { Authorization: `Bearer ${API_KEY}` } : {} }
);
const { data } = await search.json();
const provider = data.providers[0];
// 2. Quote
const quote = await fetch("https://hirelocalcrew.com/api/agent/v1/quote", {
method: "POST",
headers: {
"Content-Type": "application/json",
...(API_KEY ? { Authorization: `Bearer ${API_KEY}` } : {}),
},
body: JSON.stringify({
provider_id: provider.id,
consumer_name: "Jane Smith",
consumer_phone: "+19195551234",
consumer_zip: "27604",
job_description: "Two dead pines, need removal + stump grind.",
}),
});
console.log(await quote.json());{
"name": "request_local_service_quote",
"description": "Submit a quote request to a local home-service provider (tree removal, plumbing, HVAC, roofing, etc.) on behalf of the user. Returns a tracking ID; the provider responds to the user within 30 minutes during business hours.",
"input_schema": {
"type": "object",
"required": ["service", "city_or_zip", "consumer_name", "job_description"],
"properties": {
"service": {
"type": "string",
"description": "Service slug, e.g. 'tree-removal', 'plumbing', 'hvac-repair'"
},
"city_or_zip": {
"type": "string",
"description": "Either a city name (e.g. 'Raleigh') or 5-digit ZIP"
},
"consumer_name": { "type": "string" },
"consumer_phone": { "type": "string", "description": "E.164 format preferred" },
"consumer_email": { "type": "string" },
"job_description": {
"type": "string",
"description": "What the consumer needs done, with detail"
},
"preferred_timing": {
"type": "string",
"description": "e.g. 'ASAP', 'this weekend', 'within 2 weeks'"
}
}
}
}{
"type": "function",
"function": {
"name": "request_local_service_quote",
"description": "Submit a quote request to a vetted local home-service provider on behalf of the user.",
"parameters": {
"type": "object",
"required": ["provider_id", "consumer_name", "job_description"],
"properties": {
"provider_id": { "type": "string" },
"consumer_name": { "type": "string" },
"consumer_phone": { "type": "string" },
"consumer_zip": { "type": "string" },
"job_description": { "type": "string" },
"preferred_timing": { "type": "string" }
}
}
}
}Webhooks (close the loop)
Once you submit a quote, the lead routes to a vetted local provider. Register a webhook URL and we'll POST you when the lead status changes — so your agent can update the consumer in real time.
Events
lead.received— quote captured, queued for routinglead.forwarded— successfully delivered to the active providerlead.won— operator marked the lead as a closed-won job (Phase B: agent gets attribution + take-rate)lead.lost— explicitly closed-lost (operator triage)
Payload
POST https://your-agent.com/webhook
Content-Type: application/json
X-LeadFlow-Signature: sha256=<HMAC>
X-LeadFlow-Event: lead.received
X-LeadFlow-Delivery-Id: <random-id>
{
"event": "lead.received",
"timestamp": "2026-05-15T14:30:22.000Z",
"delivery_id": "abc123def456",
"agent_client_id": "your-client-id",
"lead": {
"quote_id": "lead_abc...",
"provider_id": "page_xyz...",
"provider_name": "Raleigh Tree Removal Company",
"consumer_name": "Jane Smith",
"consumer_phone": "+19195551234",
"consumer_email": null,
"consumer_zip": "27604",
"job_description": "Two dead pines...",
"status": "NEW",
"submitted_at": "2026-05-15T14:30:20.000Z"
}
}Signature verification (Node)
import crypto from "node:crypto";
function verifyLeadflowSignature(payloadBody, header, secret) {
const expected =
"sha256=" +
crypto.createHmac("sha256", secret)
.update(payloadBody)
.digest("hex");
// constant-time compare
return crypto.timingSafeEqual(
Buffer.from(header), Buffer.from(expected)
);
}Email agents@hirelocalcrew.com with your webhook URL to register one. (Self-service registration ships in Phase B.)
MCP integration
If you're using Claude Desktop, Cursor, or any other MCP client, add us as a server. The MCP endpoint exposes three tools (search_providers, get_provider, request_quote) plus two resources (services catalog, locations catalog).
Claude Desktop config
Add to your claude_desktop_config.json:
{
"mcpServers": {
"hirelocalcrew": {
"url": "https://hirelocalcrew.com/api/mcp",
"transport": "http"
}
}
}Direct JSON-RPC call
POST https://hirelocalcrew.com/api/mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_providers",
"arguments": { "service": "plumbing", "location": "raleigh" }
}
}API keys + rate limits
- ✓Read endpoints
- ✓Quote requests
- ✓MCP server access
- ✓Everything in Anonymous
- ✓Attribution in our analytics
- ✓Email alert on rate-limit hit
- ✓Everything in Registered
- ✓Priority routing to vetted providers
- ✓Early access to Phase B bookings
Request an API key
Email agents@hirelocalcrew.com with: your agent / product name, contact info, expected daily volume, and a brief description of how you'll use the API. We'll issue a key within 24 hours — free for the first 5 partners shipping Q1 2027.
Roadmap
- Discovery manifest (/.well-known/agent.json) + MCP manifest (/.well-known/mcp.json)
- REST API v1: services, locations, providers (search + detail), availability (default windows), quote submission
- MCP server with 3 tools + 2 resources
- OpenAPI 3.1 spec
- Per-IP + per-API-key rate limiting
- Per-call analytics + attribution
- Outbound webhook subscriptions (lead.received / forwarded / won / lost)
- Structured provider capability profiles (sub-services, license, insurance, pricing model)
- Real-time slot availability per provider
- POST /api/agent/v1/bookings — booking with Stripe escrow
- Provider acknowledgment + status updates returned to agent
- Dispute resolution + refund flow
- Take-rate billing (5-10% on completed bookings)
- Provider identity via AgentPassport / verifiable credentials
- Signed responses (cryptographic attestation)
- Federated network with other LeadFlow-style operators
- Webhook subscriptions for booking lifecycle events