curl -X POST "/api/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"prompt": "50 lawyers in NYC",
"max_results": 50,
"deep_scan": false
}'
const axios = require('axios');
axios.post('/api/scrape', {
prompt: '50 lawyers in NYC',
max_results: 50,
deep_scan: false
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data));
import requests
response = requests.post(
'/api/scrape',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={
'prompt': '50 lawyers in NYC',
'max_results': 50,
'deep_scan': False
}
)
print(response.json())
import Foundation
let payload: [String: Any] = [
"prompt": "50 lawyers in NYC",
"max_results": 50,
"deep_scan": false
]
var req = URLRequest(url: URL(string: "/api/scrape")!)
req.httpMethod = "POST"
req.setValue("", forHTTPHeaderField: "X-API-Key")
req.setValue("application/json", forHTTPHeaderField: "Content-Type")
req.httpBody = try? JSONSerialization.data(withJSONObject: payload)
val client = OkHttpClient()
val json = """
{
"prompt": "50 lawyers in NYC",
"max_results": 50,
"deep_scan": false
}
""".trimIndent()
val body = json.toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("/api/scrape")
.addHeader("X-API-Key", "")
.post(body)
.build()
OkHttpClient client = new OkHttpClient();
String json = "{\"prompt\":\"50 lawyers in NYC\","
+ "\"max_results\":50,"
+ "\"deep_scan\":false}";
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url("/api/scrape")
.addHeader("X-API-Key", "")
.post(body)
.build();
import 'package:http/http.dart' as http;
import 'dart:convert';
final resp = await http.post(
Uri.parse('/api/scrape'),
headers: {
'X-API-Key': '',
'Content-Type': 'application/json',
},
body: jsonEncode({
'prompt': '50 lawyers in NYC',
'max_results': 50,
'deep_scan': false,
}),
);
| Status | Run ID | Leads Found | Started At | Actions |
|---|---|---|---|---|
|
No runs found for this tool
Start your first scrape to see the results appear here in real-time. |
||||
The extraction engine is currently connected to Global Fleet Nodes. All requests are proxied through residential IPs to ensure maximum reliability and bypass rate limits.
| # | Business | Location | Category | Rating | Contact Info | Status |
|---|---|---|---|---|---|---|
|
Searching Google Maps...
| ||||||
Introduction
The LeadGen AI REST API lets you programmatically launch scraping jobs, poll for results, and download leads. Authenticate every request with your personal API key shown below.
Plan Limits
Limits are set by the admin and apply to every run. Your current plan is highlighted.
POST /api/scrape
Starts a new scraping job. Returns a job_id you can use to poll for status or connect via WebSocket for real-time updates.
| Parameter | Description | ||||
|---|---|---|---|---|---|
prompt string | Natural language request, e.g. "Coffee shops in Dubai with >4 stars". | ||||
query string | Direct search query (used if prompt is empty). | ||||
max_results integer | Cap on leads to collect. Default: 100. | ||||
deep_scan boolean |
Interactive Configuration
cURL
Node.js
Python
Swift
Kotlin
Java
Flutter
curl -X POST "/api/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"prompt": "Plumbers in Austin TX",
"max_results": 50,
"deep_scan": false
}'
const axios = require('axios');
axios.post('/api/scrape', {
prompt: 'Plumbers in Austin TX',
max_results: 50,
deep_scan: false
}, {
headers: { 'X-API-Key': '' }
}).then(res => console.log(res.data));
import requests
url = "/api/scrape"
headers = { "X-API-Key": "", "Content-Type": "application/json" }
payload = {
"prompt": "Plumbers in Austin TX",
"max_results": 50,
"deep_scan": False
}
response = requests.post(url, headers=headers, json=payload)
print(response.json())
import Foundation
let url = URL(string: "/api/scrape")!
var req = URLRequest(url: url)
req.httpMethod = "POST"
req.addValue("", forHTTPHeaderField: "X-API-Key")
req.httpBody = // ... JSON body ...
val client = OkHttpClient()
val body = "{\\"prompt\\":\\"...\\"}".toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("/api/scrape")
.addHeader("X-API-Key", "")
.post(body).build()
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create("...", MediaType.get("application/json"));
Request request = new Request.Builder()
.url("/api/scrape")
.addHeader("X-API-Key", "")
.post(body).build();
import 'package:http/http.dart' as http;
final resp = await http.post(
Uri.parse('/api/scrape'),
headers: {'X-API-Key': ''},
body: {'prompt': '...'}
);
|
GET /api/jobs
Returns a list of all scraping jobs associated with your API key, ordered newest first.
curl "/api/jobs" \ -H "X-API-Key: "
import requests
resp = requests.get(
"/api/jobs",
headers={"X-API-Key": ""}
)
print(resp.json())
const res = await fetch('/api/jobs', {
headers: { 'X-API-Key': '' }
});
console.log(await res.json());
GET /api/jobs/{job_id}/results
Fetch all leads collected for a completed job.
curl "/api/jobs/JOB_ID/results" \ -H "X-API-Key: "
GET /api/download/{job_id}/{format}
Download leads as a file. format can be csv, xlsx, or json.
curl "/api/download/JOB_ID/csv?api_key=" \ -o leads.csv
WebSocket (Real-time)
Connect to the WebSocket to receive leads as they are scraped, without polling.
const ws = new WebSocket('wss://YOUR_HOST/ws/JOB_ID');
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (msg.type === 'lead') console.log('New lead:', msg.data);
if (msg.type === 'done') console.log('Complete:', msg.records, 'leads');
if (msg.type === 'error') console.error('Error:', msg.message);
};
curl -X POST "/api/facebook-page/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"url": "https://facebook.com/zuck"
}'
import requests
response = requests.post(
'/api/facebook-page/scrape',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={'url': 'https://facebook.com/zuck'}
)
print(response.json())
const axios = require('axios');
axios.post('/api/facebook-page/scrape', {
url: 'https://facebook.com/zuck'
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data));
| Status | Run ID | Leads Found | Started At | Actions |
|---|---|---|---|---|
No runs found | ||||
curl -X POST "/api/facebook-ads/search" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"query": "fitness supplements",
"country": "US",
"ad_type": "ALL",
"status": "active",
"max_results": 20
}'
import requests
response = requests.post(
'/api/facebook-ads/search',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={
'query': 'fitness supplements',
'country': 'US',
'ad_type': 'ALL',
'status': 'active',
'max_results': 20
}
)
print(response.json())
const axios = require('axios');
axios.post('/api/facebook-ads/search', {
query: 'fitness supplements',
country: 'US',
ad_type: 'ALL',
status: 'active',
max_results: 20
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data));
| Status | Run ID | Leads Found | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
curl -X POST "/api/youtube/video-info" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}'
curl -X POST "/api/youtube/channel-info" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.youtube.com/@MrBeast",
"max_videos": 30
}'
import requests
# Video info
video_resp = requests.post(
'/api/youtube/video-info',
headers={'X-API-Key': ''},
json={'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'}
)
# Channel info
channel_resp = requests.post(
'/api/youtube/channel-info',
headers={'X-API-Key': ''},
json={'url': 'https://www.youtube.com/@MrBeast', 'max_videos': 30}
)
print(channel_resp.json())
const axios = require('axios');
const headers = {
'X-API-Key': '',
'Content-Type': 'application/json'
};
// Video info
const video = await axios.post('/api/youtube/video-info',
{ url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' }, { headers });
// Channel info
const channel = await axios.post('/api/youtube/channel-info',
{ url: 'https://www.youtube.com/@MrBeast', max_videos: 30 }, { headers });
console.log(channel.data);
| Status | Run ID | Leads Found | Started At | Actions |
|---|---|---|---|---|
No runs found | ||||
Run a comparison to see channel data here.
POST to /api/youtube/competitor with up to 5 channel URLs.
Returns a channels array — one entry per channel — with subscriber count,
total views, upload count, top viewed videos, latest uploads and oldest videos.
curl -X POST "/api/youtube/competitor" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://www.youtube.com/@MrBeast",
"https://www.youtube.com/@PewDiePie"
],
"max_videos": 20
}'
import requests
response = requests.post(
'/api/youtube/competitor',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={
'urls': [
'https://www.youtube.com/@MrBeast',
'https://www.youtube.com/@PewDiePie'
],
'max_videos': 20
}
)
data = response.json()
for ch in data['channels']:
print(ch['channel_name'], '—', ch['subscriber_count'], 'subs')
const axios = require('axios');
axios.post('/api/youtube/competitor', {
urls: [
'https://www.youtube.com/@MrBeast',
'https://www.youtube.com/@PewDiePie'
],
max_videos: 20
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => {
res.data.channels.forEach(ch =>
console.log(ch.channel_name, '—', ch.subscriber_count, 'subs')
);
});
{
"channels": [
{
"channel_url": "https://www.youtube.com/@MrBeast",
"channel_name": "MrBeast",
"channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"description": "...",
"subscriber_count": 250000000,
"view_count": 50000000000,
"video_count": 800,
"videos_fetched": 20,
"top_viewed": [
{
"title": "Video Title",
"url": "https://www.youtube.com/watch?v=...",
"views": 500000000,
"likes": 10000000,
"published": "2024-01-15",
"duration": "14:32",
"thumbnail": "https://i.ytimg.com/vi/.../maxresdefault.jpg"
}
],
"latest_videos": [ /* same shape as top_viewed */ ],
"oldest_videos": [ /* same shape as top_viewed */ ]
}
]
}
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
curl -X POST "/api/maps-reviews/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.google.com/maps/place/...",
"sort_by": "newest",
"min_rating": 1,
"max_reviews": 20
}'
import requests
response = requests.post(
'/api/maps-reviews/scrape',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={
'url': 'https://www.google.com/maps/place/...',
'sort_by': 'newest',
'min_rating': 1,
'max_reviews': 20
}
)
print(response.json())
const axios = require('axios');
axios.post('/api/maps-reviews/scrape', {
url: 'https://www.google.com/maps/place/...',
sort_by: 'newest',
min_rating: 1,
max_reviews: 20
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data));
| Status | Run ID | Results Found | Started At | Actions |
|---|---|---|---|---|
No runs found | ||||
Returns available video & audio format URLs — no file is downloaded server-side. Pass the returned url directly to your client or ffmpeg.
curl -X POST "/api/download/youtube" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}'
import requests
resp = requests.post(
'/api/download/youtube',
headers={'X-API-Key': ''},
json={'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'}
)
data = resp.json()
print(data['title'])
# data['formats'] → list of {format_id, ext, height, quality, url, ...}
# data['audio_url'] → best audio-only stream URL
const axios = require('axios');
const { data } = await axios.post(
'/api/download/youtube',
{ url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' },
{ headers: { 'X-API-Key': '' } }
);
console.log(data.title, data.formats);
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Supports Reels, Posts, and IGTV. Returns format URLs — pass them to your client or ffmpeg.
curl -X POST "/api/download/instagram" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{"url": "https://www.instagram.com/reel/ABC123/"}'
import requests
resp = requests.post(
'/api/download/instagram',
headers={'X-API-Key': ''},
json={'url': 'https://www.instagram.com/reel/ABC123/'}
)
data = resp.json()
print(data['title'], data['formats'])
const axios = require('axios');
const { data } = await axios.post(
'/api/download/instagram',
{ url: 'https://www.instagram.com/reel/ABC123/' },
{ headers: { 'X-API-Key': '' } }
);
console.log(data.title, data.formats);
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Supports TikTok video and slideshow URLs. Returns watermark-free format URLs where available.
curl -X POST "/api/download/tiktok" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{"url": "https://www.tiktok.com/@user/video/1234567890"}'
import requests
resp = requests.post(
'/api/download/tiktok',
headers={'X-API-Key': ''},
json={'url': 'https://www.tiktok.com/@user/video/1234567890'}
)
data = resp.json()
print(data['title'], data['formats'])
const axios = require('axios');
const { data } = await axios.post(
'/api/download/tiktok',
{ url: 'https://www.tiktok.com/@user/video/1234567890' },
{ headers: { 'X-API-Key': '' } }
);
console.log(data.title, data.formats);
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Supports public Facebook Watch videos, Reels, and fb.watch short links.
curl -X POST "/api/download/facebook" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{"url": "https://www.facebook.com/watch/?v=1234567890"}'
import requests
resp = requests.post(
'/api/download/facebook',
headers={'X-API-Key': ''},
json={'url': 'https://www.facebook.com/watch/?v=1234567890'}
)
data = resp.json()
print(data['title'], data['formats'])
const axios = require('axios');
const { data } = await axios.post(
'/api/download/facebook',
{ url: 'https://www.facebook.com/watch/?v=1234567890' },
{ headers: { 'X-API-Key': '' } }
);
console.log(data.title, data.formats);
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Supports Snapchat Spotlight and public Story video URLs.
curl -X POST "/api/download/snapchat" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{"url": "https://www.snapchat.com/spotlight/..."}'
import requests
resp = requests.post(
'/api/download/snapchat',
headers={'X-API-Key': ''},
json={'url': 'https://www.snapchat.com/spotlight/...'}
)
data = resp.json()
print(data['title'], data['formats'])
const axios = require('axios');
const { data } = await axios.post(
'/api/download/snapchat',
{ url: 'https://www.snapchat.com/spotlight/...' },
{ headers: { 'X-API-Key': '' } }
);
console.log(data.title, data.formats);
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
POST to /api/twitter/scrape. All filter fields are optional —
omit them to use defaults. Operator-based filters (lang,
date_from, date_until) are injected into the search
query string; numeric thresholds are applied server-side after collection.
curl -X POST "/api/twitter/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"mode": "search",
"queries": ["bitcoin etf"],
"max_tweets": 50,
"include_replies": false,
"include_retweets": true,
"has_media": false,
"sort_by": "likes",
"min_likes": 100,
"min_retweets": 10,
"min_views": 0,
"min_replies": 0,
"lang": "en",
"date_from": "2024-01-01",
"date_until": "2024-12-31"
}'
import requests
response = requests.post(
'/api/twitter/scrape',
headers={
'X-API-Key': '',
'Content-Type': 'application/json'
},
json={
'mode': 'search',
'queries': ['bitcoin etf'],
'max_tweets': 50,
'include_replies': False,
'include_retweets': True,
'has_media': False,
'sort_by': 'likes',
'min_likes': 100,
'min_retweets': 10,
'lang': 'en',
'date_from': '2024-01-01',
'date_until': '2024-12-31',
}
)
data = response.json()
print(f"Found {data['total']} tweets")
for t in data['items']:
print(t['author'], '—', t['likes'], 'likes —', t['text'][:80])
const axios = require('axios');
axios.post('/api/twitter/scrape', {
mode: 'search',
queries: ['bitcoin etf'],
max_tweets: 50,
include_replies: false,
include_retweets: true,
has_media: false,
sort_by: 'likes',
min_likes: 100,
min_retweets: 10,
lang: 'en',
date_from: '2024-01-01',
date_until: '2024-12-31',
}, {
headers: {
'X-API-Key': '',
'Content-Type': 'application/json'
}
}).then(res => {
console.log(`Found ${res.data.total} tweets`);
res.data.items.forEach(t =>
console.log(`@${t.author} | ❤️ ${t.likes} | 🔁 ${t.retweets} | ${t.text.slice(0,80)}`)
);
});
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
first.last@company.com) for each profile and validates each via MX records. Adds a few seconds per profile.
curl -X POST "/api/linkedin/search" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"slugs": ["williamhgates", "jeffweiner08"],
"query": "CTO fintech startup London",
"max_results": 50,
"do_email": false
}'
import requests
response = requests.post(
'/api/linkedin/search',
headers={'X-API-Key': ''},
json={
'slugs': ['williamhgates'],
'do_email': True,
'max_results': 25
}
)
print(response.json()['items'])
const axios = require('axios');
axios.post('/api/linkedin/search', {
slugs: ['williamhgates'],
query: 'CTO fintech London',
max_results: 50
}, {
headers: { 'X-API-Key': '' }
}).then(res => console.log(res.data.items));
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
curl -X POST "/api/email/verify" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"emails": ["hello@anthropic.com", "jane.doe@gmail.com"],
"do_smtp": true,
"concurrency": 4
}'
import requests
response = requests.post(
'/api/email/verify',
headers={'X-API-Key': ''},
json={
'emails': ['hello@anthropic.com', 'jane.doe@gmail.com'],
'do_smtp': True
}
)
data = response.json()
print(data['stats'])
for r in data['items']:
print(r['email'], '→', r['verdict'], '(score:', r['deliverable_score'], ')')
const axios = require('axios');
axios.post('/api/email/verify', {
emails: ['hello@anthropic.com', 'jane.doe@gmail.com'],
do_smtp: true
}, {
headers: { 'X-API-Key': '' }
}).then(res => console.log(res.data.stats));
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Run a check to see verdicts here.
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
curl -X POST "/api/reddit/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"keywords": ["bitcoin"],
"urls": [],
"search_posts": true,
"search_comments": false,
"search_communities": false,
"sort_by": "new",
"time_range": "all",
"max_posts": 25
}'
import requests
response = requests.post(
'/api/reddit/scrape',
headers={'X-API-Key': ''},
json={
'keywords': ['bitcoin'],
'search_posts': True,
'max_posts': 25,
'sort_by': 'new'
}
)
data = response.json()
print(f"Found {data['total']} results")
const axios = require('axios');
axios.post('/api/reddit/scrape', {
keywords: ['bitcoin'],
search_posts: true,
max_posts: 25,
sort_by: 'new'
}, {
headers: { 'X-API-Key': '' }
}).then(res => console.log(res.data));
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
curl -X POST "/api/tiktok/scrape" \
-H "X-API-Key: " \
-H "Content-Type: application/json" \
-d '{
"mode": "hashtag",
"hashtags": ["marketing"],
"max_videos": 20
}'
import requests
response = requests.post(
'/api/tiktok/scrape',
headers={'X-API-Key': ''},
json={
'mode': 'hashtag',
'hashtags': ['marketing'],
'max_videos': 20
}
)
data = response.json()
print(f"Found {data['total']} videos")
const axios = require('axios');
axios.post('/api/tiktok/scrape', {
mode: 'hashtag',
hashtags: ['marketing'],
max_videos: 20
}, {
headers: { 'X-API-Key': '' }
}).then(res => console.log(res.data));
| Status | Run ID | Records | Started At | Actions |
|---|---|---|---|---|
No runs found. | ||||
Display Name
Change Password
Account Info
| Subject | Status | Priority | Date |
|---|