SaaS Leads · API

v1 reference
🔑 API Keys ← Dashboard

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…
Keys are shown once at creation time. Store them in a secrets manager - they cannot be retrieved later. Revoke and rotate freely.

Rate limits

60 requests per minute per key. A token bucket refills continuously. On exceedance you get 429 Too Many Requests.

Errors

StatusMeaning
401Missing / invalid / revoked API key
402Out of credits - top up in dashboard
404Job not found, or doesn't belong to your account
422Invalid request body (validation)
429Rate limit exceeded
502Upstream Google Maps failure

Check available results

POST /api/v1/jobs/count

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

POST /api/v1/jobs

Starts an async job that scrapes Maps + enriches every business website. Returns immediately with a job id.

FieldTypeDefaultDescription
querystringrequiredGoogle Maps search query
max_resultsint120Cap on returned leads (1–500)
pages_to_scrapeint5Result pages to walk (1–20)
enrichbooltrueVisit each website for emails & socials
excluded_fieldsstring[][]Field keys to drop from exports
filtersobject{}{"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

GET /api/v1/jobs?limit=50

Returns your recent jobs (newest first). limit 1–200.

Get a job + all its leads

GET /api/v1/jobs/{id}

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)

GET /api/v1/jobs/{id}/leads

Same leads array as GET /jobs/{id} but without the job metadata.

Export as CSV

GET /api/v1/jobs/{id}/export

Streams a CSV file with all enriched fields. Respects the job's excluded_fields.

X profile lookup

POST /api/v1/x/profile

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

FieldTypeDefaultDescription
usernamestringrequiredX 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

POST /api/v1/x/analyze

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.

FieldTypeDefaultDescription
usernamestringrequiredX 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
}
X endpoints depend on an active upstream session on our side. If you see 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.

Need higher rate limits, webhook callbacks, or a custom SLA? Email msafiullahqadeer786@gmail.com.