API Reference · v2.0

LeadMerlin API

Search for local businesses, enrich them by domain, and get back verified emails, phone carrier data, owner names, social profiles, and website intelligence.

⚡ Quick Start

Enriched business data in a few calls. Replace the key with yours from the dashboard.

1. Find a location code

curl "https://api.leadmerlin.com/api/v2/locations?q=denver" \
  -H "x-api-key: lm_your_key"

2. Search for businesses

curl -X POST https://api.leadmerlin.com/api/v2/searches \
  -H "x-api-key: lm_your_key" -H "content-type: application/json" \
  -d {"keyword":"electrician","location_codes":[1012938]}

3. Poll, then fetch results

curl https://api.leadmerlin.com/api/v2/jobs/<job_id> -H "x-api-key: lm_your_key"
curl https://api.leadmerlin.com/api/v2/jobs/<job_id>/results -H "x-api-key: lm_your_key"

Agent Skill

Paste this into Claude Code, Cursor, or Codex to search and enrich leads autonomously.

leadmerlin.skill.md
# LeadMerlin — Search & Enrich Local Business Leads

Search local businesses by niche and city, enrich them with owner names,
verified emails, phone line types, socials, and website intelligence.

## Auth
All endpoints require the x-api-key header. The key starts with lm_.
Get one at https://app.leadmerlin.com/dashboard

## Workflow
1. Locations — GET https://api.leadmerlin.com/api/v2/locations?q=city
2. Search    — POST https://api.leadmerlin.com/api/v2/searches { keyword, location_codes:[code] } -> job_id
3. Poll      — GET https://api.leadmerlin.com/api/v2/jobs/:id every 5s until status === "completed"
4. Results   — GET https://api.leadmerlin.com/api/v2/jobs/:id/results (paginate via next_cursor)
5. Enrich    — POST https://api.leadmerlin.com/api/v2/enrichments { leads:[{ domain }] } (up to 100)

## Notes
- 1 lead credit per enriched business. Failed enrichments refunded automatically.
- Demo endpoints (https://api.leadmerlin.com/api/v2/demo/*) need no auth and cost no credits.
- Export results to CSV with this header order:
Rank,Name,Category,Website,GBP URL,CID,Owner,Email,Phone,Phone Type,Address,City,State,Rating,Reviews,Claimed,Socials,Logo,Email 1..5 + Status,Phone 1..5 + Type + Carrier,Page 1..5 URL/Title/Meta/Text

Authentication

Every request needs your API key in the x-api-key header. Keys start with lm_ and are created automatically when you sign up — find and roll yours in the dashboard.

curl https://api.leadmerlin.com/api/v2/usage -H "x-api-key: lm_your_key"

GET /v2/locations

Fuzzy search for cities/regions. Returns location_code values for search. No credits.

{ "locations": [{ "location_code": 1012938, "full_name": "Denver, Colorado, US", ... }] }

GET /v2/jobs/:id

Poll every ~5s until status === "completed". Returns counts + progress.

GET /v2/jobs/:id/results

Paginated enriched businesses. Follow next_cursor until has_more is false. Best-match email/phone are promoted to the top level; full lists in contact.all_emails[] / all_phones[].

POST /v2/enrichments

Already have leads? Pass up to 100 domains and get the full pipeline — no search needed. Async, same poll + results flow. Failed enrichments are refunded.

curl -X POST https://api.leadmerlin.com/api/v2/enrichments -H "x-api-key: lm_your_key" \
  -H "content-type: application/json" \
  -d {"leads":[{"domain":"example.com","business_name":"Example","city":"Austin","state":"TX"}]}

Demo Endpoints

Test with fake data: /v2/demo/locations, /v2/demo/searches, /v2/demo/jobs/:id, /v2/demo/jobs/:id/results, /v2/demo/enrichments. No auth, no credits — every response carries demo: true.

Data Fields

Each enriched business: name, category, website, gbp_url, cid, logo, owner, summary, email, phone, phone_type, rank; contact (address, city, state, lat/lng, all_emails[] with status/role/free flags, all_phones[] with line_type + carrier); reputation (rating, reviews, is_claimed); services (list, specialties, areas, year_established, employees); web (tech stack, socials, has_blog, meta, pages[]).

Plans

Start free, then Starter ($39 / 10k leads), Pro ($49 / 20k), Agency ($97 / 50k). All plans run the full pipeline on every lead. See pricing →

Errors

  • 400 — invalid request (missing params, bad domain)
  • 401 — missing or invalid API key
  • 429 — credit limit or rate limit reached
  • 500 — internal server error