# Bolt Scraper API & Developer Documentation
> Complete developer reference for Bolt Scraper REST APIs, Real-time Google Maps search, Website enrichment, Telegram Bot, Multi-Webhooks, and automation pipelines.
> Base URL: `https://boltscraper.com/api/v1`
> Web Portal: `https://app.boltscraper.com`
> Telegram Bot: `@boltcloudscraperbot`
---
## Architecture Overview
Bolt Scraper provides two distinct scraping architectures depending on your product latency and throughput requirements:
| Architecture | Best For | Typical Latency | Key Endpoints | Output Delivery |
| :--- | :--- | :--- | :--- | :--- |
| **Real-time Search API** | Live search bars, interactive SaaS widgets, chatbots, on-demand enrichment | Real-time Synchronous | `POST /v1/maps/search`
`POST /v1/reviews/search`
`POST /v1/website/scrape` | Synchronous JSON response body (zero polling required) |
| **Background Job API** | Bulk lead generation, scraping entire cities, bulk reviews crawls, scheduled batch workflows | Asynchronous Batch (Scales to 100k+ records) | `POST /v1/maps/jobs`
`POST /v1/reviews/jobs`
`POST /v1/website/jobs` | Automated Webhooks or downloadable CSV export links |
---
## Table of Contents
- [Authentication & API Keys](#authentication--api-keys)
- [Rate Limits & Error Handling](#rate-limits--error-handling)
- [Google Maps Scraper API](#google-maps-scraper-api)
- [Real-time Search API (`POST /v1/maps/search`)](#real-time-search-api-post-v1mapssearch)
- [Create Scrape Job (`POST /v1/maps/jobs`)](#create-scrape-job-post-v1mapsjobs)
- [List Recent Jobs (`GET /v1/maps/jobs`)](#list-recent-jobs-get-v1mapsjobs)
- [Get Job Status (`GET /v1/maps/jobs/:id`)](#get-job-status-get-v1mapsjobsid)
- [Download Gmap CSV (`GET /v1/maps/jobs/:id/download`)](#download-gmap-csv-get-v1mapsjobsiddownload)
- [Pause Scraping Job (`POST /v1/maps/jobs/:id/pause`)](#pause-scraping-job-post-v1mapsjobsidpause)
- [Resume Scraping Job (`POST /v1/maps/jobs/:id/resume`)](#resume-scraping-job-post-v1mapsjobsidresume)
- [Stop Scraping Job (`POST /v1/maps/jobs/:id/stop`)](#stop-scraping-job-post-v1mapsjobsidstop)
- [Google Maps Reviews Scraper API](#google-maps-reviews-scraper-api)
- [Real-time Reviews Search (`POST /v1/reviews/search`)](#real-time-reviews-search-post-v1reviewssearch)
- [Create Reviews Job (`POST /v1/reviews/jobs`)](#create-reviews-job-post-v1reviewsjobs)
- [List Recent Reviews Jobs (`GET /v1/reviews/jobs`)](#list-recent-reviews-jobs-get-v1reviewsjobs)
- [Get Reviews Job Status (`GET /v1/reviews/jobs/:id`)](#get-reviews-job-status-get-v1reviewsjobsid)
- [Get Paginated Reviews Data (`GET /v1/reviews/jobs/:id/reviews`)](#get-paginated-reviews-data-get-v1reviewsjobsidreviews)
- [Download Reviews CSV (`GET /v1/reviews/jobs/:id/download.csv`)](#download-reviews-csv-get-v1reviewsjobsiddownloadcsv)
- [Pause Reviews Job (`POST /v1/reviews/jobs/:id/pause`)](#pause-reviews-job-post-v1reviewsjobspause)
- [Resume Reviews Job (`POST /v1/reviews/jobs/:id/resume`)](#resume-reviews-job-post-v1reviewsjobsresume)
- [Stop Reviews Job (`POST /v1/reviews/jobs/:id/stop`)](#stop-reviews-job-post-v1reviewsjobsstop)
- [Website Scraper API](#website-scraper-api)
- [Real-time Website Scrape (`POST /v1/website/scrape`)](#real-time-website-scrape-post-v1websitescrape)
- [Create Website Job (`POST /v1/website/jobs`)](#create-website-job-post-v1websitejobs)
- [List Website Jobs (`GET /v1/website/jobs`)](#list-website-jobs-get-v1websitejobs)
- [Get Job Status (`GET /v1/website/jobs/:id`)](#get-job-status-get-v1websitejobsid)
- [Download Website CSV (`GET /v1/website/jobs/:id/download`)](#download-website-csv-get-v1websitejobsiddownload)
- [Stop Website Job (`POST /v1/website/jobs/:id/stop`)](#stop-website-job-post-v1websitejobsidstop)
- [Multi-Endpoint Webhooks](#multi-endpoint-webhooks)
- [Webhook Management Endpoints](#webhook-management-endpoints)
- [HMAC SHA-256 Signature Verification](#hmac-sha-256-signature-verification)
- [Google Maps Webhook Payloads](#google-maps-webhook-payloads)
- [Website Scraper Webhook Payloads](#website-scraper-webhook-payloads)
- [Automation Integrations (Make.com, n8n, Zapier)](#automation-integrations-makecom-n8n-zapier)
- [Telegram Cloud Scraper Bot](#telegram-cloud-scraper-bot)
---
## Authentication & API Keys
All requests require authentication via an API key prefixed with `bs_`. API keys can be managed in the dashboard at **Dashboard → Integrations → API Keys**.
### Request Headers
Pass the key using either standard Bearer token header (recommended) or `X-API-Key`:
```http
Authorization: Bearer bs_YOUR_API_KEY
```
or
```http
X-API-Key: bs_YOUR_API_KEY
Content-Type: application/json
```
### Plan Quotas & Deductions
- API access is enabled across all plans (including Free tiers).
- **Google Maps API**: Draws directly from your monthly lead quota (Free 1k, Basic 50k, Professional 200k, Business 600k, Advanced 1.5M).
- **Google Maps Reviews API**: Draws directly from your monthly review quota (1 credit per extracted review). Plan limits per target: Free 50, Basic 500, Professional+ unlimited extraction.
- **Website Scraper API**: Draws directly from your monthly website crawl quota (Free 1k, Starter 100k, Pro 250k, Elite 1M).
- **Zero Charge on Upstream Failure**: Unreachable domains, DNS failures, or 502 errors deduct 0 credits (any reserved credit is automatically refunded).
---
## Rate Limits & Error Handling
- **Rate Limit**: **60 requests per minute** per API key.
- **Rate Limit Headers Delivered**:
- `X-RateLimit-Limit`: `60`
- `X-RateLimit-Remaining`: Requests left in the current minute.
- `X-RateLimit-Reset`: Seconds remaining until reset.
### Standard HTTP Status Codes
| Status Code | Meaning | Description | Credits Deducted |
| :--- | :--- | :--- | :--- |
| `200 OK` | Success | Request succeeded and data is returned. | Normal Usage |
| `400 Bad Request` | Validation Error | Missing required query parameters or malformed JSON payload. | 0 Credits |
| `401 Unauthorized` | Authentication Failed | Missing, invalid, or expired API key. | 0 Credits |
| `403 Forbidden` | Quota Exceeded | Monthly lead or crawl credits exhausted. Upgrade required. | 0 Credits |
| `404 Not Found` | Resource Not Found | Target Job ID does not exist or has expired. | 0 Credits |
| `429 Too Many Requests` | Rate Limit Exceeded | Exceeded 60 requests/min. Inspect `Retry-After` header. | 0 Credits |
| `502 Bad Gateway` | Target / Upstream Error | Upstream Google Maps or target website unreachable. Automatic refund. | **0 Credits (Refunded)** |
---
## Google Maps Scraper API
### Real-time Search API (`POST /v1/maps/search`)
Synchronously executes a live query against Google Maps using residential proxies and returns structured business listings directly in the HTTP response. Zero polling or webhook setup required.
- **Method**: `POST`
- **Path**: `/api/v1/maps/search`
- **Headers**:
- `Authorization: Bearer bs_YOUR_API_KEY`
- `Content-Type: application/json`
#### Request Body Parameters
| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `keyword` | `string` | **Yes** | — | Search query (e.g. `"Coffee shops in Seattle"`, `"Commercial roofing in Dallas, TX"`). |
| `page` | `integer` | No | `1` | Page number to scrape (1 to 15, returning ~20 places per page). |
| `hl` | `string` | No | `"en"` | Two-letter interface language code (e.g. `"en"`, `"es"`, `"de"`, `"fr"`, `"ja"`, `"hi"`). |
#### Example Request (cURL)
```bash
curl -X POST "https://boltscraper.com/api/v1/maps/search" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"keyword": "Coffee shops in Seattle",
"page": 1,
"hl": "en"
}'
```
#### Example Request (Python)
```python
import requests
url = "https://boltscraper.com/api/v1/maps/search"
headers = {
"Authorization": "Bearer bs_YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"keyword": "Coffee shops in Seattle",
"page": 1,
"hl": "en"
}
res = requests.post(url, headers=headers, json=payload)
data = res.json()
print(f"Retrieved {data['total_results']} places:")
for place in data.get("data", []):
print(f"- {place.get('Name')}: {place.get('Phone')} | {place.get('Website')}")
```
#### Example Request (JavaScript / Node.js)
```javascript
const res = await fetch('https://boltscraper.com/api/v1/maps/search', {
method: 'POST',
headers: {
'Authorization': 'Bearer bs_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
keyword: 'Coffee shops in Seattle',
page: 1,
hl: 'en'
})
});
const { data, total_results } = await res.json();
console.log(`Found ${total_results} results:`, data);
```
#### Example Response (`200 OK`)
```json
{
"success": true,
"status": "success",
"request": {
"keyword": "Coffee shops in Seattle",
"page": 1,
"hl": "en"
},
"pagination": {
"page": 1,
"results_returned": 20,
"total_results": 20,
"has_next_page": true
},
"data": [
{
"Keyword": "Coffee shops in Seattle",
"Name": "Storyville Coffee Pike Place",
"Full Address": "94 Pike St Top floor Seattle WA 98101",
"Street Address": "94 Pike St Top floor",
"Neighborhood": "Pike Place Market",
"City": "Seattle",
"Zip": "98101",
"Municipality": "Seattle",
"State": "WA",
"Country": "US",
"Phone": "(206) 780-5777",
"Phone Type": "Landline",
"Is Mobile": "No",
"Phone Country": "US",
"International Phone": "+1 206-780-5777",
"Phone URI": "tel:+12067805777",
"Website": "https://storyville.com",
"Clean Website URL": "https://storyville.com",
"Domain": "storyville.com",
"Category": "Coffee shop",
"Second Category": "Bakery",
"All Categories": "Coffee shop | Bakery | Espresso bar",
"Google Category IDs": "coffee_shop | bakery | espresso_bar",
"Claimed": "Yes",
"Average Rating": 4.6,
"Review URL": "https://search.google.com/local/reviews?placeid=ChIJbT0mY5JqkFQRzVq7g",
"Business Status": "OPERATIONAL",
"Open Now": "Yes",
"Hours": "Mon-Sun 7:00 AM - 6:00 PM",
"Latitude": 47.6089,
"Longitude": -122.3409,
"Coordinates": "47.6089,-122.3409",
"Timezone": "America/Los_Angeles",
"Place ID": "ChIJbT0mY5JqkFQRzVq7g",
"GMB URL": "https://www.google.com/maps/place/?q=place_id:ChIJbT0mY5JqkFQRzVq7g",
"CID": "13697921983050183301",
"Logo URL": "https://lh3.googleusercontent.com/p/example_logo=s1600",
"Main Photo URL": "https://lh5.googleusercontent.com/p/example_photo=s1600",
"Favicon URL": "https://t1.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://storyville.com&size=48",
"Review Count": 1420
}
]
}
```
---
### Create Scrape Job (`POST /v1/maps/jobs`)
Creates an asynchronous background scraping job. Used for high-volume extractions across multiple keywords or full cities.
- **Method**: `POST`
- **Path**: `/api/v1/maps/jobs`
#### Request Body Parameters
| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `keywords` | `array \| string` | **Yes** | — | Single keyword or array of keywords. |
| `title` | `string` | No | Auto (e.g. 'Roofers in Austin, TX + 3') | Optional custom job name. If omitted, automatically generated from keywords. |
| `scrape_websites` | `boolean` | No | `false` | Crawl discovered websites for emails, direct phones, and social links. |
| `ultra_mode` | `boolean` | No | `false` | Multi-point grid scanning to extract up to 3x more listings in dense cities. |
| `max_results` | `integer` | No | `None (All)` | Optional maximum listings target per keyword (e.g. 10, 30, 50). If omitted, extracts all available listings. |
| `max_total_leads` | `integer` | No | `None (All)` | Target lead limit across the entire job (e.g. 500, 2000). Finishes the active keyword before stopping without cutting off. |
| `webhook_url` | `string` | No | `null` | Optional completion webhook for this specific job. |
#### Example Request (Python)
```python
import requests
url = "https://boltscraper.com/api/v1/maps/jobs"
headers = {"Authorization": "Bearer bs_YOUR_API_KEY", "Content-Type": "application/json"}
payload = {
"keywords": [
"Commercial roofing in Austin, TX",
"Commercial roofing in Dallas, TX"
],
"scrape_websites": True,
"ultra_mode": True
}
res = requests.post(url, headers=headers, json=payload)
print("Launched Job ID:", res.json()["job_id"])
```
#### Example Response (`200 OK`)
```json
{
"success": true,
"job_id": "map_demo_123",
"title": "Commercial roofing in Austin, TX",
"status": "RUNNING",
"keywords_count": 2,
"scrape_websites": true,
"ultra_mode": true,
"created_at": "2026-09-20T10:00:00Z"
}
```
---
### List Recent Jobs (`GET /v1/maps/jobs`)
Retrieve a paginated list of your recent scraping jobs.
- **Method**: `GET`
- **Path**: `/api/v1/maps/jobs?limit=50`
#### Query Parameters
- `limit` (optional, default `50`, max `50`): Number of jobs to return.
#### Example Response (`200 OK`)
```json
{
"jobs": [
{
"id": "map_demo_123",
"title": "Commercial roofing in Austin, TX",
"status": "COMPLETED",
"leads_count": 284,
"keywords_count": 2,
"scrape_websites": true,
"ultra_mode": true,
"created_at": "2026-09-20T10:00:00Z",
"completed_at": "2026-09-20T10:05:22Z"
}
]
}
```
---
### Get Job Status (`GET /v1/maps/jobs/:id`)
Poll real-time status and progress counts for a specific job.
- **Method**: `GET`
- **Path**: `/api/v1/maps/jobs/:id`
#### Path Parameter
- `id` (required): Unique job ID (e.g. `map_demo_123`).
#### Example Response (`200 OK`)
```json
{
"job": {
"id": "map_demo_123",
"title": "Commercial roofing in Austin, TX",
"status": "RUNNING",
"leads_count": 142,
"keywords_count": 2,
"scrape_websites": true,
"ultra_mode": true,
"created_at": "2026-09-20T10:00:00Z",
"completed_at": null
}
}
```
---
### Download Gmap CSV (`GET /v1/maps/jobs/:id/download`)
Directly download the complete CSV export containing all 60+ enriched columns.
- **Method**: `GET`
- **Path**: `/api/v1/maps/jobs/:id/download`
- **Query Parameters**:
- `token` (optional): Signed download token (allows direct download via browser without `Authorization` header).
```bash
curl -X GET "https://boltscraper.com/api/v1/maps/jobs/map_demo_123/download" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-o "export_map_demo_123.csv"
```
---
### Pause Scraping Job (`POST /v1/maps/jobs/:id/pause`)
Temporarily pause an active scraping job. Current batches finish and partial leads remain saved.
- **Method**: `POST`
- **Path**: `/api/v1/maps/jobs/:id/pause`
```bash
curl -X POST "https://boltscraper.com/api/v1/maps/jobs/map_demo_123/pause" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Resume Scraping Job (`POST /v1/maps/jobs/:id/resume`)
Resume a paused scraping job from where it left off.
- **Method**: `POST`
- **Path**: `/api/v1/maps/jobs/:id/resume`
```bash
curl -X POST "https://boltscraper.com/api/v1/maps/jobs/map_demo_123/resume" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Stop Scraping Job (`POST /v1/maps/jobs/:id/stop`)
Halt an active scraping job. All leads collected up to that moment are finalized and compiled into your downloadable CSV dataset.
- **Method**: `POST`
- **Path**: `/api/v1/maps/jobs/:id/stop`
```bash
curl -X POST "https://boltscraper.com/api/v1/maps/jobs/map_demo_123/stop" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
## Google Maps Reviews Scraper API
### Real-time Reviews Search (`POST /v1/reviews/search`)
Synchronously extracts customer reviews and place metadata from a Google Maps listing without polling or delay. Each request fetches 1 page (10 reviews). Returns structured reviewer information, review ratings, timestamps, review text, photos, and owner replies directly in the HTTP response. Use `next_page_token` to fetch subsequent pages, or use the Asynchronous Reviews Jobs API for bulk extractions.
- **Method**: `POST`
- **Path**: `/api/v1/reviews/search`
- **Headers**:
- `Authorization: Bearer bs_YOUR_API_KEY`
- `Content-Type: application/json`
#### Request Body Parameters
| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `query` | `string` | **Yes** | — | Google Maps Place URL, Place ID, or Business Name (e.g. `https://maps.app.goo.gl/...`, `https://www.google.com/maps/place/...`, or `ChIJ...`). Direct URL or Place ID recommended for exact matches. |
| `sort_by` | `string` | No | `"newest"` | Sort order: `"newest"` (default), `"most_relevant"`, `"highest_rating"`, `"lowest_rating"`. |
| `language` | `string` | No | `"en"` | Two-letter language code for reviews and place details (e.g. `"en"`, `"es"`, `"de"`, `"fr"`). |
| `next_page_token` | `string` | No | `null` | Continuation cursor token returned from previous response to fetch the subsequent page (10 reviews). |
#### Example Request (cURL)
```bash
curl -X POST "https://boltscraper.com/api/v1/reviews/search" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "https://maps.google.com/?cid=102381283912",
"sort_by": "newest",
"language": "en"
}'
```
#### Example Request (Python)
```python
import requests
url = "https://boltscraper.com/api/v1/reviews/search"
headers = {
"Authorization": "Bearer bs_YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"query": "https://maps.google.com/?cid=102381283912",
"sort_by": "newest",
"language": "en"
}
res = requests.post(url, headers=headers, json=payload)
data = res.json()
print(f"Place: {data['place']['name']} - Scraped: {data['total_scraped']} reviews")
for r in data.get("data", []):
print(f"[{r['stars']}★] {r['reviewer']['name']}: {r['review_text'][:80]}...")
```
#### Example Response (`200 OK`)
```json
{
"status": "success",
"place": {
"name": "Priority Roofing Austin",
"place_id": "ChIJbT0mY5JqkFQRzVq7g",
"feature_id": "0x8644b59263263d6d:0x874b4344e156ca3",
"rating": 4.9,
"total_reviews_google": 342,
"address": "1204 W 34th St, Austin, TX 78705",
"website": "https://priorityroofing.com",
"phone": "+1 512-555-0199"
},
"query": "https://maps.google.com/?cid=102381283912",
"sort_by": "newest",
"total_scraped": 10,
"pages_fetched": 1,
"has_next_page": true,
"next_page_token": "CAESBkVxdFhPQWRnWWw0bFhVQlF...",
"data": [
{
"review_id": "ChZDSUhNMG9nS0VJQ0FnSUN6MjhpdE1REAE",
"stars": 5,
"review_text": "Outstanding service! They replaced our entire roof in two days.",
"review_date_relative": "2 days ago",
"review_date_utc": "2026-09-26T14:22:00Z",
"review_timestamp": 1790432520000,
"likes_count": 3,
"review_url": "https://www.google.com/maps/reviews/data=!4m8!14m7...",
"reviewer": {
"name": "Sarah Jenkins",
"avatar_url": "https://lh3.googleusercontent.com/a-/ALV-Uj...",
"profile_url": "https://www.google.com/maps/contrib/10982312...",
"is_local_guide": true,
"local_guide_level": 6,
"total_reviews": 48,
"total_photos": 124
},
"owner_response": {
"has_response": true,
"date_relative": "1 day ago",
"text": "Thank you so much Sarah! It was our pleasure to take care of your home."
}
}
]
}
```
---
### Create Reviews Job (`POST /v1/reviews/jobs`)
Initializes an asynchronous background task to scrape up to 25,000+ reviews across single or multiple Google Maps locations simultaneously. Supports pause, resume, auto Google Drive synchronization, and downloadable CSV exports.
- **Method**: `POST`
- **Path**: `/api/v1/reviews/jobs`
- **Headers**:
- `Authorization: Bearer bs_YOUR_API_KEY`
- `Content-Type: application/json`
#### Request Body Parameters
| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `queries` | `array \| string` | **Yes** | — | Array of Google Maps Place URLs or Place IDs (e.g. `["ChIJbT0mY5JqkFQRzVq7g", "https://maps.google.com/?cid=..."]`). Also accepts `urls`, `place_ids`, or single `query`. |
| `max_reviews` | `integer` | No | `null` | Maximum reviews to extract per location (Free: max 50, Basic: max 500, Professional+: unlimited extraction). Pass `null` or omit for unlimited reviews up to plan quota. |
| `sort_by` | `string` | No | `"newest"` | Sort criteria: `"newest"` (default), `"most_relevant"`, `"highest_rating"`, `"lowest_rating"`. |
| `cutoff_date` | `string` | No | `null` | Optional relative date cutoff filter: `'7 days'`, `'30 days'`, `'90 days'`, `'6 months'`, `'1 year'`, `'2 years'`. Only reviews newer than this period are extracted. |
| `language` | `string` | No | `"en"` | Two-letter language code (`"en"`, `"es"`, `"fr"`, `"de"`). |
| `title` | `string` | No | Auto | Custom title for the reviews scraping job. |
#### Example Request (cURL)
```bash
curl -X POST "https://boltscraper.com/api/v1/reviews/jobs" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"queries": [
"https://maps.google.com/?cid=102381283912",
"ChIJbT0mY5JqkFQRzVq7g"
],
"max_reviews": 500,
"sort_by": "newest"
}'
```
#### Example Response (`201 Created`)
```json
{
"status": "success",
"message": "Reviews scraping task started successfully (2 targets)",
"total_created": 1,
"total_targets": 2,
"batch_id": "revjob_4b1e82",
"job_id": "revjob_4b1e82",
"job": {
"id": "revjob_4b1e82",
"title": "Priority Roofing Austin + 1 target",
"query": "[\"https://maps.google.com/?cid=102381283912\",\"ChIJbT0mY5JqkFQRzVq7g\"]",
"status": "SCRAPING",
"max_reviews": 500,
"sort_by": "newest",
"reviews_count": 0,
"created_at": "2026-09-28T15:20:00.000Z"
}
}
```
---
### List Recent Reviews Jobs (`GET /v1/reviews/jobs`)
Retrieve a paginated list of your recent reviews scraping jobs.
- **Method**: `GET`
- **Path**: `/api/v1/reviews/jobs`
- **Query Parameters**:
- `limit`: `integer` (Default: `50`, Max: `100`)
```bash
curl -X GET "https://boltscraper.com/api/v1/reviews/jobs?limit=20" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Get Reviews Job Status (`GET /v1/reviews/jobs/:id`)
Retrieve current execution status, targets count, and progress counters for a reviews scraping job.
- **Method**: `GET`
- **Path**: `/api/v1/reviews/jobs/:id`
```bash
curl -X GET "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
#### Example Response (`200 OK`)
```json
{
"status": "success",
"job": {
"id": "revjob_4b1e82",
"title": "Priority Roofing Austin",
"query": "https://maps.google.com/?cid=102381283912",
"place_name": "Priority Roofing Austin",
"place_address": "1204 W 34th St, Austin, TX 78705",
"place_rating": 4.9,
"status": "COMPLETED",
"sort_by": "newest",
"reviews_count": 342,
"max_reviews": 500,
"created_at": "2026-09-28T15:20:00.000Z",
"completed_at": "2026-09-28T15:22:10.000Z"
}
}
```
---
### Get Paginated Reviews Data (`GET /v1/reviews/jobs/:id/reviews`)
Fetch extracted reviews from a completed or running job with pagination.
- **Method**: `GET`
- **Path**: `/api/v1/reviews/jobs/:id/reviews`
- **Query Parameters**:
- `limit`: `integer` (Default: `50`, Max: `1000`)
- `offset`: `integer` (Default: `0`)
```bash
curl -X GET "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82/reviews?limit=50&offset=0" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Download Reviews CSV (`GET /v1/reviews/jobs/:id/download.csv`)
Download all harvested customer reviews and location metadata as a formatted UTF-8 CSV spreadsheet.
- **Method**: `GET`
- **Path**: `/api/v1/reviews/jobs/:id/download.csv`
```bash
curl -X GET "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82/download.csv" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
--output google_reviews_export.csv
```
---
### Pause Reviews Job (`POST /v1/reviews/jobs/:id/pause`)
Temporarily pause an actively crawling reviews scraping task without losing progress.
- **Method**: `POST`
- **Path**: `/api/v1/reviews/jobs/:id/pause`
```bash
curl -X POST "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82/pause" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Resume Reviews Job (`POST /v1/reviews/jobs/:id/resume`)
Resume a paused reviews scraping job from its exact pagination checkpoint.
- **Method**: `POST`
- **Path**: `/api/v1/reviews/jobs/:id/resume`
```bash
curl -X POST "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82/resume" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
### Stop Reviews Job (`POST /v1/reviews/jobs/:id/stop`)
Permanently stop a reviews scraping task and finalize all harvested reviews.
- **Method**: `POST`
- **Path**: `/api/v1/reviews/jobs/:id/stop`
```bash
curl -X POST "https://boltscraper.com/api/v1/reviews/jobs/revjob_4b1e82/stop" \
-H "Authorization: Bearer bs_YOUR_API_KEY"
```
---
## Website Scraper API
### Real-time Website Scrape (`POST /v1/website/scrape`)
Synchronously crawls a target website directly and extracts business emails, phone numbers, social links, and metadata without queuing or polling.
- **Method**: `POST`
- **Path**: `/api/v1/website/scrape`
- **Headers**:
- `Authorization: Bearer bs_YOUR_API_KEY`
- `Content-Type: application/json`
#### Request Body Parameters
| Parameter | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| `url` | `string` | **Yes** | Website domain or URL to crawl (e.g. `"stripe.com"` or `"https://example.com"`). |
#### Example Request (Python)
```python
import requests
url = "https://boltscraper.com/api/v1/website/scrape"
headers = {"Authorization": "Bearer bs_YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"url": "https://example.com"}
res = requests.post(url, headers=headers, json=payload)
data = res.json()
if res.status_code == 200:
print("Company:", data["data"]["title"])
print("Emails:", data["data"]["emails"])
print("Phones:", data["data"]["phones"])
print("Socials:", data["data"]["social_links"])
elif res.status_code == 502:
print("Website unreachable (0 credits deducted)")
```
#### Example Response (`200 OK`)
```json
{
"success": true,
"status": "success",
"request": {
"url": "https://example.com",
"domain": "example.com"
},
"data": {
"url": "https://example.com",
"domain": "example.com",
"title": "Example Company | Cloud Software",
"meta_description": "Enterprise cloud solutions.",
"favicon": "https://example.com/favicon.ico",
"emails": [
"contact@example.com",
"sales@example.com"
],
"phones": [
"+1 555-0199"
],
"has_email": true,
"has_phone": true,
"social_links": {
"linkedin": "https://linkedin.com/company/example",
"twitter": "https://x.com/example",
"facebook": "https://facebook.com/example",
"instagram": "https://instagram.com/example",
"youtube": "https://youtube.com/@example",
"github": "https://github.com/example"
},
"pages": {
"contact": "https://example.com/contact",
"about": "https://example.com/about",
"team": "https://example.com/team"
}
}
}
```
---
### Create Website Job (`POST /v1/website/jobs`)
Submit batch domain URLs to extract business contacts asynchronously.
- **Method**: `POST`
- **Path**: `/api/v1/website/jobs`
#### Request Body Parameters
| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `urls` | `array \| string` | **Yes** | — | Array of domain URLs to crawl. |
| `webhook_url` | `string` | No | — | Optional webhook URL to receive job completion callback. |
#### Example Request (cURL)
```bash
curl -X POST "https://boltscraper.com/api/v1/website/jobs" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://acme.org", "https://globex.com"],
"webhook_url": "https://webhook.site/YOUR_WEBHOOK_UUID"
}'
```
---
### List Website Jobs (`GET /v1/website/jobs`)
List recent website extraction tasks and status.
- **Method**: `GET`
- **Path**: `/api/v1/website/jobs?limit=100&include_deleted=false`
---
### Get Job Status (`GET /v1/website/jobs/:id`)
Check live crawl progress, processed count, failed count, and completion status.
- **Method**: `GET`
- **Path**: `/api/v1/website/jobs/:id`
---
### Download Website CSV (`GET /v1/website/jobs/:id/download`)
Download the complete CSV export of extracted website contacts.
- **Method**: `GET`
- **Path**: `/api/v1/website/jobs/:id/download`
```bash
curl -X GET "https://boltscraper.com/api/v1/website/jobs/web_demo_123/download" \
-H "Authorization: Bearer bs_YOUR_API_KEY" \
-o "website_leads.csv"
```
---
### Stop Website Job (`POST /v1/website/jobs/:id/stop`)
Halt an active website crawl. Unprocessed URL credits are immediately refunded back to your account.
- **Method**: `POST`
- **Path**: `/api/v1/website/jobs/:id/stop`
---
## Multi-Endpoint Webhooks
Bolt Scraper supports registering up to **5 concurrent webhook endpoints**. Webhooks deliver immediate JSON notifications when scraping tasks finish or change state.
### Webhook Management Endpoints
| Method | Path | Description |
| :--- | :--- | :--- |
| `GET` | `/v1/webhooks` | List all registered webhook endpoints. |
| `POST` | `/v1/webhooks` | Register a new webhook endpoint (`name`, `webhook_url`, `secret`, `platform`). |
| `PUT` | `/v1/webhooks/:id` | Update endpoint URL, secret, platform filter, or active status. |
| `DELETE` | `/v1/webhooks/:id` | Remove a webhook endpoint. |
---
### HMAC SHA-256 Signature Verification
If a `secret` is configured, Bolt Scraper attaches an HMAC SHA-256 signature to the `X-Bolt-Signature` HTTP header in the format `sha256=`.
#### Verification (Node.js)
```javascript
import crypto from 'crypto';
export function verifyBoltWebhook(rawBodyBuffer, signatureHeader, secret) {
if (!signatureHeader || !signatureHeader.startsWith('sha256=')) return false;
const signature = signatureHeader.slice(7);
const hmac = crypto.createHmac('sha256', secret);
hmac.update(rawBodyBuffer);
const expected = hmac.digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'));
}
```
#### Verification (Python)
```python
import hmac
import hashlib
def verify_bolt_webhook(raw_body: bytes, signature_header: str, secret: str) -> bool:
if not signature_header or not signature_header.startswith("sha256="):
return False
signature = signature_header.split("sha256=")[1]
computed = hmac.new(secret.encode("utf-8"), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(signature, computed)
```
---
### Google Maps Webhook Payloads
#### Supported Events
- `gmap_job.completed`: Scraping completed successfully for all keywords.
- `gmap_job.paused`: Scraping paused due to credit limit (`pause_reason: "CREDIT_LIMIT"`) or user action (`pause_reason: "USER_ACTION"`).
- `gmap_job.stopped`: Scrape job was stopped/cancelled by user. Partial results finalized.
#### Headers Delivered
- `Content-Type: application/json`
- `User-Agent: BoltScraper-Webhook-Delivery/1.0`
- `X-Bolt-Event: gmap_job.completed`
- `X-Bolt-Signature: sha256=`
#### Payload Schema Example (`gmap_job.completed`)
```json
{
"event": "gmap_job.completed",
"job_id": "job_demo_123",
"title": "Denver Solar Contractors",
"status": "COMPLETED",
"total_leads": 500,
"leads_in_payload": 100,
"is_truncated": true,
"keywords_count": 1,
"scrape_websites": true,
"ultra_mode": true,
"completed_at": "2026-09-18T10:04:12.000Z",
"download_csv_url": "https://boltscraper.com/api/v1/maps/jobs/job_demo_123/download?token=SIGNED_DOWNLOAD_TOKEN",
"leads": [
{
"Keyword": "Denver Solar Contractors",
"place_id": "ChIJ_example_place_id_123",
"title": "Example Solar Company",
"category": "Solar Energy Contractor",
"phone": "+1 555-0100",
"website": "https://example.com",
"email": "contact@example.com",
"instagram": "https://instagram.com/example",
"facebook": "https://facebook.com/example",
"linkedin": "https://linkedin.com/company/example",
"address": "123 Example Street, Denver, CO 80202",
"rating": 4.9,
"reviews_count": 182,
"business_status": "OPERATIONAL",
"claimed": true
}
]
}
```
---
### Website Scraper Webhook Payloads
#### Supported Events
- `website_job.completed`: Crawl and extraction finished for all submitted URLs.
- `website_job.stopped`: Crawl was stopped/cancelled by user. Partial results finalized.
#### Payload Schema Example (`website_job.completed`)
```json
{
"event": "website_job.completed",
"job_id": "web_demo_123",
"status": "COMPLETED",
"job_name": "SaaS Contact Enrichment",
"platform": "website",
"total_urls": 100,
"processed_count": 100,
"success_count": 98,
"failed_count": 2,
"is_truncated": false,
"results_in_payload": 100,
"download_csv_url": "https://boltscraper.com/api/v1/website/jobs/web_demo_123/download?token=SIGNED_DOWNLOAD_TOKEN",
"completed_at": "2026-09-18T10:17:30.000Z",
"results": [
{
"url": "https://example.com",
"status": "success",
"emails": ["support@example.com", "hello@example.com"],
"phones": ["+1 555-0100"],
"social_links": {
"linkedin": "https://linkedin.com/company/example",
"twitter": "https://x.com/example",
"facebook": "https://facebook.com/example",
"instagram": "https://instagram.com/example",
"youtube": "https://youtube.com/@example",
"github": "https://github.com/example"
},
"title": "Example Company",
"description": "Example company description."
}
]
}
```
---
### Automation Integrations (Make.com, n8n, Zapier)
1. **Make.com**: Create a scenario with a **Custom Webhook** module. Paste your webhook URL into Bolt Scraper dashboard. Use the **Iterator** module over the `leads[]` array to insert contacts into Google Sheets, Airtable, or HubSpot.
2. **n8n**: Add a **Webhook node** (`POST`). Use a **Split Out node** on `leads` to iterate each record.
3. **Zapier**: Create a Zap with **Webhooks by Zapier → Catch Hook**, copy the hook URL into Bolt Scraper, and route leads into Salesforce, Pipedrive, or Mailchimp.
---
## Telegram Cloud Scraper Bot
Manage scraping jobs 24/7 directly via Telegram:
- **Bot Handle**: `@boltcloudscraperbot`
- **Link Account**: Pair your chat via **Dashboard → Integrations → Connect Telegram Bot**.
### Bot Commands
- `/scrape `: Launch scrape jobs (supports multi-line or semicolon-delimited lists).
- `/status`: Interactive dashboard to view running jobs with pause, resume, stop, and CSV export buttons.
- `/balance`: Check active plan, leads used, and remaining quota.
- `/export `: Delivers completed `.csv` file directly into your Telegram chat.
- **Bulk Keyword File Upload**: Send a `.txt` or `.csv` file directly into Telegram; the bot automatically parses up to 5,000 keywords and initiates the cloud scrape.