For AI agent developers

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

1

Discover what's available

Read the discovery manifest. It tells you every endpoint + capability:

GET https://hirelocalcrew.com/.well-known/agent.json
2

Search 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.
3

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.
4

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.

curlbash
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."
  }'
Python (requests)python
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())
Node (fetch)javascript
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());
Claude tool_use definitionjson
{
  "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'"
      }
    }
  }
}
OpenAI function-callingjson
{
  "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 routing
  • lead.forwarded — successfully delivered to the active provider
  • lead.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

Anonymous
100 req/hr per IP
  • Read endpoints
  • Quote requests
  • MCP server access
Registered (free)
10,000 req/day
  • Everything in Anonymous
  • Attribution in our analytics
  • Email alert on rate-limit hit
Partner
100,000 req/day
  • 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

Phase A · LIVE
  • 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)
Phase B · Q4 2026
  • 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)
Phase C · 2027
  • Provider identity via AgentPassport / verifiable credentials
  • Signed responses (cryptographic attestation)
  • Federated network with other LeadFlow-style operators
  • Webhook subscriptions for booking lifecycle events