Someone just posted “I need a plumber TONIGHT”
.
Your agent already has the lead: scored, deduplicated, evidence-backed, delivered in seconds.
Every item is cheaply filtered, graded by a decision model, and only the few that look like real leads reach an LLM for extraction. Matched leads go to your agent; your agent's outcome tunes the thresholds. The diagram below lights up as the live pipeline runs.
Rules + embeddings. Language, keyword gate, dedupe, blocklist.
Jev returns calibrated probabilities over fixed options: is_lead, urgency, budget, authenticity.
Haiku-class structured output: need, subtype, geocode, contact path, evidence quotes.
On request: author history, business lookup, competitor check. Jev chooses steps, a cheap model reads.
Leads light up where they're posted. Arcs show them routing to subscribed agents. Storms, outages and heat waves arrive as signals that widen the net for the affected vertical and metro.
verticals: roofing · water_damage · electrical
effects: poll_rate ×2 · is_lead threshold −0.10 · radius 200 km
Surge is a feature, not a surcharge. Your agent gets more leads, not pricier ones; per-subscription caps protect the budget.
A typed JSON object with scores, evidence, freshness and a path to respond, so an agent can decide without re-reading the source. age_seconds at delivery is the product's core SLA metric.
ttl_seconds without stale: true, and stale leads are free.scores; you re-weight the composite per subscription.author_provided; your consent process owns the call.next_actions: claim, research, outcome, reply.The product is the API. OpenAPI 3.1, llms.txt, an agent.json card, a natural-language filter compiler and a hosted MCP server, so an agent can discover and call it without a human reading docs.
POST /v1/signup“emergency HVAC, Phoenix, budget”webhook · SSE · poll · MCPclaim → outcome# 1. a key (live + sandbox) curl -s https://leadfeed.dev/v1/signup -d '{"email":"you@agency.com"}' -H 'content-type: application/json' # 2. natural language → filter JSON curl -s https://leadfeed.dev/v1/subscriptions/compile -H "authorization: Bearer $LF_KEY" \ -d '{"prompt":"emergency plumbing in Phoenix with a budget signal"}' # 3. subscribe (webhook, HMAC-signed, retried) curl -s https://leadfeed.dev/v1/subscriptions -H "authorization: Bearer $LF_KEY" -d '{ "name": "phx-plumbing-emergency", "filter": {"services":["plumbing"], "geo":{"center":[33.45,-112.07],"radius_km":40}, "min_scores":{"composite":70,"urgency":0.6}, "max_age_seconds":1800}, "delivery": {"type":"webhook","url":"https://agent.example.com/leads","secret":"whsec_…"}}' # or just stream it curl -N https://leadfeed.dev/v1/stream?subscription=sub_01JB… -H "authorization: Bearer $LF_KEY"
# pip install leadfeed (sdk/python in the repo) from leadfeed import LeadFeed lf = LeadFeed(api_key="lf_live_…") flt = lf.compile("emergency HVAC in Phoenix with budget") sub = lf.subscribe("phx-hvac", filter=flt, delivery={"type": "stream"}) for lead in lf.stream(sub["id"]): # SSE, resumes with Last-Event-ID if lead["scores"]["composite"] >= 80 and lead["age_seconds"] < 600: lf.claim(lead["id"]) my_voice_agent.call(lead) # your outreach, your rules lf.outcome(lead["id"], "contacted") # feeds calibration + refunds
// npm i @leadfeed/sdk (sdk/typescript in the repo) import { LeadFeed } from "@leadfeed/sdk"; const lf = new LeadFeed({ apiKey: process.env.LF_KEY! }); const { filter } = await lf.compile("same-day movers in Denver, budget present"); const sub = await lf.subscribe({ name: "den-movers", filter, delivery: { type: "poll" } }); let cursor: string | undefined; setInterval(async () => { const page = await lf.poll(sub.id, { cursor }); // cursor pagination for (const { lead } of page.data) await agent.handle(lead); cursor = page.next_cursor ?? cursor; }, 15_000);
// Claude Desktop / Claude Code / any MCP client — hosted remote server { "mcpServers": { "leadfeed": { "type": "http", "url": "https://leadfeed.dev/mcp", "headers": { "Authorization": "Bearer lf_live_…" } } } } // tools: search_leads · compile_filter · subscribe · poll_leads · get_lead // claim_lead · research_lead · mark_outcome · signals · taxonomy · sandbox_replay > "Find urgent roofing leads within 50 km of Phoenix posted in the last hour, claim the top two, and research the authors."
POST https://agent.example.com/leads X-LeadFeed-Event: lead.created X-LeadFeed-Idempotency-Key: ld_01JB… X-LeadFeed-Signature: t=1761141791,v1=5f1c… # hmac_sha256(secret, "<t>.<body>") { "event": "lead.created", "subscription": "phx-plumbing-emergency", "lead": { "id": "ld_01JB…", "age_seconds": 91, "scores": { "composite": 86, … }, … }, "next_actions": [ {"action":"claim", …}, {"action":"research", …}, {"action":"reply", …} ] } # later, pushed to the same endpoint so your agent stops chasing a solved lead: { "event": "lead.status", "lead_id": "ld_01JB…", "status": "resolved" }








Lead vendors sell stale, shared, static lists. Buyers who need a service today post publicly, and the first responder wins. Agents are now the buyers of data: they need structured, low-latency, pay-per-use inputs, not dashboards. Decision models that return calibrated yes/no answers in milliseconds make it viable to grade every post as it appears.
Usage credits plus a small platform fee. Leads priced by vertical and score tier; exclusive leads are the premium lever. No seats: agents don't have seats.
max_age_secondsinvalid within 24 h auto-credited (capped at 15%)surge = more leads, not pricier onescredit packs $100 · $500 (+10%) · $2,500 (+20%) via Stripe in the console or POST /v1/billing/checkout
posture and a kill switch.DELETE /v1/authors/{handle} purges a person across leads; source URLs are re-checked before delivery of older leads.sensitive: true, which restricts resale and backfill.Instant live + sandbox keys. The sandbox streams fabricated leads immediately so you can wire the loop before a single real post arrives.