# Benable Intel API: LLM Reference

This document is generated from the same OpenAPI contract as the interactive docs.
Canonical base URL: `https://scraper.benable.com`
OpenAPI JSON: `https://scraper.benable.com/openapi.json`
Documented operations: **108**

Production API for Benable. Workflow APIs provide higher-order actions; provider APIs return direct provider data; /v1/agent/prompt runs the configured Benable agent.

## Calling conventions

- Send `Authorization: Bearer YOUR_TOKEN` on every `/v1/` request.
- Send request parameters as one JSON object for POST operations.
- Send `Content-Type: application/json` and prefer `Accept: application/json`.
- Provider endpoints omit cost by default. Append `?cost=true` to include a top-level numeric `cost` in USD.
- Provider credit fields such as `credits` and `creditsUsed` are never returned.
- `X-Benable-Source` is an optional caller-attribution header. The JSON `source` field takes precedence when both are supplied.
- Do not send undocumented fields. Request schemas reject additional properties.
- Response examples are illustrative and abbreviated. Raw-provider operations pass provider fields through and may return additional keys.
- A standard API error has the shape shown below.

```json
{
  "error": {
    "code": "invalid_request",
    "message": "Human-readable error message.",
    "details": {}
  }
}
```

## Endpoint index

| Method | Path | Category | Provider source | Purpose |
|---|---|---|---|---|
| POST | `/v1/workflows/brand-portal/manual-post` | Workflow APIs | Internal · Benable workflow service | Add Brand Portal manual post |
| POST | `/v1/workflows/brand-portal/discovery-targets` | Workflow APIs | Internal · Benable workflow service | Create or update discovery target |
| POST | `/v1/workflows/brand-portal/discovery-targets/disable` | Workflow APIs | Internal · Benable workflow service | Disable discovery target |
| POST | `/v1/workflows/creator-profiles/refreshes` | Workflow APIs | Internal · Benable workflow service | Queue creator profile refresh |
| POST | `/v1/workflows/company-infos/manual-scrape-requests` | Workflow APIs | Internal · Benable workflow service | Queue company info refresh |
| POST | `/v1/workflows/company-infos/manual-contact-enrichment-requests` | Workflow APIs | Internal · Benable workflow service | Queue contact enrichment |
| POST | `/v1/agent/prompt` | Agent | Internal · Benable agent runtime | Agent Zero prompt |
| GET | `/v1/agent/status` | Agent | Internal · Benable agent runtime | Agent runtime status |
| POST | `/v1/facebook/page/details` | Facebook | Direct · Facebook | Facebook page details |
| POST | `/v1/facebook/page/reviews` | Facebook | Direct · Facebook | Facebook page reviews |
| POST | `/v1/facebook/search/posts` | Facebook | Direct · Facebook | Facebook post search |
| POST | `/v1/instagram/user/by_id` | Instagram | Direct · Instagram | Instagram user by ID |
| POST | `/v1/instagram/user/by_username` | Instagram | Direct · Instagram | Instagram user by username |
| POST | `/v1/instagram/medias/by_user_id` | Instagram | Direct · Instagram | Instagram media by user ID |
| POST | `/v1/instagram/medias/tagged_by_user_id` | Instagram | Direct · Instagram | Instagram tagged media by user ID |
| POST | `/v1/instagram/tagged` | Instagram | Direct · Instagram | Instagram tagged media |
| POST | `/v1/instagram/reels/by_user_id` | Instagram | Direct · Instagram | Instagram reels by user ID |
| POST | `/v1/instagram/media/by_shortcode` | Instagram | Direct · Instagram | Instagram media by shortcode |
| POST | `/v1/instagram/media/by_url` | Instagram | Direct · Instagram | Instagram media by URL |
| POST | `/v1/instagram/highlight/by_url` | Instagram | Direct · Instagram | Instagram highlight by URL |
| POST | `/v1/instagram/stories/by_username` | Instagram | RapidAPI · Instagram Social API | Instagram active stories by username |
| POST | `/v1/instagram/comments` | Instagram | RapidAPI · Instagram Social API | Instagram comments |
| POST | `/v1/instagram/comments/replies` | Instagram | RapidAPI · Instagram Social API | Instagram comment replies |
| POST | `/v1/instagram/followers` | Instagram | RapidAPI · Instagram Social API | Instagram followers |
| POST | `/v1/instagram/search_followers` | Instagram | RapidAPI · RocketAPI for Developers | Search Instagram followers |
| POST | `/v1/instagram/search_following` | Instagram | RapidAPI · RocketAPI for Developers | Search Instagram following |
| POST | `/v1/instagram/search/posts` | Instagram | RapidAPI · Instagram Social API | Instagram post search |
| POST | `/v1/instagram/search/global` | Instagram | Direct · Instagram | Instagram global search |
| POST | `/v1/instagram/comments/media_comments_by_id` | Instagram | RapidAPI · Instagram Social API | Instagram media comments |
| POST | `/v1/threads/user/info` | Threads | Direct · Threads | Threads user info |
| POST | `/v1/threads/user/replies` | Threads | Direct · Threads | Threads user replies |
| POST | `/v1/threads/post/detail` | Threads | Direct · Threads | Threads post detail |
| POST | `/v1/threads/post/comments` | Threads | Direct · Threads | Threads post comments |
| POST | `/v1/threads/search/top` | Threads | Direct · Threads | Threads top search |
| POST | `/v1/threads/search/recent` | Threads | Direct · Threads | Threads recent search |
| POST | `/v1/linkedin/enrich_lead` | LinkedIn | RapidAPI · Fresh LinkedIn Profile Data | LinkedIn enrich lead |
| POST | `/v1/linkedin/company/by_linkedin_url` | LinkedIn | Direct · LinkedIn | LinkedIn company by URL |
| POST | `/v1/linkedin/company/by_domain` | LinkedIn | Direct · LinkedIn | LinkedIn company by domain |
| POST | `/v1/linkedin/profile/posts` | LinkedIn | RapidAPI · Fresh LinkedIn Profile Data | LinkedIn profile posts |
| POST | `/v1/linkedin/posts/search` | LinkedIn | RapidAPI · Fresh LinkedIn Profile Data | LinkedIn post search |
| POST | `/v1/linkedin/company/posts` | LinkedIn | Direct · LinkedIn | LinkedIn company posts |
| POST | `/v1/linkedin/companies/search` | LinkedIn | Direct · LinkedIn | LinkedIn company search |
| POST | `/v1/linkedin/companies/search_results` | LinkedIn | Direct · LinkedIn | LinkedIn company search results |
| POST | `/v1/linkedin/jobs/search` | LinkedIn | Direct · LinkedIn | LinkedIn job search |
| POST | `/v1/linkedin/jobs/details` | LinkedIn | Direct · LinkedIn | LinkedIn job details |
| POST | `/v1/apollo/people/search` | Apollo | Direct · Apollo API | Apollo people search |
| POST | `/v1/apollo/people/enrich` | Apollo | Direct · Apollo API | Apollo person enrich |
| POST | `/v1/apollo/people/match` | Apollo | Direct · Apollo API | Apollo person match |
| POST | `/v1/amazon/product-details` | Amazon | Direct · Amazon | Amazon product details |
| POST | `/v1/amazon/products` | Amazon | Direct · Amazon | Amazon batch product details |
| POST | `/v1/amazon/autocomplete` | Amazon | Direct · Amazon | Amazon autocomplete |
| POST | `/v1/amazon/search` | Amazon | Direct · Amazon | Amazon product search |
| POST | `/v1/amazon/rankings` | Amazon | Direct · Amazon | Amazon product rankings |
| POST | `/v1/amazon/deals` | Amazon | Direct · Amazon | Amazon deals |
| POST | `/v1/amazon/seller/profile` | Amazon | Direct · Amazon | Amazon seller profile |
| POST | `/v1/amazon/seller/products` | Amazon | Direct · Amazon | Amazon seller products |
| POST | `/v1/amazon/categories` | Amazon | Direct · Amazon | Amazon ranking categories |
| POST | `/v1/dogpile/search` | Dogpile Search | Direct · Dogpile Search | Dogpile web search |
| POST | `/v1/dogpile/images` | Dogpile Search | Direct · Dogpile Search | Dogpile image search |
| POST | `/v1/startpage/search` | Startpage Search | Direct · Startpage Search | Startpage web search |
| POST | `/v1/startpage/images` | Startpage Search | Direct · Startpage Search | Startpage image search |
| POST | `/v1/google/search` | Google Search | Third-party API · Serper | Google search |
| POST | `/v1/google/images` | Google Search | Third-party API · Serper | Google images |
| POST | `/v1/google/videos` | Google Search | Third-party API · Serper | Google videos |
| POST | `/v1/google/places` | Google Search | Third-party API · Serper | Google places |
| POST | `/v1/google/maps` | Google Search | Third-party API · Serper | Google maps |
| POST | `/v1/google/reviews` | Google Search | Third-party API · Serper | Google reviews |
| POST | `/v1/google/news` | Google Search | Third-party API · Serper | Google news |
| POST | `/v1/google/shopping` | Google Search | Third-party API · Serper | Google shopping |
| POST | `/v1/maps/place/autocomplete` | Maps | Third-party API · Wanderlog | Maps place autocomplete |
| POST | `/v1/maps/place/details` | Maps | Third-party API · Wanderlog | Maps place details |
| POST | `/v1/maps/search` | Maps | Third-party API · Serper | Maps search |
| POST | `/v1/video/transcripts` | Video | Direct API · groq_whisper | Transcribe video |
| POST | `/v1/web/fetch` | Web Access | Hybrid · Browserr / Intel Agent Direct / ScrapingBee | Fetch webpage |
| POST | `/v1/tiktok/video` | TikTok | Direct · TikTok | TikTok video |
| POST | `/v1/tiktok/user/info` | TikTok | Direct · TikTok | TikTok user info |
| POST | `/v1/tiktok/user/by_id` | TikTok | Direct · TikTok | TikTok user info by ID |
| POST | `/v1/tiktok/user/username_to_id` | TikTok | Direct · TikTok | TikTok username to ID |
| POST | `/v1/tiktok/user/followers` | TikTok | RapidAPI · TokAPI Mobile | TikTok user followers |
| POST | `/v1/tiktok/user/following` | TikTok | RapidAPI · TokAPI Mobile | TikTok user following |
| POST | `/v1/tiktok/user/posts` | TikTok | Direct · TikTok | TikTok user posts |
| POST | `/v1/tiktok/user/search` | TikTok | Direct · TikTok | TikTok user search |
| POST | `/v1/tiktok/feed/search` | TikTok | Direct · TikTok | TikTok feed search |
| POST | `/v1/tiktok/music/info` | TikTok | Direct · TikTok | TikTok music info |
| POST | `/v1/tiktok/music/posts` | TikTok | Direct · TikTok | TikTok music posts |
| POST | `/v1/tiktok/comments/list` | TikTok | Direct · TikTok | TikTok comments |
| POST | `/v1/tiktok/comments/replies` | TikTok | Direct · TikTok | TikTok comment replies |
| POST | `/v1/tiktok/mobile/user` | TikTok Mobile | RapidAPI · TokAPI Mobile | TikTok mobile user profile |
| POST | `/v1/tiktok/mobile/user/posts` | TikTok Mobile | RapidAPI · TokAPI Mobile | TikTok mobile user posts |
| POST | `/v1/tiktok/mobile/post` | TikTok Mobile | RapidAPI · TokAPI Mobile | TikTok mobile post detail |
| POST | `/v1/tiktok/mobile/post/comments` | TikTok Mobile | RapidAPI · TokAPI Mobile | TikTok mobile post comments |
| POST | `/v1/tiktok/mobile/search/post` | TikTok Mobile | RapidAPI · TokAPI Mobile | TikTok mobile post search |
| POST | `/v1/yelp/search` | Yelp | Direct · Yelp | Yelp search |
| POST | `/v1/yelp/search/category` | Yelp | Direct · Yelp | Yelp category search |
| POST | `/v1/yelp/business` | Yelp | Direct · Yelp | Yelp business details |
| POST | `/v1/yelp/businesses` | Yelp | Direct · Yelp | Yelp batch business details |
| POST | `/v1/yelp/reviews` | Yelp | Direct · Yelp | Yelp reviews |
| POST | `/v1/trustpilot/latest-reviews` | Trustpilot | Direct · Trustpilot | Trustpilot latest reviews |
| POST | `/v1/trustpilot/search` | Trustpilot | Direct · Trustpilot | Trustpilot business search |
| POST | `/v1/trustpilot/categories` | Trustpilot | Direct · Trustpilot | Trustpilot category index |
| POST | `/v1/trustpilot/category` | Trustpilot | Direct · Trustpilot | Trustpilot category businesses |
| POST | `/v1/trustpilot/company-info` | Trustpilot | Direct · Trustpilot | Trustpilot company info |
| POST | `/v1/trustpilot/company-reviews` | Trustpilot | Direct · Trustpilot | Trustpilot company reviews |
| POST | `/v1/trustpilot/company-transparency` | Trustpilot | Direct · Trustpilot | Trustpilot company transparency |
| POST | `/v1/trustpilot/company-locations` | Trustpilot | Direct · Trustpilot | Trustpilot company locations |
| POST | `/v1/trustpilot/company-location` | Trustpilot | Direct · Trustpilot | Trustpilot company location |
| POST | `/v1/trustpilot/review` | Trustpilot | Direct · Trustpilot | Trustpilot review detail |
| POST | `/v1/trustpilot/consumer-profile` | Trustpilot | Direct · Trustpilot | Trustpilot consumer profile |

## Endpoint details

### POST /v1/workflows/brand-portal/manual-post

**Add Brand Portal manual post**

