SaaS Leads API · v1
The SaaS Leads API gives you programmatic access to Google Maps lead extraction and website enrichment. Every endpoint that scrapes data goes through the same pipeline as the dashboard - one credit per returned lead.
Base URL: https://supplysteer.online/api/v1
Authentication
All requests require a Bearer API key in the Authorization header. Generate keys from your API Keys page.
# Replace with your real key
Authorization: Bearer sk_live_abc123…
Rate limits
60 requests per minute per key. A token bucket refills continuously. On exceedance you get 429 Too Many Requests.
Errors
| Status | Meaning |
|---|---|
| 401 | Missing / invalid / revoked API key |
| 402 | Out of credits - top up in dashboard |
| 404 | Job not found, or doesn't belong to your account |
| 422 | Invalid request body (validation) |
| 429 | Rate limit exceeded |
| 502 | Upstream Google Maps failure |
Check available results
Free probe - how many results Google has for a query. Doesn't charge credits.
curl -X POST https://supplysteer.online/api/v1/jobs/count \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{"query": "dentists in new york"}' # Response { "query": "dentists in new york", "available": 847 }
Create a new search job
Starts an async job that scrapes Maps + enriches every business website. Returns immediately with a job id.
| Field | Type | Default | Description |
|---|---|---|---|
| query | string | required | Google Maps search query |
| max_results | int | 120 | Cap on returned leads (1–500) |
| pages_to_scrape | int | 5 | Result pages to walk (1–20) |
| enrich | bool | true | Visit each website for emails & socials |
| excluded_fields | string[] | [] | Field keys to drop from exports |
| filters | object | {} | {"no_website": true} or {"has_website": true} |
curl -X POST https://supplysteer.online/api/v1/jobs \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "query": "plumbers in london", "max_results": 100, "enrich": true }' # 201 Created { "id": 142, "status": "queued", "query": "plumbers in london", "progress_message": "Queued (API)" }
List your jobs
Returns your recent jobs (newest first). limit 1–200.
Get a job + all its leads
Poll this until status is completed or failed. The leads array grows as the job runs.
# Response { "id": 142, "status": "enriching", "total_found": 98, "total_enriched": 44, "total_with_email": 31, "progress_phase": "enrich", "progress_current": 44, "progress_total": 98, "leads": [ ... ] }
Get leads only (lighter payload)
Same leads array as GET /jobs/{id} but without the job metadata.
Export as CSV
Streams a CSV file with all enriched fields. Respects the job's excluded_fields.
X profile lookup
Fetch an X (Twitter) profile - bio, follower counts, location, website, verified flags, profile/banner URLs. 1 credit per fresh lookup; repeat lookups within 24h are served from cache for free (cached: true).
| Field | Type | Default | Description |
|---|---|---|---|
| username | string | required | X handle, with or without leading @ |
curl -X POST https://supplysteer.online/api/v1/x/profile \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{"username": "elonmusk"}' # Response { "profile": { "rest_id": "44196397", "screen_name": "elonmusk", "name": "Elon Musk", "description": "...", "followers_count": 221000000, "friends_count": 1037, "statuses_count": 75000, "verified": true, "profile_image_url_https": "..." }, "cached": false, "credits_remaining": 499 }
X deep analysis
Profile + recent tweets + AI summary in one call. 2 credits on a fresh run, free on cache hit within 24h. Use this when you want positioning / persona signal for outreach, not just raw profile fields.
| Field | Type | Default | Description |
|---|---|---|---|
| username | string | required | X handle, with or without leading @ |
curl -X POST https://supplysteer.online/api/v1/x/analyze \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{"username": "elonmusk"}' # Response (truncated) { "profile": { ... }, "tweets": [ { "id": "...", "text": "...", "created_at": "..." } ], "analysis": { "summary": "...", "topics": ["AI", "space"], "persona": "...", "outreach_angle": "..." }, "cached": false, "charged": 2, "credits_remaining": 497 }
502 with "X lookup failed", retry after a few seconds - credits are not deducted on failure.
Lead object
{
"id": 9821,
"name": "Brooklyn Dental Studio",
"phone": "+1 718 555 0142",
"website": "https://brooklyndental.com",
"address": "123 Atlantic Ave, Brooklyn, NY",
"rating": "4.8",
"reviews": "312",
"categories": "Dentist",
"hours": "Mon–Fri 9–6",
"latitude": "40.6782",
"longitude": "-73.9442",
"review_snippets": ["Friendly staff…"],
"emails": ["info@brooklyndental.com"],
"email_status": "enriched",
"facebook_url": "https://facebook.com/…",
"instagram_url": "https://instagram.com/…",
"linkedin_url": "",
"twitter_url": "",
"youtube_url": "",
"tiktok_url": "",
"about_summary": "Family dental practice…",
"maps_link": "https://maps.google.com/?cid=…"
}
Job object
Field reference for job responses. Status values: queued, scraping, enriching, completed, failed.