Add a Brand Portal manual post by URL.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `201`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "url": "https://www.instagram.com/p/example/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/brand-portal/manual-post' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.instagram.com/p/example/"
}'
```

#### Response example (illustrative)

```json
{
  "id": "post_123",
  "url": "https://www.instagram.com/p/example/",
  "status": "created"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/workflows/brand-portal/discovery-targets

**Create or update discovery target**

Create, update, or reactivate a Brand Portal discovery target.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `200, 201`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `name` | `string` | yes | Discovery target or brand name. | Acme Beauty |
| `status` | `string` | no | Discovery target status. | active |
| `website_url` | `string` | no | Brand website URL. | https://brand.example |
| `instagram_handle` | `string` | no | Official Instagram handle. | @acmebeauty |
| `tiktok_handle` | `string` | no | Official TikTok handle. | @acmebeauty |
| `instagram_url` | `string` | no | Official Instagram URL. | https://www.instagram.com/acmebeauty/ |
| `tiktok_url` | `string` | no | Official TikTok URL. | https://www.tiktok.com/@acmebeauty |
| `aliases` | `array[string]` | no | Alternative brand names. | ["Acme"] |
| `official_hashtags` | `array[string]` | no | Known official campaign hashtags. | ["acmepartner"] |
| `product_terms` | `array[string]` | no | Product names or terms associated with the target. | ["Hydrating Serum"] |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "name": "Acme Beauty",
  "website_url": "https://acme.example",
  "instagram_handle": "@acmebeauty"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/brand-portal/discovery-targets' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Acme Beauty",
  "website_url": "https://acme.example",
  "instagram_handle": "@acmebeauty"
}'
```

#### Response example (illustrative)

```json
{
  "id": "target_123",
  "name": "Acme Beauty",
  "status": "active",
  "website_url": "https://acme.example"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/workflows/brand-portal/discovery-targets/disable

**Disable discovery target**

Disable a Brand Portal discovery target by id, name, or website_url.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | no | Discovery target id. | 123 |
| `name` | `string` | no | Discovery target or brand name. | Acme Beauty |
| `website_url` | `string` | no | Brand website URL. | https://brand.example |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "name": "Acme Beauty"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/brand-portal/discovery-targets/disable' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Acme Beauty"
}'
```

#### Response example (illustrative)

```json
{
  "id": "target_123",
  "name": "Acme Beauty",
  "status": "disabled"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/workflows/creator-profiles/refreshes

**Queue creator profile refresh**

Queue profile refresh jobs for Instagram and TikTok creators.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `202`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `targets` | `array[object]` | yes | Instagram or TikTok profile refresh targets. | [{"platform":"instagram","username":"creator_ig"}] |
| `requested_by` | `string` | no | Requester identifier for audit trails. | ops@example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "requested_by": "ops@example.com",
  "targets": [
    {
      "platform": "instagram",
      "username": "creator_ig"
    },
    {
      "platform": "tiktok",
      "url": "https://www.tiktok.com/@creator_tt"
    }
  ]
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/creator-profiles/refreshes' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "requested_by": "ops@example.com",
  "targets": [
    {
      "platform": "instagram",
      "username": "creator_ig"
    },
    {
      "platform": "tiktok",
      "url": "https://www.tiktok.com/@creator_tt"
    }
  ]
}'
```

#### Response example (illustrative)

```json
{
  "status": "accepted",
  "queued_count": 2,
  "duplicate_count": 0,
  "results": [
    {
      "platform": "instagram",
      "username": "creator_ig",
      "status": "queued"
    },
    {
      "platform": "tiktok",
      "username": "creator_tt",
      "status": "queued"
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/workflows/company-infos/manual-scrape-requests

**Queue company info refresh**

Queue a company info refresh for a brand URL.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `201`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `requested_by` | `string` | no | Requester identifier for audit trails. | ops@example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "url": "https://brand.example",
  "requested_by": "ops@example.com"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/company-infos/manual-scrape-requests' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://brand.example",
  "requested_by": "ops@example.com"
}'
```

#### Response example (illustrative)

```json
{
  "id": "scrape_request_123",
  "status": "queued",
  "url": "https://brand.example"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/workflows/company-infos/manual-contact-enrichment-requests

**Queue contact enrichment**

Queue contact enrichment for a company URL or domain.

- Category: `Workflow APIs`
- Authentication: Bearer token required
- Success statuses: `200, 201`
- Success content type: `application/json`
- Provider source: `Internal · Benable workflow service`
- Provider routing: Runs through Benable's workflow service, not RapidAPI.
- Response behavior: workflow service response is forwarded to the client

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | no | Target URL. | https://example.com |
| `domain` | `string` | no | Company domain. | brand.example |
| `requested_by` | `string` | no | Requester identifier for audit trails. | ops@example.com |
| `force` | `boolean` | no | Force a contact enrichment request when supported. | true |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BrandPortalWorkflow |

#### Request example

```json
{
  "url": "https://brand.example",
  "requested_by": "ops@example.com",
  "force": true
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/workflows/company-infos/manual-contact-enrichment-requests' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://brand.example",
  "requested_by": "ops@example.com",
  "force": true
}'
```

#### Response example (illustrative)

```json
{
  "id": "enrichment_request_123",
  "status": "queued",
  "domain": "brand.example"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `404` | Workflow resource not found. |
| `409` | Workflow conflict. |
| `422` | Workflow validation failed. |
| `502` | Service unavailable. |
| `504` | Request timed out. |

---

### POST /v1/agent/prompt

**Agent Zero prompt**

Run one synchronous one-time prompt through the embedded Agent Zero runtime with the same Benable API agent profile, tools, plugins, and DeepSeek No Thinking model preset. This path does not call Docker.

- Category: `Agent`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Provider source: `Internal · Benable agent runtime`
- Provider routing: Runs in the Benable agent runtime, not RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `prompt` | `string` | yes | Research prompt. | Research zylioocap.com and return company facts as JSON. |
| `attachments` | `array[string]` | no | Optional file paths or URLs. | [] |
| `require_json_response` | `boolean` | no | Require the final agent answer to be valid JSON. | false |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "prompt": "Research benable.com and return company facts as JSON.",
  "require_json_response": true
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/agent/prompt' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "prompt": "Research benable.com and return company facts as JSON.",
  "require_json_response": true
}'
```

#### Response example (illustrative)

```json
{
  "answer": "Benable is a recommendation-sharing platform.",
  "data": {
    "domain": "benable.com"
  },
  "sources": [
    "https://benable.com"
  ],
  "confidence": "high"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `502` | LLM or tool execution error. |
| `504` | Agent deadline reached. |

---

### GET /v1/agent/status

**Agent runtime status**

Return safe operational status for the embedded Agent Zero API runtime.

- Category: `Agent`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Provider source: `Internal · Benable agent runtime`
- Provider routing: Reads the Benable agent runtime, not RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite

#### Request fields

No request body.

#### cURL

```bash
curl --request GET \
  --url 'https://scraper.benable.com/v1/agent/status' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json'
```

#### Response example (illustrative)

```json
{
  "active": 0,
  "available_slots": 8,
  "max_concurrency": 8,
  "oldest_active_seconds": 0,
  "stale_active": false,
  "completed": 125,
  "failures": 2,
  "timeouts": 0,
  "rss_bytes": 268435456
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `401` | Missing or invalid Bearer token. |

---

### POST /v1/facebook/page/details

**Facebook page details**

Fetch public Facebook page details directly from Facebook while preserving the legacy facebook-scraper3 payload.

- Category: `Facebook`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `facebook.page_details`
- Provider source: `Direct · Facebook`
- Provider routing: Connects to Facebook directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://www.facebook.com/manciniswoodfiredpizza/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/facebook/page/details' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.facebook.com/manciniswoodfiredpizza/"
}'
```

#### Response example (illustrative)

```json
{
  "results": {
    "name": "Mancini's Wood-Fired Pizza",
    "type": "page",
    "page_id": "100067215572583",
    "url": "https://www.facebook.com/manciniswoodfiredpizza",
    "image": "https://example.com/facebook-profile.jpg",
    "intro": "Wood-fired pizza in Brooklyn.",
    "likes": 850,
    "followers": 916,
    "following": 0,
    "categories": [
      "Page",
      "Pizza place"
    ],
    "phone": "+1 718-680-1700",
    "email": null,
    "address": "8504 5th Avenue, Brooklyn, NY",
    "rating": "10",
    "services": [
      "Dine in",
      "Outdoor seating"
    ],
    "price_range": "$$",
    "website": "example.com",
    "delegate_page": null,
    "cover_image": "https://example.com/facebook-cover.jpg",
    "verified": false,
    "other_accounts": [],
    "reels_page_id": "opaque-reels-collection-id"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/facebook/page/reviews

**Facebook page reviews**

Fetch public Facebook page reviews directly from Facebook while preserving the legacy facebook-scraper3 payload. Pass the previous cursor to fetch the next page.

- Category: `Facebook`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `facebook.page_reviews`
- Provider source: `Direct · Facebook`
- Provider routing: Connects to Facebook directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `page_id` | `string` | yes | Facebook page ID. | 100067215572583 |
| `cursor` | `string` | no | Opaque cursor returned by the previous Facebook response. | opaque-facebook-cursor |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "page_id": "100067215572583"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/facebook/page/reviews' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "page_id": "100067215572583"
}'
```

#### Response example (illustrative)

```json
{
  "results": [
    {
      "type": "review",
      "post_id": "10232481384851157",
      "recommend": true,
      "message": "The food and service were excellent.",
      "author": {
        "id": "facebook-user-id",
        "name": "Example Reviewer",
        "url": "https://www.facebook.com/example",
        "profile_picture": {
          "uri": "https://example.com/reviewer.jpg",
          "width": 80,
          "height": 80,
          "scale": 2
        },
        "is_additional_profile_plus": false,
        "delegated_page": null,
        "work_info": null
      },
      "reactions_count": 2,
      "share": 0,
      "photos": [],
      "tags": [
        "Outdoor dining"
      ]
    }
  ],
  "cursor": "opaque-facebook-review-cursor"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/facebook/search/posts

**Facebook post search**

Search public Facebook posts directly through Facebook guest GraphQL while preserving the legacy facebook-scraper3 payload. Pass the previous cursor to fetch the next page.

- Category: `Facebook`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `facebook.search_posts`
- Provider source: `Direct · Facebook`
- Provider routing: Connects to Facebook directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `cursor` | `string` | no | Opaque cursor returned by the previous Facebook response. | opaque-facebook-cursor |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Allbirds"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/facebook/search/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Allbirds"
}'
```

#### Response example (illustrative)

```json
{
  "results": [
    {
      "post_id": "123456789",
      "type": "post",
      "url": "https://www.facebook.com/example/posts/123456789",
      "message": "Trying my new Allbirds today.",
      "message_rich": "Trying my new Allbirds today.",
      "timestamp": 1780716944,
      "comments_count": 3,
      "reactions_count": 12,
      "reshare_count": 1,
      "reactions": {
        "angry": 0,
        "care": 0,
        "haha": 0,
        "like": 11,
        "love": 1,
        "sad": 0,
        "wow": 0
      },
      "author": {
        "id": "facebook-user-id",
        "name": "Example Author",
        "url": "https://www.facebook.com/example",
        "profile_picture_url": "https://example.com/author.jpg",
        "delegate_page_id": null
      },
      "author_title": null,
      "image": {
        "uri": "https://example.com/post.jpg"
      },
      "video": null,
      "video_view_count": null,
      "album_preview": null,
      "video_files": null,
      "video_thumbnail": null,
      "external_url": null,
      "attached_event": null,
      "attached_group": null,
      "attached_post": null,
      "attached_post_url": null,
      "text_format_metadata": null,
      "comments_id": "123456789",
      "shares_id": "123456789",
      "associated_group_id": null,
      "associated_group": null,
      "images_count": 1
    }
  ],
  "cursor": "opaque-facebook-search-cursor"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/user/by_id

**Instagram user by ID**

Fetch Instagram user data by user_id.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.user_by_id`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "25025320"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/user/by_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "25025320"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "25025320",
    "username": "example_creator",
    "full_name": "Example Creator",
    "follower_count": 125000
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/user/by_username

**Instagram user by username**

Fetch Instagram user data by username.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.user_by_username`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username` | `string` | yes | Social profile username, with or without @. | javan |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username": "javan"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/user/by_username' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "javan"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "25025320",
    "username": "example_creator",
    "full_name": "Example Creator",
    "follower_count": 125000
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/medias/by_user_id

**Instagram media by user ID**

Fetch Instagram media by user_id.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.medias_by_user_id`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `end_cursor` | `string` | no | Instagram pagination cursor. | QVFE |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "25025320"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/medias/by_user_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "25025320"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "media_123",
        "shortcode": "DalAa-0xSIB"
      }
    ],
    "next_cursor": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/medias/tagged_by_user_id

**Instagram tagged media by user ID**

Fetch tagged Instagram media by user_id.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.tagged_medias_by_user_id`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `end_cursor` | `string` | no | Instagram pagination cursor. | QVFE |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "25025320"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/medias/tagged_by_user_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "25025320"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "media_123",
        "shortcode": "DalAa-0xSIB"
      }
    ],
    "next_cursor": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/tagged

**Instagram tagged media**

Fetch tagged Instagram media directly by username, numeric user ID, or profile URL. Returns RapidAPI-compatible data.items while retaining raw edges and page_info.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.tagged`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username_or_id_or_url` | `string` | yes | Instagram username, numeric user ID, or profile URL. | instagram |
| `count` | `integer` | no | Provider page size. | 50 |
| `pagination_token` | `string` | no | Opaque Instagram pagination token returned by the previous page. | next-page-token |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username_or_id_or_url": "@example_creator",
  "count": 12
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/tagged' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username_or_id_or_url": "@example_creator",
  "count": 12
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "count": 1,
    "total": 1,
    "items": [
      {
        "id": "3867490275971718086",
        "code": "DWsFepHklvG",
        "caption": {
          "text": "Tagged post caption",
          "created_at": 1775260789,
          "user": {
            "username": "example_creator",
            "profile_pic_url": "https://cdn.example.com/profile.jpg",
            "is_verified": false
          }
        },
        "thumbnail_url": "https://cdn.example.com/post.jpg",
        "image_versions": {
          "items": [
            {
              "url": "https://cdn.example.com/post.jpg"
            }
          ]
        },
        "play_count": 1262
      }
    ]
  },
  "pagination_token": "next-token",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/reels/by_user_id

**Instagram reels by user ID**

Fetch Instagram reels by user_id.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.reels_by_user_id`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `page_size` | `integer` | no | Instagram page size. | 12 |
| `max_id` | `string` | no | Instagram max_id pagination cursor. | QVFE |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "25025320"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/reels/by_user_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "25025320"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "media_123",
        "shortcode": "DalAa-0xSIB"
      }
    ],
    "next_cursor": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/media/by_shortcode

**Instagram media by shortcode**

Fetch Instagram media by shortcode.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.media_by_shortcode`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `shortcode` | `string` | yes | Instagram media shortcode. | DalAa-0xSIB |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "shortcode": "DalAa-0xSIB"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/media/by_shortcode' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "shortcode": "DalAa-0xSIB"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "media_123",
    "shortcode": "DalAa-0xSIB",
    "caption": "Example post"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/media/by_url

**Instagram media by URL**

Fetch Instagram media by url.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.media_by_url`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://www.instagram.com/p/DalAa-0xSIB/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/media/by_url' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.instagram.com/p/DalAa-0xSIB/"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "media_123",
    "shortcode": "DalAa-0xSIB",
    "caption": "Example post"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/highlight/by_url

**Instagram highlight by URL**

Fetch Instagram highlight stories by highlight URL. Returns a legacy-compatible {user, items} payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.highlight_by_url`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://www.instagram.com/stories/highlights/18029499352961095/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/highlight/by_url' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.instagram.com/stories/highlights/18029499352961095/"
}'
```

#### Response example (illustrative)

```json
{
  "user": {
    "id": "25025320",
    "username": "example_creator"
  },
  "items": [
    {
      "id": "story_123",
      "media_type": 1,
      "taken_at": 1710000000
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/stories/by_username

**Instagram active stories by username**

Fetch active Instagram stories by username through Instagram Social. Returns the raw provider payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.stories_by_username`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username` | `string` | yes | Social profile username, with or without @. | javan |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username": "instagram"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/stories/by_username' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "instagram"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/comments

**Instagram comments**

Fetch Instagram comments by shortcode, media id, or URL through Instagram Social. Returns the raw provider payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.comments`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `code_or_id_or_url` | `string` | yes | Instagram shortcode, media ID, or post URL. | DKSGgvOuVxI |
| `pagination_token` | `string` | no | Opaque Instagram pagination token returned by the previous page. | next-page-token |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "code_or_id_or_url": "DKSGgvOuVxI"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/comments' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "code_or_id_or_url": "DKSGgvOuVxI"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/comments/replies

**Instagram comment replies**

Fetch Instagram comment replies for one parent comment through Instagram Social. Returns the raw provider payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.comment_replies`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `code_or_id_or_url` | `string` | yes | Instagram shortcode, media ID, or post URL. | DKSGgvOuVxI |
| `comment_id` | `string` | yes | Provider comment ID. | 18047929775783434 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "code_or_id_or_url": "DKSGgvOuVxI",
  "comment_id": "18047929775783434"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/comments/replies' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "code_or_id_or_url": "DKSGgvOuVxI",
  "comment_id": "18047929775783434"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/followers

**Instagram followers**

Fetch Instagram followers by username, user id, or URL through Instagram Social. Returns the raw provider payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.followers`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username_or_id_or_url` | `string` | yes | Instagram username, numeric user ID, or profile URL. | instagram |
| `amount` | `integer` | no | Provider result amount. | 50 |
| `pagination_token` | `string` | no | Opaque Instagram pagination token returned by the previous page. | next-page-token |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username_or_id_or_url": "instagram",
  "amount": 50
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/followers' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username_or_id_or_url": "instagram",
  "amount": 50
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/search_followers

**Search Instagram followers**

Search or page an Instagram account's authenticated follower list through RocketAPI. Query searches the full relationship list; omit query and pass max_id to paginate. Each paid upstream attempt costs $0.001.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.search_followers`
- Provider source: `RapidAPI · RocketAPI for Developers`
- Provider routing: Uses RocketAPI for Developers through RapidAPI (rocketapi-for-developers.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `10 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | yes | Numeric Instagram account ID. | 25025320 |
| `query` | `string` | no | Optional username or name search across the relationship list. | meta |
| `max_id` | `string` | no | Opaque next_max_id cursor returned by the previous page. | next-page-token |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "id": "25025320",
  "query": "meta"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/search_followers' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "id": "25025320",
  "query": "meta"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "users": [
      {
        "pk": "123456789",
        "username": "example_creator",
        "full_name": "Example Creator",
        "profile_pic_url": "https://cdn.example.com/profile.jpg",
        "is_private": false,
        "is_verified": true
      }
    ],
    "next_max_id": "next-page-token",
    "has_more": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_rocket"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/search_following

**Search Instagram following**

Search or page the authenticated list of accounts an Instagram user follows through RocketAPI. Query searches the full relationship list; omit query and pass max_id to paginate. Each paid upstream attempt costs $0.001.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.search_following`
- Provider source: `RapidAPI · RocketAPI for Developers`
- Provider routing: Uses RocketAPI for Developers through RapidAPI (rocketapi-for-developers.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `10 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | yes | Numeric Instagram account ID. | 25025320 |
| `query` | `string` | no | Optional username or name search across the relationship list. | meta |
| `max_id` | `string` | no | Opaque next_max_id cursor returned by the previous page. | next-page-token |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "id": "25025320",
  "query": "meta"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/search_following' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "id": "25025320",
  "query": "meta"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "users": [
      {
        "pk": "123456789",
        "username": "example_creator",
        "full_name": "Example Creator",
        "profile_pic_url": "https://cdn.example.com/profile.jpg",
        "is_private": false,
        "is_verified": true
      }
    ],
    "next_max_id": "next-page-token",
    "has_more": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_rocket"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/search/posts

**Instagram post search**

Search Instagram posts through Instagram Social. Returns the raw provider payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.search_posts`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "benable"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/search/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "benable"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/search/global

**Instagram global search**

Search Instagram globally by keyword through Instagram directly while preserving the legacy response payload.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.search_global`
- Provider source: `Direct · Instagram`
- Provider routing: Connects to Instagram directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keyword` | `string` | yes | Search keyword. | retail AI |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keyword": "retail AI"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/search/global' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keyword": "retail AI"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "status": "ok",
    "query": "retail AI",
    "users": [
      {
        "username": "example_creator",
        "full_name": "Example Creator"
      }
    ],
    "hashtags": [],
    "places": []
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "instagram_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/instagram/comments/media_comments_by_id

**Instagram media comments**

Fetch Instagram media comments by media_id.

- Category: `Instagram`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `instagram.media_comments_by_id`
- Provider source: `RapidAPI · Instagram Social API`
- Provider routing: Uses Instagram Social API through RapidAPI (instagram-social-api.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `media_id` | `string` | yes | Instagram media ID. | 3621457933659168101 |
| `pagination_token` | `string` | no | Opaque Instagram pagination token returned by the previous page. | next-page-token |
| `end_cursor` | `string` | no | Instagram pagination cursor. | QVFE |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "media_id": "3621457933659168101"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/instagram/comments/media_comments_by_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "media_id": "3621457933659168101"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "data": {
      "items": [
        {
          "id": "item_123"
        }
      ]
    },
    "pagination_token": "next-token"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_instagram_social"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/user/info

**Threads user info**

Fetch a public Threads profile directly from Threads while preserving the legacy threads-api4 data.user payload.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.user_info`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username` | `string` | yes | Social profile username, with or without @. | javan |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username": "zuck"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/user/info' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "zuck"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "user": {
      "pk": "314216",
      "username": "example_creator",
      "full_name": "Example Creator",
      "profile_pic_url": "https://example.com/threads-profile.jpg"
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/user/replies

**Threads user replies**

Fetch public replies directly from a Threads profile while preserving the legacy data.mediaData payload. Native IDs observed in public responses are resolved in memory; public Instagram ID resolution provides the fallback.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.user_replies`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "314216"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/user/replies' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "314216"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "mediaData": {
      "edges": [
        {
          "node": {
            "thread": {
              "id": "3703716763353340068",
              "thread_items": [
                {
                  "post": {
                    "pk": "3703716763353340068",
                    "code": "ExampleCode",
                    "caption": {
                      "text": "An example Threads post."
                    },
                    "like_count": 12,
                    "taken_at": 1784016000,
                    "user": {
                      "pk": "314216",
                      "username": "example_creator",
                      "full_name": "Example Creator",
                      "profile_pic_url": "https://example.com/threads-profile.jpg"
                    },
                    "text_post_app_info": {
                      "reply_to_author": null,
                      "tag_header": null
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "page_info": {
        "has_next_page": false,
        "end_cursor": null
      }
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/post/detail

**Threads post detail**

Fetch a public Threads post directly from its server-rendered post payload while preserving the legacy data.data structure.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.post_detail`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `post_id` | `string` | yes | Numeric Threads post ID. | 3703716763353340068 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "post_id": "3703716763353340068"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/post/detail' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "post_id": "3703716763353340068"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "data": {
      "edges": [
        {
          "node": {
            "thread": {
              "id": "3703716763353340068",
              "thread_items": [
                {
                  "post": {
                    "pk": "3703716763353340068",
                    "code": "ExampleCode",
                    "caption": {
                      "text": "An example Threads post."
                    },
                    "like_count": 12,
                    "taken_at": 1784016000,
                    "user": {
                      "pk": "314216",
                      "username": "example_creator",
                      "full_name": "Example Creator",
                      "profile_pic_url": "https://example.com/threads-profile.jpg"
                    },
                    "text_post_app_info": {
                      "reply_to_author": null,
                      "tag_header": null
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "page_info": {
        "has_next_page": false,
        "end_cursor": null
      }
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/post/comments

**Threads post comments**

Fetch a public Threads post and its server-rendered comments directly while preserving the legacy data.data structure.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.post_comments`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `post_id` | `string` | yes | Numeric Threads post ID. | 3703716763353340068 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "post_id": "3703716763353340068"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/post/comments' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "post_id": "3703716763353340068"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "data": {
      "edges": [
        {
          "node": {
            "thread": {
              "id": "3703716763353340068",
              "thread_items": [
                {
                  "post": {
                    "pk": "3703716763353340068",
                    "code": "ExampleCode",
                    "caption": {
                      "text": "An example Threads post."
                    },
                    "like_count": 12,
                    "taken_at": 1784016000,
                    "user": {
                      "pk": "314216",
                      "username": "example_creator",
                      "full_name": "Example Creator",
                      "profile_pic_url": "https://example.com/threads-profile.jpg"
                    },
                    "text_post_app_info": {
                      "reply_to_author": null,
                      "tag_header": null
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "page_info": {
        "has_next_page": false,
        "end_cursor": null
      }
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/search/top

**Threads top search**

Search public Threads posts directly through Threads and preserve the legacy data.searchResults.edges payload.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.search_top`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Allbirds"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/search/top' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Allbirds"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "searchResults": {
      "edges": [
        {
          "node": {
            "thread": {
              "id": "3703716763353340068",
              "thread_items": [
                {
                  "post": {
                    "pk": "3703716763353340068",
                    "code": "ExampleCode",
                    "caption": {
                      "text": "An example Threads post."
                    },
                    "like_count": 12,
                    "taken_at": 1784016000,
                    "user": {
                      "pk": "314216",
                      "username": "example_creator",
                      "full_name": "Example Creator",
                      "profile_pic_url": "https://example.com/threads-profile.jpg"
                    },
                    "text_post_app_info": {
                      "reply_to_author": null,
                      "tag_header": null
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "page_info": {
        "has_next_page": false,
        "end_cursor": null
      }
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/threads/search/recent

**Threads recent search**

Search public server-rendered Threads posts without RapidAPI and preserve the legacy data.searchResults.edges payload, ordered by post time.

- Category: `Threads`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `threads.search_recent`
- Provider source: `Direct · Threads`
- Provider routing: Connects to Threads directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Allbirds"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/threads/search/recent' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Allbirds"
}'
```

#### Response example (illustrative)

```json
{
  "data": {
    "searchResults": {
      "edges": [
        {
          "node": {
            "thread": {
              "id": "3703716763353340068",
              "thread_items": [
                {
                  "post": {
                    "pk": "3703716763353340068",
                    "code": "ExampleCode",
                    "caption": {
                      "text": "An example Threads post."
                    },
                    "like_count": 12,
                    "taken_at": 1784016000,
                    "user": {
                      "pk": "314216",
                      "username": "example_creator",
                      "full_name": "Example Creator",
                      "profile_pic_url": "https://example.com/threads-profile.jpg"
                    },
                    "text_post_app_info": {
                      "reply_to_author": null,
                      "tag_header": null
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "page_info": {
        "has_next_page": false,
        "end_cursor": null
      }
    }
  },
  "provider": "threads_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/enrich_lead

**LinkedIn enrich lead**

Enrich a LinkedIn person profile from linkedin_url.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.enrich_lead`
- Provider source: `RapidAPI · Fresh LinkedIn Profile Data`
- Provider routing: Uses Fresh LinkedIn Profile Data through RapidAPI (fresh-linkedin-profile-data.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `linkedin_url` | `string` | yes | Full LinkedIn URL. | https://www.linkedin.com/company/apple/ |
| `include_skills` | `boolean` | no | Ask the LinkedIn provider to include skills when supported. | false |
| `include_certifications` | `boolean` | no | Ask the LinkedIn provider to include certifications when supported. | false |
| `include_profile_status` | `boolean` | no | Ask the LinkedIn provider to include profile status when supported. | false |
| `include_company_public_url` | `boolean` | no | Ask the LinkedIn provider to include the company public URL when supported. | false |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "linkedin_url": "https://www.linkedin.com/in/cjfollini/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/enrich_lead' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "linkedin_url": "https://www.linkedin.com/in/cjfollini/"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "full_name": "Example Person",
    "headline": "Chief Executive Officer",
    "linkedin_url": "https://www.linkedin.com/in/example-person/"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/company/by_linkedin_url

**LinkedIn company by URL**

Fetch company details directly from a LinkedIn company URL while preserving the legacy response payload.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.company_by_linkedin_url`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `linkedin_url` | `string` | yes | Full LinkedIn URL. | https://www.linkedin.com/company/apple/ |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "linkedin_url": "https://www.linkedin.com/company/apple/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/company/by_linkedin_url' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "linkedin_url": "https://www.linkedin.com/company/apple/"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "name": "Apple",
    "domain": "apple.com",
    "linkedin_url": "https://www.linkedin.com/company/apple/"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/company/by_domain

**LinkedIn company by domain**

Fetch company details directly from a domain while preserving the legacy response payload.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.company_by_domain`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `domain` | `string` | yes | Company domain. | apple.com |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "domain": "apple.com"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/company/by_domain' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "domain": "apple.com"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "name": "Apple",
    "domain": "apple.com",
    "linkedin_url": "https://www.linkedin.com/company/apple/"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/profile/posts

**LinkedIn profile posts**

Fetch posts from a LinkedIn member profile.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.profile_posts`
- Provider source: `RapidAPI · Fresh LinkedIn Profile Data`
- Provider routing: Uses Fresh LinkedIn Profile Data through RapidAPI (fresh-linkedin-profile-data.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `linkedin_url` | `string` | yes | Full LinkedIn URL. | https://www.linkedin.com/company/apple/ |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "linkedin_url": "https://www.linkedin.com/in/cjfollini/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/profile/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "linkedin_url": "https://www.linkedin.com/in/cjfollini/"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": [
    {
      "id": "item_123",
      "title": "Example result"
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/posts/search

**LinkedIn post search**

Search LinkedIn posts.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.posts_search`
- Provider source: `RapidAPI · Fresh LinkedIn Profile Data`
- Provider routing: Uses Fresh LinkedIn Profile Data through RapidAPI (fresh-linkedin-profile-data.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keyword` | `string` | no | Search keyword. | retail AI |
| `keywords` | `string` | no | Search keywords. | retail AI |
| `search_keywords` | `string` | no | LinkedIn post-search keywords. Alias: keyword or keywords. | retail AI |
| `date_posted` | `string` | no | Provider freshness window, such as any, last_30_days, or last_12_months. | any |
| `sort_by` | `string` | no | Provider sort option. | Yelp_sort |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keyword": "retail AI"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/posts/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keyword": "retail AI"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": [
    {
      "id": "item_123",
      "title": "Example result"
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/company/posts

**LinkedIn company posts**

Fetch posts directly from a LinkedIn company page while preserving the legacy response payload.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.company_posts`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `linkedin_url` | `string` | yes | Full LinkedIn URL. | https://www.linkedin.com/company/apple/ |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "linkedin_url": "https://www.linkedin.com/company/apple/"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/company/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "linkedin_url": "https://www.linkedin.com/company/apple/"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": [
    {
      "id": "item_123",
      "title": "Example result"
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/companies/search

**LinkedIn company search**

Start an async direct LinkedIn company search while preserving the legacy request and response payloads. LinkedIn's guest endpoint applies keywords server-side; account filters require authenticated Sales Navigator and are not accepted here.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.companies_search`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keywords` | `string` | no | Search keywords. | retail AI |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keywords": "retail",
  "limit": 10
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/companies/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keywords": "retail",
  "limit": 10
}'
```

#### Response example (illustrative)

```json
{
  "message": "Use this request_id to check your search with 'Check Search Companies Status' endpoint",
  "request_id": "request_123"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/companies/search_results

**LinkedIn company search results**

Fetch direct async LinkedIn company search results by request_id.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.companies_search_results`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `request_id` | `string` | yes | Async LinkedIn request ID. | request-id |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "request_id": "request-id"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/companies/search_results' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "request_id": "request-id"
}'
```

#### Response example (illustrative)

```json
{
  "companies_scraped_so_far": 1,
  "data": [
    {
      "company_id": "162479",
      "company_name": "Apple",
      "description": "Technology company.",
      "domain": "apple.com",
      "employee_count": 165000,
      "employee_range": "10001+",
      "follower_count": 17600000,
      "hq_address_line1": "1 Apple Park Way",
      "hq_address_line2": "",
      "hq_city": "Cupertino",
      "hq_country": "US",
      "hq_full_address": "1 Apple Park Way, Cupertino, California 95014, US",
      "hq_postalcode": "95014",
      "hq_region": "California",
      "industry": "Computers and Electronics Manufacturing",
      "industries": [
        "Computers and Electronics Manufacturing"
      ],
      "linkedin_url": "https://www.linkedin.com/company/apple",
      "locations": [
        {
          "city": "Cupertino",
          "country": "US",
          "full_address": "1 Apple Park Way, Cupertino, California 95014, US",
          "is_headquarter": true,
          "line1": "1 Apple Park Way",
          "line2": "",
          "region": "California",
          "zipcode": "95014"
        }
      ],
      "logo_url": "https://media.licdn.com/apple-logo.png",
      "specialties": "Consumer electronics, Software",
      "tagline": "",
      "website": "https://www.apple.com",
      "year_founded": 1976
    }
  ],
  "message": "Showing 1 of 1 pages",
  "search_params": {
    "keywords": "Apple",
    "limit": 10
  },
  "total_count": 1
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/jobs/search

**LinkedIn job search**

Search LinkedIn jobs directly while preserving the legacy response payload.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.jobs_search`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keywords` | `string` | no | Search keywords. | retail AI |
| `location` | `string` | no | Search location. | New York, NY |
| `date_posted` | `string` | no | Provider freshness window, such as any, last_30_days, or last_12_months. | any |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keywords": "software engineer",
  "location": "New York"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/jobs/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keywords": "software engineer",
  "location": "New York"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": [
    {
      "id": "item_123",
      "title": "Example result"
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/linkedin/jobs/details

**LinkedIn job details**

Fetch details for one LinkedIn job URL directly while preserving the legacy response payload.

- Category: `LinkedIn`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `linkedin.jobs_details`
- Provider source: `Direct · LinkedIn`
- Provider routing: Connects to LinkedIn directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `30 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `job_url` | `string` | yes | Full LinkedIn job URL. | https://www.linkedin.com/jobs/view/example |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "job_url": "https://www.linkedin.com/jobs/view/1234567890"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/linkedin/jobs/details' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "job_url": "https://www.linkedin.com/jobs/view/1234567890"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "title": "Software Engineer",
    "company": "Example Company",
    "location": "New York, NY"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/apollo/people/search

**Apollo people search**

Search likely company contacts through Apollo. Returns normalized deduped candidates and raw strategy responses.

- Category: `Apollo`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `apollo.people_search`
- Provider source: `Direct · Apollo API`
- Provider routing: Connects to Apollo API directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `brand` | `string` | yes | Company or brand name. | Apple |
| `domain` | `string` | yes | Company domain. | apple.com |
| `person_titles` | `array[string]` | no | Apollo person title filters. | ["Founder","CEO","Head of Marketing"] |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `per_page` | `integer` | no | Provider page size. | 12 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "brand": "Apple",
  "domain": "apple.com"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/apollo/people/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "brand": "Apple",
  "domain": "apple.com"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "statusCode": 200,
  "provider": "apollo",
  "candidates": [
    {
      "id": "person_123",
      "name": "Example Person",
      "title": "Chief Executive Officer",
      "organization_name": "Apple",
      "linkedin_url": "https://www.linkedin.com/in/example-person/",
      "search_strategies": [
        "company_and_titles"
      ]
    }
  ],
  "raw_responses": [],
  "duration": "0.42"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/apollo/people/enrich

**Apollo person enrich**

Enrich one Apollo person by Apollo id. Returns a normalized person plus raw provider response.

- Category: `Apollo`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `apollo.people_enrich`
- Provider source: `Direct · Apollo API`
- Provider routing: Connects to Apollo API directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | yes | Provider object ID. | 7657202472431144222 |
| `reveal_personal_emails` | `boolean` | no | Ask Apollo to reveal personal emails. | true |
| `reveal_phone_number` | `boolean` | no | Ask Apollo to reveal phone numbers. | false |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "id": "66f1462a26e0c9000152bed8",
  "reveal_personal_emails": true
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/apollo/people/enrich' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "id": "66f1462a26e0c9000152bed8",
  "reveal_personal_emails": true
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "statusCode": 200,
  "provider": "apollo",
  "person": {
    "id": "person_123",
    "name": "Example Person",
    "title": "Chief Executive Officer",
    "organization_name": "Apple",
    "organization_domain": "apple.com",
    "linkedin_url": "https://www.linkedin.com/in/example-person/",
    "personal_emails": [
      "person@example.com"
    ]
  },
  "raw_response": {},
  "duration": "0.42"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/apollo/people/match

**Apollo person match**

Match one person by name, company brand, and domain. Returns a normalized person plus raw provider response.

- Category: `Apollo`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `apollo.people_match`
- Provider source: `Direct · Apollo API`
- Provider routing: Connects to Apollo API directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `name` | `string` | yes | Person full name. | Tim Cook |
| `brand` | `string` | no | Company or brand name. | Apple |
| `domain` | `string` | no | Company domain. | apple.com |
| `reveal_personal_emails` | `boolean` | no | Ask Apollo to reveal personal emails. | true |
| `reveal_phone_number` | `boolean` | no | Ask Apollo to reveal phone numbers. | false |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "name": "Tim Cook",
  "brand": "Apple",
  "domain": "apple.com"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/apollo/people/match' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Tim Cook",
  "brand": "Apple",
  "domain": "apple.com"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "statusCode": 200,
  "provider": "apollo",
  "person": {
    "id": "person_123",
    "name": "Example Person",
    "title": "Chief Executive Officer",
    "organization_name": "Apple",
    "organization_domain": "apple.com",
    "linkedin_url": "https://www.linkedin.com/in/example-person/",
    "personal_emails": [
      "person@example.com"
    ]
  },
  "raw_response": {},
  "duration": "0.42"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/product-details

**Amazon product details**

Fetch an Amazon US product page directly by ASIN while preserving the Real-Time Amazon Data fields used by Benable autofill.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.product_details`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `asin` | `string` | yes | Ten-character Amazon Standard Identification Number. | B0CHWRXH8B |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "asin": "B0CHWRXH8B"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/product-details' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "asin": "B0CHWRXH8B"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "parameters": {
    "asin": "B0CHWRXH8B",
    "country": "US"
  },
  "provider": "amazon_direct",
  "data": {
    "asin": "B0CHWRXH8B",
    "product_title": "Apple AirPods Pro (2nd Generation)",
    "product_price": "199.00",
    "product_original_price": "$249.00",
    "delivery_price": "FREE",
    "minimum_order_quantity": null,
    "currency": "USD",
    "country": "US",
    "domain": "www.amazon.com",
    "product_byline": "Visit the Apple Store",
    "product_byline_link": "https://www.amazon.com/stores/Apple/page/example",
    "product_byline_links": [
      "https://www.amazon.com/stores/Apple/page/example"
    ],
    "product_star_rating": "4.7",
    "product_num_ratings": 28912,
    "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
    "product_slug": "Apple-AirPods-Pro-2nd-Generation",
    "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
    "product_num_offers": 8,
    "product_availability": "In Stock",
    "product_condition": "Buy New",
    "is_best_seller": true,
    "is_amazon_choice": false,
    "is_prime": true,
    "main_buy_box": {
      "title": "Buy New",
      "price": "$199.00",
      "seller": "Amazon.com"
    },
    "buy_boxes": [
      {
        "title": "Buy New",
        "price": "$199.00"
      },
      {
        "title": "Used - Good",
        "price": "$169.00"
      }
    ],
    "climate_pledge_friendly": false,
    "sales_volume": "10K+ bought in past month",
    "about_product": [
      "Active Noise Cancellation removes up to twice as much background noise.",
      "USB-C charging and up to 6 hours of listening time."
    ],
    "product_description": "Wireless earbuds with active noise cancellation.",
    "product_information": {
      "Brand": "Apple",
      "Model Name": "AirPods Pro"
    },
    "rating_distribution": {
      "5": 82,
      "4": 10,
      "3": 3,
      "2": 2,
      "1": 3
    },
    "product_photos": [
      "https://m.media-amazon.com/images/I/example-main.jpg",
      "https://m.media-amazon.com/images/I/example-alt.jpg"
    ],
    "product_videos": [
      {
        "id": "example-video",
        "title": "AirPods Pro overview",
        "video_url": "https://m.media-amazon.com/images/S/vse-vms/example.mp4",
        "video_height": "1080",
        "video_width": "1920",
        "thumbnail_url": "https://m.media-amazon.com/images/I/example-video.jpg",
        "product_asin": "B0CHWRXH8B",
        "parent_asin": "B0CHWRXH8B"
      }
    ],
    "user_uploaded_videos": [],
    "video_thumbnail": "https://m.media-amazon.com/images/I/example-video.jpg",
    "has_video": true,
    "product_details": {
      "Brand": "Apple",
      "Model Name": "AirPods Pro"
    },
    "top_reviews": [
      {
        "review_id": "R1EXAMPLE",
        "review_title": "Excellent earbuds",
        "review_comment": "The noise cancellation and sound quality are excellent.",
        "review_star_rating": "5.0",
        "review_link": "https://www.amazon.com/gp/customer-reviews/R1EXAMPLE",
        "review_author_id": "EXAMPLEUSER",
        "review_author": "Example customer",
        "review_author_url": "https://www.amazon.com/gp/profile/EXAMPLEUSER",
        "review_author_avatar": null,
        "review_images": [],
        "review_video": null,
        "review_date": "Reviewed in the United States on July 1, 2026",
        "is_verified_purchase": true,
        "helpful_vote_statement": "12 people found this helpful",
        "reviewed_product_asin": "B0CHWRXH8B",
        "reviewed_product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "reviewed_product_variant": {
          "Color": "White"
        },
        "is_vine": false
      }
    ],
    "top_reviews_global": [],
    "delivery": "FREE delivery Tomorrow",
    "primary_delivery_time": "Tomorrow",
    "delivery_time": "Tomorrow",
    "category": {
      "id": "electronics",
      "name": "Electronics"
    },
    "category_path": [
      {
        "id": "172282",
        "name": "Electronics",
        "link": "https://www.amazon.com/b?node=172282"
      }
    ],
    "product_variations_dimensions": [
      "color_name"
    ],
    "product_variations": {
      "color_name": [
        {
          "asin": "B0CHWRXH8B",
          "value": "White",
          "is_available": true
        }
      ]
    },
    "all_product_variations": {
      "B0CHWRXH8B": {
        "color_name": "White"
      }
    },
    "has_aplus": true,
    "aplus_text": "Adaptive Audio. Now playing.",
    "aplus_images": [
      "https://m.media-amazon.com/images/I/example-aplus.jpg"
    ],
    "has_brandstory": true,
    "frequently_bought_together": [],
    "landing_asin": "B0CHWRXH8B",
    "parent_asin": "B0CHWRXH8B"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/products

**Amazon batch product details**

Fetch up to 20 Amazon US products directly by ASIN. Successful products and per-ASIN errors are returned independently.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.products`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `asins` | `array[string]` | yes | One to 20 Amazon Standard Identification Numbers. | ["B0CHWRXH8B","B09XS7JWHH"] |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "asins": [
    "B0CHWRXH8B",
    "B09XS7JWHH"
  ]
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/products' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "asins": [
    "B0CHWRXH8B",
    "B09XS7JWHH"
  ]
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "asins": [
      "B0CHWRXH8B"
    ],
    "country": "US"
  },
  "data": {
    "items": [
      {
        "asin": "B0CHWRXH8B",
        "product_title": "Apple AirPods Pro (2nd Generation)",
        "product_price": "199.00",
        "product_original_price": "$249.00",
        "delivery_price": "FREE",
        "minimum_order_quantity": null,
        "currency": "USD",
        "country": "US",
        "domain": "www.amazon.com",
        "product_byline": "Visit the Apple Store",
        "product_byline_link": "https://www.amazon.com/stores/Apple/page/example",
        "product_byline_links": [
          "https://www.amazon.com/stores/Apple/page/example"
        ],
        "product_star_rating": "4.7",
        "product_num_ratings": 28912,
        "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "product_slug": "Apple-AirPods-Pro-2nd-Generation",
        "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
        "product_num_offers": 8,
        "product_availability": "In Stock",
        "product_condition": "Buy New",
        "is_best_seller": true,
        "is_amazon_choice": false,
        "is_prime": true,
        "main_buy_box": {
          "title": "Buy New",
          "price": "$199.00",
          "seller": "Amazon.com"
        },
        "buy_boxes": [
          {
            "title": "Buy New",
            "price": "$199.00"
          },
          {
            "title": "Used - Good",
            "price": "$169.00"
          }
        ],
        "climate_pledge_friendly": false,
        "sales_volume": "10K+ bought in past month",
        "about_product": [
          "Active Noise Cancellation removes up to twice as much background noise.",
          "USB-C charging and up to 6 hours of listening time."
        ],
        "product_description": "Wireless earbuds with active noise cancellation.",
        "product_information": {
          "Brand": "Apple",
          "Model Name": "AirPods Pro"
        },
        "rating_distribution": {
          "5": 82,
          "4": 10,
          "3": 3,
          "2": 2,
          "1": 3
        },
        "product_photos": [
          "https://m.media-amazon.com/images/I/example-main.jpg",
          "https://m.media-amazon.com/images/I/example-alt.jpg"
        ],
        "product_videos": [
          {
            "id": "example-video",
            "title": "AirPods Pro overview",
            "video_url": "https://m.media-amazon.com/images/S/vse-vms/example.mp4",
            "video_height": "1080",
            "video_width": "1920",
            "thumbnail_url": "https://m.media-amazon.com/images/I/example-video.jpg",
            "product_asin": "B0CHWRXH8B",
            "parent_asin": "B0CHWRXH8B"
          }
        ],
        "user_uploaded_videos": [],
        "video_thumbnail": "https://m.media-amazon.com/images/I/example-video.jpg",
        "has_video": true,
        "product_details": {
          "Brand": "Apple",
          "Model Name": "AirPods Pro"
        },
        "top_reviews": [
          {
            "review_id": "R1EXAMPLE",
            "review_title": "Excellent earbuds",
            "review_comment": "The noise cancellation and sound quality are excellent.",
            "review_star_rating": "5.0",
            "review_link": "https://www.amazon.com/gp/customer-reviews/R1EXAMPLE",
            "review_author_id": "EXAMPLEUSER",
            "review_author": "Example customer",
            "review_author_url": "https://www.amazon.com/gp/profile/EXAMPLEUSER",
            "review_author_avatar": null,
            "review_images": [],
            "review_video": null,
            "review_date": "Reviewed in the United States on July 1, 2026",
            "is_verified_purchase": true,
            "helpful_vote_statement": "12 people found this helpful",
            "reviewed_product_asin": "B0CHWRXH8B",
            "reviewed_product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
            "reviewed_product_variant": {
              "Color": "White"
            },
            "is_vine": false
          }
        ],
        "top_reviews_global": [],
        "delivery": "FREE delivery Tomorrow",
        "primary_delivery_time": "Tomorrow",
        "delivery_time": "Tomorrow",
        "category": {
          "id": "electronics",
          "name": "Electronics"
        },
        "category_path": [
          {
            "id": "172282",
            "name": "Electronics",
            "link": "https://www.amazon.com/b?node=172282"
          }
        ],
        "product_variations_dimensions": [
          "color_name"
        ],
        "product_variations": {
          "color_name": [
            {
              "asin": "B0CHWRXH8B",
              "value": "White",
              "is_available": true
            }
          ]
        },
        "all_product_variations": {
          "B0CHWRXH8B": {
            "color_name": "White"
          }
        },
        "has_aplus": true,
        "aplus_text": "Adaptive Audio. Now playing.",
        "aplus_images": [
          "https://m.media-amazon.com/images/I/example-aplus.jpg"
        ],
        "has_brandstory": true,
        "frequently_bought_together": [],
        "landing_asin": "B0CHWRXH8B",
        "parent_asin": "B0CHWRXH8B"
      }
    ],
    "errors": []
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/autocomplete

**Amazon autocomplete**

Fetch Amazon US search suggestions directly from Amazon's public completion service.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.autocomplete`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `prefix` | `string` | yes | Partial Amazon search phrase to complete. | wireless head |
| `department` | `string` | no | Amazon search alias such as aps, electronics, books, or fashion. | aps |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "prefix": "wireless head",
  "limit": 5
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/autocomplete' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "prefix": "wireless head",
  "limit": 5
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "prefix": "wireless head",
    "department": "aps",
    "limit": 5,
    "country": "US"
  },
  "data": {
    "prefix": "wireless head",
    "suggestions": [
      {
        "value": "wireless headphones",
        "type": "KEYWORD",
        "ref_tag": "nb_sb_ss_example",
        "candidate_sources": "local",
        "strategy_id": "p13n-example",
        "image_url": "https://m.media-amazon.com/images/I/example.jpg"
      }
    ],
    "total": 1,
    "response_id": "example-response-id"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/search

**Amazon product search**

Search Amazon US directly without JavaScript and return product cards plus pagination.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.search`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `department` | `string` | no | Amazon search alias such as aps, electronics, books, or fashion. | aps |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "wireless headphones",
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "wireless headphones",
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "query": "wireless headphones",
    "department": "aps",
    "sort": "featured",
    "page": 1,
    "country": "US"
  },
  "data": {
    "page": 1,
    "products": [
      {
        "position": 1,
        "asin": "B0CHWRXH8B",
        "product_title": "Apple AirPods Pro (2nd Generation)",
        "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
        "product_price": "199.00",
        "product_original_price": "249.00",
        "currency": "USD",
        "product_star_rating": "4.7",
        "product_num_ratings": 28912,
        "is_prime": true,
        "is_sponsored": false,
        "badge": "Best Seller",
        "coupon": null,
        "delivery": "FREE delivery Tomorrow"
      }
    ],
    "total_products": 1,
    "has_next_page": true,
    "next_page": 2
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/rankings

**Amazon product rankings**

Fetch Amazon Best Sellers, New Releases, Most Wished For, or Most Gifted rankings directly.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.rankings`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `category` | `string` | no | Amazon category slug or browse node ID. | electronics |
| `list_type` | `string` | no | Amazon ranking list: best_sellers, new_releases, most_wished_for, or most_gifted. | best_sellers |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "category": "electronics",
  "list_type": "best_sellers"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/rankings' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "category": "electronics",
  "list_type": "best_sellers"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "category": "electronics",
    "list_type": "best_sellers",
    "page": 1,
    "country": "US"
  },
  "data": {
    "list_type": "best_sellers",
    "category": "electronics",
    "page": 1,
    "products": [
      {
        "position": 1,
        "asin": "B0CHWRXH8B",
        "product_title": "Apple AirPods Pro (2nd Generation)",
        "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
        "product_price": "199.00",
        "product_original_price": "249.00",
        "currency": "USD",
        "product_star_rating": "4.7",
        "product_num_ratings": 28912,
        "is_prime": true,
        "is_sponsored": false,
        "badge": "Best Seller",
        "coupon": null,
        "delivery": "FREE delivery Tomorrow",
        "rank": 1
      }
    ],
    "total_products": 1
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/deals

**Amazon deals**

Fetch visible Amazon US deal products directly from the public deals page.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.deals`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/deals' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "page": 1,
    "country": "US"
  },
  "data": {
    "page": 1,
    "products": [
      {
        "position": 1,
        "asin": "B0CHWRXH8B",
        "product_title": "Apple AirPods Pro (2nd Generation)",
        "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
        "product_price": "199.00",
        "product_original_price": "249.00",
        "currency": "USD",
        "product_star_rating": "4.7",
        "product_num_ratings": 28912,
        "is_prime": true,
        "is_sponsored": false,
        "badge": "Best Seller",
        "coupon": null,
        "delivery": "FREE delivery Tomorrow",
        "discount_percentage": 20,
        "deal_badge": "Limited time deal"
      }
    ],
    "total_products": 1
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/seller/profile

**Amazon seller profile**

Fetch a public Amazon US seller profile, feedback summary, and policy sections directly.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.seller_profile`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `seller_id` | `string` | yes | Amazon marketplace seller ID. | A1G5HZJBD8LJ0M |
| `asin` | `string` | no | Ten-character Amazon Standard Identification Number. | B0CHWRXH8B |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "seller_id": "A1G5HZJBD8LJ0M",
  "asin": "B0F2GYMC8H"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/seller/profile' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "seller_id": "A1G5HZJBD8LJ0M",
  "asin": "B0F2GYMC8H"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "seller_id": "A1G5HZJBD8LJ0M",
    "asin": "B0F2GYMC8H",
    "country": "US"
  },
  "data": {
    "seller_id": "A1G5HZJBD8LJ0M",
    "asin": "B0F2GYMC8H",
    "seller_name": "Example Seller",
    "rating_distribution": {
      "5": 92,
      "4": 5,
      "3": 1,
      "2": 1,
      "1": 1
    },
    "feedback": [
      "5 out of 5 stars Fast delivery"
    ],
    "about": "Example Seller storefront information.",
    "detailed_seller_information": "Business details supplied by Amazon.",
    "shipping_policies": "Shipping policy text.",
    "return_refund_policies": "Return and refund policy text.",
    "other_policies": null,
    "a_to_z_guarantee": "Amazon A-to-z Guarantee information.",
    "products_url": "https://www.amazon.com/s?me=A1G5HZJBD8LJ0M"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/seller/products

**Amazon seller products**

Fetch a public Amazon US seller's product listings directly with pagination.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.seller_products`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `seller_id` | `string` | yes | Amazon marketplace seller ID. | A1G5HZJBD8LJ0M |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "seller_id": "A1G5HZJBD8LJ0M",
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/seller/products' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "seller_id": "A1G5HZJBD8LJ0M",
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "seller_id": "A1G5HZJBD8LJ0M",
    "sort": "featured",
    "page": 1,
    "country": "US"
  },
  "data": {
    "page": 1,
    "products": [
      {
        "position": 1,
        "asin": "B0CHWRXH8B",
        "product_title": "Apple AirPods Pro (2nd Generation)",
        "product_url": "https://www.amazon.com/dp/B0CHWRXH8B",
        "product_photo": "https://m.media-amazon.com/images/I/example-main.jpg",
        "product_price": "199.00",
        "product_original_price": "249.00",
        "currency": "USD",
        "product_star_rating": "4.7",
        "product_num_ratings": 28912,
        "is_prime": true,
        "is_sponsored": false,
        "badge": "Best Seller",
        "coupon": null,
        "delivery": "FREE delivery Tomorrow"
      }
    ],
    "total_products": 1,
    "has_next_page": true,
    "next_page": 2
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/amazon/categories

**Amazon ranking categories**

Fetch Amazon's public ranking category navigation directly for a category and list type.

- Category: `Amazon`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `amazon.categories`
- Provider source: `Direct · Amazon`
- Provider routing: Connects to Amazon directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `category` | `string` | no | Amazon category slug or browse node ID. | electronics |
| `list_type` | `string` | no | Amazon ranking list: best_sellers, new_releases, most_wished_for, or most_gifted. | best_sellers |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "category": "electronics",
  "list_type": "best_sellers"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/amazon/categories' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "category": "electronics",
  "list_type": "best_sellers"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "625f7a5a-6fb2-4423-a9ac-a96cbf5e87f8",
  "provider": "amazon_direct",
  "parameters": {
    "category": "electronics",
    "list_type": "best_sellers",
    "country": "US"
  },
  "data": {
    "current_category": "electronics",
    "list_type": "best_sellers",
    "categories": [
      {
        "id": "electronics",
        "name": "Electronics",
        "url": "https://www.amazon.com/Best-Sellers/zgbs/electronics",
        "selected": true
      }
    ],
    "total_categories": 1
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/dogpile/search

**Dogpile web search**

Search Dogpile's metasearch web results through its direct JSON endpoint. All configured proxy lanes race in parallel and the first valid response wins.

- Category: `Dogpile Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `dogpile.search`
- Provider source: `Direct · Dogpile Search`
- Provider routing: Connects to Dogpile Search directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `num` | `integer` | no | Requested Dogpile result count, from 1 through 8. Minimum: 1. Maximum: 8. | 10 |
| `page` | `integer` | no | One-based Dogpile result page, from 1 through 100. Minimum: 1. Maximum: 100. | 1 |
| `safe` | `boolean` | no | Use Dogpile's strict safe-search filter. | true |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Benable company",
  "num": 8,
  "page": 1,
  "safe": false
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/dogpile/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Benable company",
  "num": 8,
  "page": 1,
  "safe": false
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "Benable company",
    "type": "web",
    "num": 8,
    "page": 1,
    "safe": false,
    "backend": "dogpile"
  },
  "totalResults": 90800,
  "organic": [
    {
      "title": "Benable - Shareable lists of things you recommend",
      "link": "https://benable.com/",
      "snippet": "Share recommendations with people you trust.",
      "displayedLink": "https://benable.com/",
      "domain": "benable.com",
      "source": "benable.com",
      "position": 1,
      "sourceIndex": 0
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "dogpile_direct",
  "attempts": [
    {
      "proxy": "isp",
      "status": 200,
      "duration_ms": 418.2
    }
  ],
  "proxy": "isp"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/dogpile/images

**Dogpile image search**

Search Dogpile Images through its direct JSON endpoint. All configured proxy lanes race in parallel; if Dogpile's browser-token gate rejects them, the same request falls back to Startpage's direct Bing-backed image results.

- Category: `Dogpile Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `dogpile.images`
- Provider source: `Direct · Dogpile Search`
- Provider routing: Connects to Dogpile Search directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `num` | `integer` | no | Requested Dogpile result count, from 1 through 20. Minimum: 1. Maximum: 20. | 10 |
| `page` | `integer` | no | One-based Dogpile result page, from 1 through 100. Minimum: 1. Maximum: 100. | 1 |
| `safe` | `boolean` | no | Use Dogpile's strict safe-search filter. | true |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple inc",
  "num": 20,
  "page": 1,
  "safe": false
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/dogpile/images' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple inc",
  "num": 20,
  "page": 1,
  "safe": false
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "apple inc",
    "type": "images",
    "num": 20,
    "page": 1,
    "safe": false,
    "backend": "dogpile"
  },
  "totalResults": 2730000000,
  "totalPages": 30,
  "images": [
    {
      "title": "Apple Inc. - Wikipedia",
      "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Apple_logo_black.svg",
      "link": "https://en.wikipedia.org/wiki/Apple_Inc.",
      "source": "en.wikipedia.org",
      "domain": "en.wikipedia.org",
      "displayedLink": "https://en.wikipedia.org/wiki/Apple_Inc.",
      "position": 1,
      "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=example",
      "thumbnailWidth": 150,
      "thumbnailHeight": 184,
      "imageWidth": 814,
      "imageHeight": 1000,
      "format": "image/svg+xml",
      "filesize": 660,
      "sourceIndex": 0
    }
  ],
  "success": true,
  "duration": "0.47",
  "statusCode": 200,
  "provider": "dogpile_direct",
  "attempts": [
    {
      "proxy": "residential",
      "status": 200,
      "duration_ms": 465.8
    }
  ],
  "proxy": "residential"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/startpage/search

**Startpage web search**

Search Startpage's Google-backed web results directly without Serper, RapidAPI, or a browser.

- Category: `Startpage Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `startpage.search`
- Provider source: `Direct · Startpage Search`
- Provider routing: Connects to Startpage Search directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `num` | `integer` | no | Requested Startpage result count, from 1 through 10. Minimum: 1. Maximum: 10. | 10 |
| `page` | `integer` | no | One-based Startpage result page, from 1 through 5. Minimum: 1. Maximum: 5. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Benable company",
  "num": 10,
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/startpage/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Benable company",
  "num": 10,
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "Benable company",
    "type": "web",
    "num": 10,
    "page": 1,
    "language": "english",
    "safe": "moderate",
    "backend": "google"
  },
  "organic": [
    {
      "title": "Benable - Shareable Recommendations",
      "link": "https://benable.com/",
      "snippet": "Create and share recommendations.",
      "source": "Benable",
      "domain": "benable.com",
      "displayedLink": "https://benable.com/",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.74",
  "statusCode": 200,
  "provider": "startpage_direct",
  "attempts": [
    {
      "proxy": "mobile",
      "status": 200
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/startpage/images

**Startpage image search**

Search Startpage's Bing-backed image results directly without Serper, RapidAPI, or a browser.

- Category: `Startpage Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `startpage.images`
- Provider source: `Direct · Startpage Search`
- Provider routing: Connects to Startpage Search directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `num` | `integer` | no | Requested Startpage result count, from 1 through 50. Minimum: 1. Maximum: 50. | 10 |
| `page` | `integer` | no | One-based Startpage result page, from 1 through 5. Minimum: 1. Maximum: 5. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple inc",
  "num": 20,
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/startpage/images' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple inc",
  "num": 20,
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "apple inc",
    "type": "images",
    "num": 20,
    "page": 1,
    "language": "english",
    "safe": "moderate",
    "backend": "bing"
  },
  "images": [
    {
      "title": "Apple Inc.",
      "imageUrl": "https://example.com/apple.jpg",
      "imageWidth": 1200,
      "imageHeight": 800,
      "thumbnailUrl": "https://www.startpage.com/av/proxy-image",
      "thumbnailWidth": 500,
      "thumbnailHeight": 333,
      "source": "example.com",
      "domain": "example.com",
      "link": "https://example.com/apple",
      "format": "jpeg",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.81",
  "statusCode": 200,
  "provider": "startpage_direct",
  "attempts": [
    {
      "proxy": "residential",
      "status": 200
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/search

**Google search**

Search live Google results through Serper.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.search`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Benable company",
  "num": 10,
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Benable company",
  "num": 10,
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "organic": [
    {
      "title": "Benable - Shareable Recommendations",
      "link": "https://benable.com/",
      "snippet": "Create and share recommendations.",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/images

**Google images**

Search Google Images through Serper and return the raw image result payload.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.images`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `aspect` | `string` | no | Google image or video aspect filter. | wide |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple inc",
  "num": 10
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/images' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple inc",
  "num": 10
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "images": [
    {
      "title": "Apple Inc.",
      "imageUrl": "https://example.com/apple.jpg",
      "thumbnailUrl": "https://example.com/apple-thumb.jpg",
      "source": "Example",
      "link": "https://example.com/apple",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/videos

**Google videos**

Search Google Videos through Serper and return the raw video result payload.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.videos`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `aspect` | `string` | no | Google image or video aspect filter. | wide |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple inc",
  "num": 10
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/videos' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple inc",
  "num": 10
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "videos": [
    {
      "title": "Apple company overview",
      "link": "https://example.com/video",
      "snippet": "An overview of Apple Inc.",
      "imageUrl": "https://example.com/video-thumb.jpg",
      "duration": "3:12",
      "source": "YouTube",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/places

**Google places**

Search Google Places through Serper and return the raw place result payload.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.places`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `ll` | `string` | no | Google Maps viewport as @latitude,longitude,zoomz. | @40.7578,-73.9787,16z |
| `radius` | `integer` | no | Optional map search bias radius in meters. | 0 |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Apple Store New York"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/places' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Apple Store New York"
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "places": [
    {
      "position": 1,
      "title": "Apple Fifth Avenue",
      "address": "767 5th Ave, New York, NY 10153",
      "latitude": 40.7636,
      "longitude": -73.9726,
      "rating": 4.4,
      "ratingCount": 14800,
      "type": "Electronics store",
      "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
      "cid": "5751726597071950148"
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/maps

**Google maps**

Search Google Maps by query/q or fetch a place by placeId or cid through Serper.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.maps`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Request constraints

- Supply at least one of: `query`, `q`, `placeId`, `cid`.

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | no | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `ll` | `string` | no | Google Maps viewport as @latitude,longitude,zoomz. | @40.7578,-73.9787,16z |
| `radius` | `integer` | no | Optional map search bias radius in meters. | 0 |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `placeId` | `string` | no | Google Maps place ID returned by Serper Maps or Places. | ChIJp-0cdPBYwokRRNGjt9080k8 |
| `cid` | `string` | no | Google Maps customer ID returned by Serper Maps or Places. | 5751726597071950148 |
| `fid` | `string` | no | Google Maps feature ID returned by Serper Maps. | 0x89c258f0741ceda7:0x4fd23cddb7a3d144 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Apple Fifth Avenue New York",
  "ll": "@40.7578,-73.9787,16z"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/maps' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Apple Fifth Avenue New York",
  "ll": "@40.7578,-73.9787,16z"
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "places": [
    {
      "position": 1,
      "title": "Apple Fifth Avenue",
      "address": "767 5th Ave, New York, NY 10153",
      "latitude": 40.7636,
      "longitude": -73.9726,
      "rating": 4.4,
      "ratingCount": 14800,
      "type": "Electronics store",
      "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
      "cid": "5751726597071950148"
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/reviews

**Google reviews**

Fetch Google Maps reviews through Serper. At least one of cid, fid, or placeId is required.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.reviews`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Request constraints

- Supply at least one of: `cid`, `fid`, `placeId`.

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `cid` | `string` | no | Google Maps customer ID returned by Serper Maps or Places. | 5751726597071950148 |
| `fid` | `string` | no | Google Maps feature ID returned by Serper Maps. | 0x89c258f0741ceda7:0x4fd23cddb7a3d144 |
| `placeId` | `string` | no | Google Maps place ID returned by Serper Maps or Places. | ChIJp-0cdPBYwokRRNGjt9080k8 |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `topicId` | `string` | no | Google Maps review topic identifier. | service |
| `nextPageToken` | `string` | no | Opaque token returned by Serper for the next reviews page. | next-page-token |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
  "sortBy": "mostRelevant"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/reviews' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
  "sortBy": "mostRelevant"
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
    "sortBy": "mostRelevant"
  },
  "reviews": [
    {
      "id": "review_123",
      "rating": 5,
      "user": {
        "name": "Example Reviewer"
      },
      "date": "a month ago",
      "snippet": "Helpful staff and a great location.",
      "likes": 3
    }
  ],
  "nextPageToken": "opaque-next-page-token",
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/news

**Google news**

Search Google News through Serper and return the raw news result payload.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.news`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `allowSuggested` | `boolean` | no | Allow suggested Google News results. | true |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple inc",
  "tbs": "qdr:w"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/news' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple inc",
  "tbs": "qdr:w"
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "news": [
    {
      "title": "Apple announces product update",
      "link": "https://example.com/apple-news",
      "snippet": "The company announced an update today.",
      "date": "2 hours ago",
      "source": "Example News",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/google/shopping

**Google shopping**

Search Google Shopping through Serper and return the raw shopping result payload.

- Category: `Google Search`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `google.shopping`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `q` | `string` | no | Google query alias. | Benable company |
| `num` | `integer` | no | Requested search result count. Some providers normalize to a fixed batch size. Minimum: 1. Maximum: 100. | 10 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `start` | `integer` | no | Zero-based Google result offset. Use as an alternative to page. Minimum: 0. | 10 |
| `tbs` | `string` | no | Google time or search-tools filter, such as qdr:h, qdr:d, qdr:w, qdr:m, or qdr:y. | qdr:w |
| `autocorrect` | `boolean` | no | Allow the search provider to correct the query spelling. | true |
| `safe` | `boolean` | no | Enable strict SafeSearch filtering. | true |
| `filter` | `integer` | no | Google duplicate-content filter: 1 enables it and 0 disables it. Allowed: 0, 1. | 1 |
| `gl` | `string` | no | Two-letter country code used to localize Google results. | us |
| `hl` | `string` | no | Language code used for the Google interface and result labels. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `lr` | `string` | no | Restrict results to a Google language code. | lang_en |
| `cr` | `string` | no | Restrict results to a Google country code. | countryUS |
| `as_q` | `string` | no | Require all additional words in the Google search. | artificial intelligence |
| `as_epq` | `string` | no | Require an exact phrase in the Google search. | machine learning |
| `as_oq` | `string` | no | Require at least one of these words in the Google search. | startup founder |
| `as_eq` | `string` | no | Exclude these words from the Google search. | jobs careers |
| `as_sitesearch` | `string` | no | Restrict Google results to a domain or site. | example.com |
| `as_filetype` | `string` | no | Restrict Google results to a file type. | pdf |
| `as_rights` | `string` | no | Apply a Google usage-rights filter. | cc_publicdomain |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `sortBy` | `string` | no | Vertical-specific Google sort mode, such as date, rating, newest, or mostRelevant. | mostRelevant |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "apple iphone",
  "num": 40
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/google/shopping' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "apple iphone",
  "num": 40
}'
```

#### Response example (illustrative)

```json
{
  "searchParameters": {
    "q": "example query",
    "num": 10,
    "page": 1
  },
  "shopping": [
    {
      "title": "Apple iPhone",
      "source": "Example Store",
      "link": "https://example.com/iphone",
      "price": "$799.00",
      "rating": 4.7,
      "ratingCount": 1250,
      "imageUrl": "https://example.com/iphone.jpg",
      "position": 1
    }
  ],
  "success": true,
  "duration": "0.42",
  "statusCode": 200,
  "provider": "serper_google"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/maps/place/autocomplete

**Maps place autocomplete**

Find candidate map places for a text query.

- Category: `Maps`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `maps.place_autocomplete`
- Provider source: `Third-party API · Wanderlog`
- Provider routing: Calls Wanderlog directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `language` | `string` | no | Response language. | en |
| `location` | `string` | no | Search location. | New York, NY |
| `location_bias` | `object` | no | Optional map bias location. | {"longitude":0,"latitude":0} |
| `radius` | `integer` | no | Optional map search bias radius in meters. | 0 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Tunnels Beach Kauai HI"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/maps/place/autocomplete' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Tunnels Beach Kauai HI"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "candidates": [
    {
      "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
      "description": "Tunnels Beach, Hawaii, USA"
    }
  ],
  "data": {
    "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
    "candidates": []
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "maps"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/maps/place/details

**Maps place details**

Fetch map place details by place_id.

- Category: `Maps`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `maps.place_details`
- Provider source: `Third-party API · Wanderlog`
- Provider routing: Calls Wanderlog directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `place_id` | `string` | yes | Map place ID. | ChIJN1t_tDeuEmsRUsoyG83frY4 |
| `language` | `string` | no | Response language. | en |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/maps/place/details' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "place": {
    "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
    "name": "Tunnels Beach",
    "formatted_address": "Kauai, HI, USA",
    "latitude": 22.224,
    "longitude": -159.56
  },
  "data": {
    "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "maps"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/maps/search

**Maps search**

Search map places by query.

- Category: `Maps`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `maps.search`
- Provider source: `Third-party API · Serper`
- Provider routing: Calls Serper directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `language` | `string` | no | Response language. | en |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "Tunnels Beach kauai.com",
  "page": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/maps/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "Tunnels Beach kauai.com",
  "page": 1
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "places": [
    {
      "position": 1,
      "title": "Apple Fifth Avenue",
      "address": "767 5th Ave, New York, NY 10153",
      "latitude": 40.7636,
      "longitude": -73.9726,
      "rating": 4.4,
      "ratingCount": 14800,
      "type": "Electronics store",
      "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
      "cid": "5751726597071950148"
    }
  ],
  "has_places": true,
  "data": {
    "places": [
      {
        "position": 1,
        "title": "Apple Fifth Avenue",
        "address": "767 5th Ave, New York, NY 10153",
        "latitude": 40.7636,
        "longitude": -73.9726,
        "rating": 4.4,
        "ratingCount": 14800,
        "type": "Electronics store",
        "placeId": "ChIJp-0cdPBYwokRRNGjt9080k8",
        "cid": "5751726597071950148"
      }
    ]
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "maps"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/video/transcripts

**Transcribe video**

Synchronously download a public video or audio URL, normalize its audio to FLAC, and transcribe it with Groq Whisper Large V3 Turbo. Videos are limited to 10 minutes and 500 MB. The service returns HTTP 429 immediately when its configured per-box admission limit is full.

- Category: `Video`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `video.transcript`
- Provider source: `Direct API · groq_whisper`
- Provider routing: Downloads media with yt-dlp, extracts 16 kHz mono FLAC with FFmpeg, and transcribes it with Groq Whisper Large V3 Turbo.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `600 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `video_url` | `string` | yes | Public HTTP(S) video or audio URL to transcribe. | https://raw.githubusercontent.com/ggerganov/whisper.cpp/master/samples/jfk.wav |
| `language` | `string` | no | Response language. | en |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "video_url": "https://raw.githubusercontent.com/ggerganov/whisper.cpp/master/samples/jfk.wav"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/video/transcripts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "video_url": "https://raw.githubusercontent.com/ggerganov/whisper.cpp/master/samples/jfk.wav"
}'
```

#### Response example (illustrative)

```json
{
  "transcript": "And so my fellow Americans ask not what your country can do for you, ask what you can do for your country.",
  "language": "english"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/web/fetch

**Fetch webpage**

Fetch one URL. render_js=true (the default) uses Benable's Browserr service. With render_js=false, timeouts below 10000 ms race Intel Agent direct HTTP against one matching ScrapingBee request and return the first usable result; longer timeouts keep direct-first conditional fallback behavior. Binary content is base64-encoded when response_format=json is requested.

- Category: `Web Access`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `text/html`
- Agent tool: `web.fetch`
- Provider source: `Hybrid · Browserr / Intel Agent Direct / ScrapingBee`
- Provider routing: Uses Browserr for render_js=true. With render_js=false, timeouts below 10000 ms race direct HTTP against matching ScrapingBee; longer timeouts use ScrapingBee only after an unusable direct result. dc uses regular, residential uses premium, and mobile uses stealth.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `60 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `render_js` | `boolean` | no | Use Browserr when true, which is the default. When false, timeouts below 10000 ms race direct HTTP and matching ScrapingBee; longer timeouts use direct-first conditional fallback. | false |
| `proxy_type` | `string` | no | Optional proxy class. Browserr defaults to residential; direct mode adaptively races Intel Agent's proxy pool when omitted. ScrapingBee maps dc to regular, residential to premium, and mobile to stealth. Allowed: dc, residential, mobile. | residential |
| `timeout_ms` | `integer` | no | Provider timeout in milliseconds. Below 10000, direct and ScrapingBee run concurrently with up to 3000 ms of bounded completion grace; at 10000 or above, fallback remains sequential. Rendered fetches default to 60000. Minimum: 1000. Maximum: 60000. | 60000 |
| `wait_until` | `string` | no | Browserr navigation readiness signal. Defaults to domcontentloaded. Allowed: domcontentloaded, load, networkidle, networkidle0, networkidle2. | domcontentloaded |
| `wait_for_selector` | `string` | no | CSS selector or XPath expression Browserr must observe after navigation. | main |
| `wait_for_expression` | `object` | no | Browser JavaScript readiness expression. | {"expression":"document.readyState === 'complete'","timeoutMs":5000,"required":false} |
| `extra_wait_ms` | `integer` | no | Additional wait after Browserr readiness checks. Defaults to 1000 for client-side hydration. Minimum: 0. Maximum: 10000. | 1000 |
| `headers` | `object` | no | Request headers. Only accept is client-settable and it is preserved for direct and fallback fetches. | {"accept":"text/html,application/xhtml+xml"} |
| `cookies` | `string | array[object]` | no | Cookie header string or structured cookie array, preserved for direct and fallback fetches. | consent=yes |
| `actions` | `array[object]` | no | Browserr actions to run after navigation. | [{"type":"waitForSelector","selector":"main","timeoutMs":5000}] |
| `html_capture` | `object` | no | Browserr custom HTML capture expression configuration. | {"expression":"document.documentElement.outerHTML"} |
| `screenshot` | `boolean | object` | no | Browserr screenshot toggle or capture options. | false |
| `block_ads` | `boolean` | no | Enable Browserr ad blocking. | false |
| `block_resources` | `boolean` | no | Ask Browserr to block nonessential resources. | false |
| `stop_loading_after_ready` | `boolean` | no | Stop page loading once Browserr readiness is satisfied. | false |
| `capture_runtime_issues` | `boolean` | no | Include Browserr navigation, console, exception, viewport, and content diagnostics. | false |
| `diagnostics` | `boolean` | no | Enable Browserr adapter diagnostics. | false |
| `response_format` | `string` | no | Return the raw upstream body by default, or structured Intel Agent JSON when set to json or structured. Binary JSON bodies use body_base64 with body_encoding=base64. Allowed: html, json, structured. | html |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://example.com",
  "render_js": false
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/web/fetch' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: text/html' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://example.com",
  "render_js": false
}'
```

#### Response example (illustrative)

```html
<!doctype html><html><head><title>Example</title></head><body>...</body></html>
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/video

**TikTok video**

Fetch TikTok video metadata/download data by url.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.video`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `hd` | `string` | no | TikTok HD flag. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://www.tiktok.com/@tiktok/video/7231338487075638570"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/video' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.tiktok.com/@tiktok/video/7231338487075638570"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "7657202472431144222",
    "title": "Example TikTok",
    "author": {
      "uniqueId": "example_creator"
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/info

**TikTok user info**

Fetch TikTok user information by unique_id.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_info`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `unique_id` | `string` | yes | TikTok username without @. | tiktok |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "unique_id": "tiktok"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/info' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "unique_id": "tiktok"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "user": {
      "id": "107955",
      "uniqueId": "tiktok",
      "nickname": "TikTok"
    },
    "stats": {
      "followerCount": 81000000,
      "videoCount": 1200
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/by_id

**TikTok user info by ID**

Fetch TikTok user information by numeric user_id through TikTok's canonical public user-share redirect.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_by_id`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "107955"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/by_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "107955"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "user": {
      "id": "107955",
      "uniqueId": "tiktok",
      "nickname": "TikTok"
    },
    "stats": {
      "followerCount": 81000000,
      "videoCount": 1200
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/username_to_id

**TikTok username to ID**

Resolve an exact TikTok username to its numeric user ID.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.username_to_id`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username` | `string` | yes | Social profile username, with or without @. | javan |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username": "tiktok"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/username_to_id' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "tiktok"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "107955",
    "uniqueId": "tiktok"
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/followers

**TikTok user followers**

Fetch TikTok follower accounts by numeric user_id while preserving the legacy tiktok-video-no-watermark2 data.followers and data.total payload. TokAPI serves a single page, so count is capped at 150 and there is no pagination cursor.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_followers`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "107955",
  "count": 50
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/followers' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "107955",
  "count": 50
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "code": 0,
  "msg": "success",
  "data": {
    "followers": [
      {
        "id": "6727534279126090757",
        "region": "AE",
        "sec_uid": "MS4wLjABAAAAexample",
        "unique_id": "example_follower",
        "nickname": "Example Follower",
        "signature": "Example profile biography",
        "avatar": "https://example.com/avatar-300.jpeg",
        "verified": false,
        "secret": false,
        "aweme_count": 238,
        "following_count": 124,
        "follower_count": 1356,
        "favoriting_count": 1474,
        "total_favorited": 9192,
        "ins_id": "",
        "youtube_channel_title": "",
        "youtube_channel_id": "",
        "twitter_name": "",
        "twitter_id": ""
      }
    ],
    "total": 94836778
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/following

**TikTok user following**

Fetch accounts followed by a TikTok user by numeric user_id while preserving the legacy tiktok-video-no-watermark2 data.followings and data.total payload. TokAPI serves a single page, so count is capped at 150 and there is no pagination cursor.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_following`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "107955",
  "count": 50
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/following' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "107955",
  "count": 50
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "code": 0,
  "msg": "success",
  "data": {
    "followings": [
      {
        "id": "6727534279126090757",
        "region": "AE",
        "sec_uid": "MS4wLjABAAAAexample",
        "unique_id": "example_following",
        "nickname": "Example Following",
        "signature": "Example profile biography",
        "avatar": "https://example.com/avatar-300.jpeg",
        "verified": false,
        "secret": false,
        "aweme_count": 238,
        "following_count": 124,
        "follower_count": 1356,
        "favoriting_count": 1474,
        "total_favorited": 9192,
        "ins_id": "",
        "youtube_channel_title": "",
        "youtube_channel_id": "",
        "twitter_name": "",
        "twitter_id": ""
      }
    ],
    "total": 94836778
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/posts

**TikTok user posts**

Fetch TikTok user posts by unique_id. Pass the previous cursor to fetch the next page.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_posts`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `unique_id` | `string` | yes | TikTok username without @. | tiktok |
| `count` | `integer` | no | Provider page size. | 50 |
| `cursor` | `integer` | no | Provider pagination cursor. | 0 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "unique_id": "tiktok",
  "count": 10,
  "cursor": 0
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "unique_id": "tiktok",
  "count": 10,
  "cursor": 0
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "videos": [
      {
        "video_id": "7657202472431144222",
        "title": "Example post"
      }
    ],
    "cursor": "1783181969000",
    "hasMore": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/user/search

**TikTok user search**

Search TikTok users by keywords.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.user_search`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keywords` | `string` | yes | Search keywords. | retail AI |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keywords": "retail AI"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/user/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keywords": "retail AI"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "item_123",
        "title": "Example result"
      }
    ],
    "cursor": 10,
    "hasMore": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/feed/search

**TikTok feed search**

Search TikTok feed by keywords with direct first-party token pagination and search filters. Pass the previous searchId as search_id with the previous cursor as offset.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.feed_search`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keywords` | `string` | yes | Search keywords. | retail AI |
| `count` | `integer` | no | Provider page size. | 50 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `search_id` | `string` | no | TikTok search token returned as searchId by the previous page. | 20260716123456789ABC |
| `region` | `string` | no | Two-letter region code used by TikTok mobile search. | US |
| `publish_time` | `integer` | no | TokAPI publish-time filter. | 1 |
| `sort_type` | `integer` | no | TokAPI sort type. | 3 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keywords": "home decor",
  "count": 10,
  "offset": 0,
  "region": "US",
  "publish_time": 1,
  "sort_type": 3
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/feed/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keywords": "home decor",
  "count": 10,
  "offset": 0,
  "region": "US",
  "publish_time": 1,
  "sort_type": 3
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "item_123",
        "title": "Example result"
      }
    ],
    "cursor": 10,
    "hasMore": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/music/info

**TikTok music info**

Fetch TikTok music info by url or music_id.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.music_info`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `music_id` | `string` | no | TikTok music ID. | 123456789 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "music_id": "123456789"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/music/info' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "music_id": "123456789"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "id": "7657202472431144222",
    "title": "Example TikTok",
    "author": {
      "uniqueId": "example_creator"
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/music/posts

**TikTok music posts**

Fetch TikTok music posts by music_id.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.music_posts`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `music_id` | `string` | yes | TikTok music ID. | 123456789 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "music_id": "123456789"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/music/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "music_id": "123456789"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "videos": [
      {
        "video_id": "7657202472431144222",
        "title": "Example post"
      }
    ],
    "cursor": 12,
    "hasMore": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/comments/list

**TikTok comments**

Fetch TikTok comments by url.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.comments_list`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | `string` | yes | Target URL. | https://example.com |
| `count` | `integer` | no | Provider page size. | 50 |
| `cursor` | `integer` | no | Provider pagination cursor. | 0 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "url": "https://www.tiktok.com/@tiktok/video/7231338487075638570"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/comments/list' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://www.tiktok.com/@tiktok/video/7231338487075638570"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "comments": [
      {
        "id": "comment_123",
        "text": "Example comment"
      }
    ],
    "cursor": 20,
    "has_more": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/comments/replies

**TikTok comment replies**

Fetch replies for one TikTok comment by video_id and comment_id.

- Category: `TikTok`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.comments_replies`
- Provider source: `Direct · TikTok`
- Provider routing: Connects to TikTok directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `video_id` | `string` | yes | TikTok video/post ID. | 7657202472431144222 |
| `comment_id` | `string` | yes | Provider comment ID. | 18047929775783434 |
| `count` | `integer` | no | Provider page size. | 50 |
| `cursor` | `integer` | no | Provider pagination cursor. | 0 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "video_id": "7657202472431144222",
  "comment_id": "7657224980169933576",
  "count": 50,
  "cursor": 0
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/comments/replies' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "video_id": "7657202472431144222",
  "comment_id": "7657224980169933576",
  "count": 50,
  "cursor": 0
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "comments": [
      {
        "id": "comment_123",
        "text": "Example comment"
      }
    ],
    "cursor": 20,
    "has_more": true
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "tiktok_direct"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/mobile/user

**TikTok mobile user profile**

Fetch a TokAPI mobile user profile by username. Returns the raw TokAPI payload, including the legacy user object and its precise profile statistics.

- Category: `TikTok Mobile`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.mobile_user`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `username` | `string` | yes | Social profile username, with or without @. | javan |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "username": "tiktok"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/mobile/user' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "username": "tiktok"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "status_code": 0,
    "status_msg": "",
    "user": {
      "uid": "107955",
      "unique_id": "tiktok",
      "nickname": "TikTok",
      "signature": "Example profile biography",
      "follower_count": 94800000,
      "following_count": 10,
      "aweme_count": 1550,
      "avatar_thumb": {
        "url_list": [
          "https://example.com/avatar.jpeg"
        ]
      }
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/mobile/user/posts

**TikTok mobile user posts**

Fetch TokAPI mobile user posts by numeric user_id. Returns the raw TokAPI payload.

- Category: `TikTok Mobile`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.mobile_user_posts`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `user_id` | `string` | yes | Numeric social account user ID. | 25025320 |
| `count` | `integer` | no | Provider page size. | 50 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `with_pinned_posts` | `integer` | no | TokAPI flag for pinned posts. | 1 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "user_id": "107955",
  "count": 10,
  "offset": 0,
  "with_pinned_posts": 1
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/mobile/user/posts' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "user_id": "107955",
  "count": 10,
  "offset": 0,
  "with_pinned_posts": 1
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "aweme_list": [
      {
        "aweme_id": "7657202472431144222",
        "desc": "Example post"
      }
    ],
    "has_more": 1,
    "cursor": 10
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/mobile/post

**TikTok mobile post detail**

Fetch TokAPI mobile post detail by aweme/post id. Returns the raw TokAPI payload.

- Category: `TikTok Mobile`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.mobile_post`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | yes | Provider object ID. | 7657202472431144222 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "id": "7657202472431144222"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/mobile/post' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "id": "7657202472431144222"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "aweme": {
      "aweme_id": "7657202472431144222",
      "desc": "Example post"
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/mobile/post/comments

**TikTok mobile post comments**

Fetch TokAPI mobile comments by aweme/post id. Returns the raw TokAPI payload.

- Category: `TikTok Mobile`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.mobile_post_comments`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `id` | `string` | yes | Provider object ID. | 7657202472431144222 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `count` | `integer` | no | Provider page size. | 50 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "id": "7657202472431144222",
  "offset": 0,
  "count": 50
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/mobile/post/comments' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "id": "7657202472431144222",
  "offset": 0,
  "count": 50
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "comments": [
      {
        "cid": "comment_123",
        "text": "Example comment"
      }
    ],
    "cursor": 20,
    "has_more": 1
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/tiktok/mobile/search/post

**TikTok mobile post search**

Search TokAPI mobile posts by keyword. Returns the raw TokAPI payload.

- Category: `TikTok Mobile`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `tiktok.mobile_search_post`
- Provider source: `RapidAPI · TokAPI Mobile`
- Provider routing: Uses TokAPI Mobile through RapidAPI (tokapi-mobile-version.p.rapidapi.com).
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `keyword` | `string` | yes | Search keyword. | retail AI |
| `count` | `integer` | no | Provider page size. | 50 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `region` | `string` | no | Two-letter region code used by TikTok mobile search. | US |
| `publish_time` | `integer` | no | TokAPI publish-time filter. | 1 |
| `sort_type` | `integer` | no | TokAPI sort type. | 3 |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "keyword": "home decor",
  "count": 10,
  "offset": 0,
  "region": "US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/tiktok/mobile/search/post' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "keyword": "home decor",
  "count": 10,
  "offset": 0,
  "region": "US"
}'
```

#### Response example (illustrative)

```json
{
  "success": true,
  "data": {
    "aweme": {
      "aweme_id": "7657202472431144222",
      "desc": "Example post"
    }
  },
  "duration": "0.42",
  "statusCode": 200,
  "provider": "rapidapi_tiktok_mobile"
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/yelp/search

**Yelp search**

Search Yelp businesses directly by location and search_term while preserving the legacy response payload.

- Category: `Yelp`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `yelp.search`
- Provider source: `Direct · Yelp`
- Provider routing: Connects to Yelp directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `location` | `string` | yes | Search location. | New York, NY |
| `search_term` | `string` | yes | Yelp search term. | pizza |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `business_details_type` | `string` | no | Yelp detail level. | basic |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "location": "New York, NY",
  "search_term": "pizza",
  "limit": 10
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/yelp/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "location": "New York, NY",
  "search_term": "pizza",
  "limit": 10
}'
```

#### Response example (illustrative)

```json
{
  "businesses": [
    {
      "name": "Example Pizza",
      "business_url": "https://www.yelp.com/biz/example-pizza",
      "rating": 4.5,
      "review_count": 325,
      "address": "123 Example St, New York, NY"
    }
  ],
  "total": 1
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/yelp/search/category

**Yelp category search**

Search Yelp businesses directly by location and search_category while preserving the legacy response payload.

- Category: `Yelp`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `yelp.search_category`
- Provider source: `Direct · Yelp`
- Provider routing: Connects to Yelp directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `location` | `string` | yes | Search location. | New York, NY |
| `search_category` | `string` | yes | Yelp category. | restaurants |
| `limit` | `integer` | no | Provider result limit. | 10 |
| `offset` | `integer` | no | Pagination offset. | 0 |
| `business_details_type` | `string` | no | Yelp detail level. | basic |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "location": "New York, NY",
  "search_category": "restaurants"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/yelp/search/category' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "location": "New York, NY",
  "search_category": "restaurants"
}'
```

#### Response example (illustrative)

```json
{
  "businesses": [
    {
      "name": "Example Pizza",
      "business_url": "https://www.yelp.com/biz/example-pizza",
      "rating": 4.5,
      "review_count": 325,
      "address": "123 Example St, New York, NY"
    }
  ],
  "total": 1
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/yelp/business

**Yelp business details**

Fetch Yelp business details directly by business_url. The legacy-compatible business object remains under business_details, not businesses.

- Category: `Yelp`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `yelp.business`
- Provider source: `Direct · Yelp`
- Provider routing: Connects to Yelp directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `business_url` | `string` | yes | Full Yelp business URL. | https://www.yelp.com/biz/example |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "business_url": "https://www.yelp.com/biz/mancinis-wood-fired-pizza-brooklyn-2"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/yelp/business' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "business_url": "https://www.yelp.com/biz/mancinis-wood-fired-pizza-brooklyn-2"
}'
```

#### Response example (illustrative)

```json
{
  "business_details": {
    "name": "Example Pizza",
    "business_url": "https://www.yelp.com/biz/example-pizza",
    "rating": 4.5,
    "review_count": 325,
    "address": "123 Example St, New York, NY"
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/yelp/businesses

**Yelp batch business details**

Fetch Yelp business details directly by business_ids while preserving the legacy batch response payload.

- Category: `Yelp`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `yelp.businesses`
- Provider source: `Direct · Yelp`
- Provider routing: Connects to Yelp directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `business_ids` | `array[string]` | yes | Yelp business IDs to fetch in one request. | ["G9hV4H2iGpWD8RoUpjtokg","zj8Lq1T8KIC5zwFief15jg"] |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "business_ids": [
    "G9hV4H2iGpWD8RoUpjtokg",
    "zj8Lq1T8KIC5zwFief15jg"
  ]
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/yelp/businesses' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "business_ids": [
    "G9hV4H2iGpWD8RoUpjtokg",
    "zj8Lq1T8KIC5zwFief15jg"
  ]
}'
```

#### Response example (illustrative)

```json
{
  "message": "200: success",
  "searched_url": null,
  "searched_ids": "G9hV4H2iGpWD8RoUpjtokg",
  "business_details": [
    {
      "business": {
        "id": "G9hV4H2iGpWD8RoUpjtokg",
        "name": "Example Pizza",
        "business_url": "https://www.yelp.com/biz/example-pizza",
        "rating": 4.5,
        "review_count": 325,
        "address": "123 Example St, New York, NY"
      },
      "annotations": [],
      "actions": [],
      "available_actions": [],
      "always_show_business_photos": false
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/yelp/reviews

**Yelp reviews**

Fetch Yelp reviews directly by business_url while preserving the legacy response payload. Pass the previous end_cursor as cursor to fetch the next page.

- Category: `Yelp`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `yelp.reviews`
- Provider source: `Direct · Yelp`
- Provider routing: Connects to Yelp directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `business_url` | `string` | yes | Full Yelp business URL. | https://www.yelp.com/biz/example |
| `reviews_per_page` | `integer` | no | Yelp reviews page size. | 45 |
| `sort_by` | `string` | no | Provider sort option. | Yelp_sort |
| `rating_filter` | `string` | no | Yelp rating filter. | All_ratings |
| `cursor` | `string` | no | Opaque end_cursor returned by the previous Yelp reviews page. | eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoib2Zmc2V0Iiwib2Zmc2V0Ijo0fQ |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "business_url": "https://www.yelp.com/biz/mancinis-wood-fired-pizza-brooklyn-2"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/yelp/reviews' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "business_url": "https://www.yelp.com/biz/mancinis-wood-fired-pizza-brooklyn-2"
}'
```

#### Response example (illustrative)

```json
{
  "reviews": [
    {
      "review_id": "review_123",
      "rating": 5,
      "text": "Excellent pizza."
    }
  ]
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/latest-reviews

**Trustpilot latest reviews**

Fetch Trustpilot's public latest-review feed, featured categories, and category metadata directly.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.latest_reviews`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/latest-reviews' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "latest_reviews": [
      {
        "id": "review_123",
        "title": "Great experience",
        "stars": 5,
        "text": "Fast delivery and helpful service."
      }
    ],
    "categories": [],
    "featured_categories": []
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/search

**Trustpilot business search**

Search Trustpilot businesses and matching categories directly, with pagination and public search filters.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.search`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `query` | `string` | yes | Provider search query. | customer service |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `country_code` | `string` | no | Two-letter country code. | US |
| `claimed` | `boolean` | no | Only return claimed Trustpilot businesses. | false |
| `trustscore` | `string` | no | Trustpilot search or category minimum TrustScore filter. Allowed: 3.0, 4.0, 4.5. | 4.0 |
| `number_of_reviews` | `string` | no | Trustpilot business-search review-count filter. | 100 |
| `location` | `string` | no | Search location. | New York, NY |
| `address` | `string` | no | Trustpilot business-search address filter. | New York |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "query": "hellofresh",
  "page": 1,
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/search' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "hellofresh",
  "page": 1,
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "query": "hellofresh",
    "business_units": [
      {
        "businessUnitId": "50feb403000064000521268c",
        "displayName": "HelloFresh US",
        "identifyingName": "hellofresh.com",
        "trustScore": 3.4,
        "numberOfReviews": 93063
      }
    ],
    "categories": [],
    "pagination": {
      "currentPage": 1,
      "totalPages": 2
    }
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/categories

**Trustpilot category index**

Fetch Trustpilot's full public category hierarchy directly.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.categories`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/categories' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "categories": [
      {
        "categoryId": "food_beverages_tobacco",
        "displayName": "Food, Beverages & Tobacco",
        "subCategories": []
      }
    ],
    "languages": []
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/category

**Trustpilot category businesses**

Fetch businesses, rankings, filters, countries, and category metadata for one Trustpilot category directly.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.category`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `category_id` | `string` | yes | Trustpilot category slug. | food_products_supplier |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `country` | `string` | no | Two-letter country code used to localize provider results. | US |
| `claimed` | `boolean` | no | Only return claimed Trustpilot businesses. | false |
| `trustscore` | `string` | no | Trustpilot search or category minimum TrustScore filter. Allowed: 3.0, 4.0, 4.5. | 4.0 |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `location` | `string` | no | Search location. | New York, NY |
| `subcategories` | `string` | no | Comma-separated Trustpilot subcategory slugs. | meal_delivery,organic_food_store |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "category_id": "food_products_supplier",
  "page": 1,
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/category' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "category_id": "food_products_supplier",
  "page": 1,
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "category": {
      "currentCategory": {
        "categoryId": "food_products_supplier",
        "displayName": "Food Products Supplier"
      }
    },
    "business_units": {
      "businesses": [],
      "totalHits": 1260,
      "totalPages": 63
    }
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/company-info

**Trustpilot company info**

Fetch rich Trustpilot company profile data directly through the proxy pool, including TrustScore, review statistics, contact and category data, business activity, similar companies, and available AI summaries.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.company_info`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `company_domain` | `string` | yes | Company website domain used by Trustpilot. | hellofresh.com |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "company_domain": "hellofresh.com",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/company-info' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "company_domain": "hellofresh.com",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {
    "company_domain": "hellofresh.com",
    "locale": "en-US"
  },
  "provider": "trustpilot_direct",
  "data": {
    "profile_url": "https://www.trustpilot.com/review/hellofresh.com",
    "business_unit": {
      "id": "50feb403000064000521268c",
      "displayName": "HelloFresh US",
      "identifyingName": "hellofresh.com",
      "numberOfReviews": 93063,
      "numberOfReviewsLast12Months": 24681,
      "trustScore": 3.4,
      "stars": 3.5,
      "websiteUrl": "https://www.hellofresh.com",
      "isClaimed": true,
      "isClosed": false,
      "contactInfo": {
        "email": "communityteam@hellofresh.com",
        "country": "US",
        "phone": "646-846-3663"
      },
      "activity": {
        "isUsingPaidFeatures": true,
        "replyBehavior": {
          "averageDaysToReply": 1.15,
          "replyPercentage": 99.53
        }
      }
    },
    "review_statistics": {
      "ratings": {
        "total": 93063,
        "one": 9197,
        "two": 5565,
        "three": 13697,
        "four": 20648,
        "five": 43956
      }
    },
    "sidebar": {
      "facebookBox": {
        "show": true,
        "facebookPageUrl": "https://www.facebook.com/hellofreshus"
      }
    },
    "similar_business_units": [],
    "ai_summary": null,
    "topic_ai_summaries": null,
    "topic_summary_localized_topics": [],
    "products": [],
    "show_product_reviews": true
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/company-reviews

**Trustpilot company reviews**

Fetch Trustpilot company reviews directly through the proxy pool while preserving the legacy RapidAPI response payload.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.company_reviews`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `company_domain` | `string` | yes | Company website domain used by Trustpilot. | hellofresh.com |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `verified` | `boolean` | no | Only return verified Trustpilot reviews. | false |
| `with_replies` | `boolean` | no | Only return Trustpilot reviews with company replies. | false |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `date_posted` | `string` | no | Provider freshness window, such as any, last_30_days, or last_12_months. | any |
| `query` | `string` | no | Provider search query. | customer service |
| `rating` | `string` | no | Comma-separated Trustpilot star ratings from 1 through 5. | 4,5 |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "company_domain": "hellofresh.com",
  "page": 1,
  "date_posted": "any",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/company-reviews' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "company_domain": "hellofresh.com",
  "page": 1,
  "date_posted": "any",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {
    "company_domain": "hellofresh.com",
    "locale": "en-US",
    "date_posted": "any",
    "page": "1"
  },
  "data": {
    "reviews": [
      {
        "review_id": "67b61b3c3a0273838ba01d6e",
        "review_title": "A great delivery experience",
        "review_text": "The order arrived on time and in good condition.",
        "review_rating": 5,
        "review_is_verified": true,
        "review_is_pending": false,
        "review_likes": 0,
        "review_language": "en",
        "review_time": "2025-02-19T19:56:13.000Z",
        "review_experienced_time": "2025-02-18T00:00:00.000Z",
        "consumer_id": "67b61b351e09b451f119956e",
        "consumer_name": "Example Reviewer",
        "consumer_review_count": 3,
        "consumer_country": "US",
        "consumer_is_verified": true,
        "consumer_review_count_same_domain": 1
      }
    ],
    "total_reviews": 125000,
    "rating_distribution": {
      "1": 5000,
      "2": 3000,
      "3": 7000,
      "4": 25000,
      "5": 85000
    },
    "review_language_distribution": {
      "English": 120000,
      "espa\u00f1ol": 5000
    }
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/company-transparency

**Trustpilot company transparency**

Fetch a company's public review sourcing, reply behavior, reporting, moderation, merge history, and verification statistics directly from Trustpilot.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.company_transparency`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `company_domain` | `string` | yes | Company website domain used by Trustpilot. | hellofresh.com |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "company_domain": "hellofresh.com",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/company-transparency' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "company_domain": "hellofresh.com",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "business_unit": {
      "displayName": "HelloFresh US",
      "isUsingPaidFeatures": true,
      "replyRate": 99.5
    },
    "review_statistics": {},
    "reporting_statistics": {}
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/company-locations

**Trustpilot company locations**

Fetch every public Trustpilot location for a location-enabled company, including address and location-level TrustScore data.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.company_locations`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `company_domain` | `string` | yes | Company website domain used by Trustpilot. | hellofresh.com |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "company_domain": "safestore.co.uk",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/company-locations' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "company_domain": "safestore.co.uk",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "business_unit": {
      "displayName": "Safestore"
    },
    "locations": [
      {
        "id": "f3e2ed82-1b67-490b-ade7-61617106d10d",
        "name": "Chiswick",
        "identifyingName": "chiswick",
        "trustScore": 3.4
      }
    ]
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/company-location

**Trustpilot company location**

Fetch one Trustpilot location's profile, reviews, statistics, contact data, map coordinates, and related businesses directly.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.company_location`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `company_domain` | `string` | yes | Company website domain used by Trustpilot. | hellofresh.com |
| `location_slug` | `string` | yes | Trustpilot company location URL slug returned by company-locations. | chiswick |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `verified` | `boolean` | no | Only return verified Trustpilot reviews. | false |
| `with_replies` | `boolean` | no | Only return Trustpilot reviews with company replies. | false |
| `sort` | `string` | no | Provider sort mode, such as most_relevant, recency, or date. | most_relevant |
| `date_posted` | `string` | no | Provider freshness window, such as any, last_30_days, or last_12_months. | any |
| `query` | `string` | no | Provider search query. | customer service |
| `rating` | `string` | no | Comma-separated Trustpilot star ratings from 1 through 5. | 4,5 |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "company_domain": "safestore.co.uk",
  "location_slug": "chiswick",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/company-location' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "company_domain": "safestore.co.uk",
  "location_slug": "chiswick",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "business_unit": {
      "displayName": "Safestore"
    },
    "location": {
      "name": "Chiswick",
      "identifyingName": "chiswick",
      "latitude": "51.488459",
      "longitude": "-0.271738"
    },
    "reviews": [],
    "filters": {}
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/review

**Trustpilot review detail**

Fetch one complete public Trustpilot review, including consumer, dates, labels, reply, report, location, and product-review links.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.review`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `review_id` | `string` | yes | Public Trustpilot review ID. | 6a543476b89ae658b9bdbe93 |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "review_id": "6a543476b89ae658b9bdbe93",
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/review' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "review_id": "6a543476b89ae658b9bdbe93",
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "business": {
      "displayName": "HelloFresh US",
      "identifyingName": "hellofresh.com"
    },
    "review": {
      "id": "6a543476b89ae658b9bdbe93",
      "rating": 4,
      "title": "Good meals",
      "text": "We enjoyed the meals."
    }
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---

### POST /v1/trustpilot/consumer-profile

**Trustpilot consumer profile**

Fetch a public Trustpilot consumer profile, service and product reviews, engagement statistics, and pagination directly.

- Category: `Trustpilot`
- Authentication: Bearer token required
- Success statuses: `200`
- Success content type: `application/json`
- Agent tool: `trustpilot.consumer_profile`
- Provider source: `Direct · Trustpilot`
- Provider routing: Connects to Trustpilot directly, not through RapidAPI.
- Response behavior: provider response is returned without an LLM rewrite
- Server-managed provider timeout: `45 seconds`

#### Query parameters

| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
| `cost` | `boolean` | no | When true, include a top-level numeric cost in USD. Provider credit fields are never returned. Web Fetch returns structured JSON when cost is requested. | false |

#### Request fields

| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| `consumer_id` | `string` | yes | Public Trustpilot consumer ID. | 598333a50000ff000ab70f11 |
| `page` | `integer` | no | One-based result page. Minimum: 1. | 1 |
| `cookie` | `string` | no | Optional Trustpilot logged-in cookie for deep pagination. | - |
| `locale` | `string` | no | Trustpilot locale code. | en-US |
| `source` | `string` | no | Optional caller attribution recorded in dashboard metrics and not forwarded upstream. | Scraper - BenableCommentsService |

#### Request example

```json
{
  "consumer_id": "598333a50000ff000ab70f11",
  "page": 1,
  "locale": "en-US"
}
```

#### cURL

```bash
curl --request POST \
  --url 'https://scraper.benable.com/v1/trustpilot/consumer-profile' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "consumer_id": "598333a50000ff000ab70f11",
  "page": 1,
  "locale": "en-US"
}'
```

#### Response example (illustrative)

```json
{
  "status": "OK",
  "request_id": "85685341-1e73-4008-901f-32ed4d3beec6",
  "parameters": {},
  "provider": "trustpilot_direct",
  "data": {
    "consumer": {
      "id": "598333a50000ff000ab70f11",
      "displayName": "Example Reviewer",
      "numberOfReviews": 2
    },
    "statistics": {
      "reviewsCount": 2,
      "likesCount": 0
    },
    "service_reviews": [],
    "product_reviews": [],
    "pagination": {
      "currentPage": 1,
      "totalPages": 1
    }
  }
}
```

#### Error responses

| Status | Meaning |
|---|---|
| `400` | Invalid request. |
| `401` | Missing or invalid Bearer token. |
| `429` | Concurrency limit reached. Retry after the number of seconds in the Retry-After response header. |
| `502` | Upstream provider error. |
| `504` | Upstream provider timeout. |

---
