Hive

Documentation

Build with Hive.

Guides and API reference for browser automation, proxy connections, and research with Hive.

Getting started

Authenticate your requests.

Use your Hive API key in the Authorization: Bearer $HIVE_API_KEY header. Send JSON request bodies with Content-Type: application/json. Keep your key on your server.

Examples use https://hive-osint-dev.172-86-73-30.sslip.io as the base URL. Check GET /capabilities before requesting a service. Use a unique Idempotency-Key for tunnel creation and Books submissions; reuse it only when repeating the same request.

Quick start

Create your first browser session

Set HIVE_API_KEY in your environment, then run this request. The response includes a cdp_url for connecting your automation tool.

Shell · create a browser
curl --fail-with-body -X POST "https://hive-osint-dev.172-86-73-30.sslip.io/browser/session" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Browsers use direct access from Hive by default. To enable a managed proxy, send {"use_proxy":true,"country":"AR"}. Country, region, ASN, mobile network, and identity constraints apply to proxy connections. A country value alone does not change a direct session’s exit IP.

Next, follow the browser automation guide to open a page with Playwright.

Browser transport

Connect over CDP.

Python · Playwright
import os
from playwright.sync_api import sync_playwright

auth = {"Authorization": "Bearer " + os.environ["HIVE_API_KEY"]}
# session is the result of POST /browser/session.
with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(
        session["cdp_url"], headers=auth
    )
    context = browser.contexts[0]
    page = context.pages[0] if context.pages else context.new_page()
    page.goto("https://example.com")
    browser.close()
# DELETE /browser/session?session_id=... to release the lease.

Network transport

Use your own client.

Python · HTTPX
import httpx
from urllib.parse import quote

# tunnel is the result of POST /network/tunnels.
ep = tunnel["endpoints"]["http"]
credentials = tunnel["credentials"]
user = quote(credentials["username"], safe="")
password = quote(credentials["password"], safe="")
proxy = f"http://{user}:{password}@{ep['host']}:{ep['port']}"
with httpx.Client(proxy=proxy, timeout=30) as client:
    response = client.get("https://example.com")
    response.raise_for_status()
# SOCKS clients use endpoints.socks5 with socks5h:// for remote DNS.

Resources & exchanges

Request. Poll. Release.

Create a resource with POST /resources/phone, /resources/mail, /resources/captcha, or /resources/network. Keep the returned resource_id. Read the recorded state with GET, poll for progress with POST, and DELETE the resource when finished.

Phone requests use service and a two-letter country. Mail can specify a domain. Captcha requests use captcha_type with site_key and page_url, or image_b64 for an image. For a browser-bound challenge, supply browser_context with the submitting browser’s user_agent and relevant cookies. Cookie entries use name, value, domain, path, and optional http_only, secure, and expires. Hive forwards that context for the solve without storing cookie values in resource records. A token is ready to submit when the resource becomes ready; the target website still decides whether to accept it. The reference below lists each field.

Exchanges return one result: send messages to POST /exchange/llm or a prompt to POST /exchange/image.

Completion request body
{
  "messages": [
    {
      "role": "user",
      "content": "Summarize this paragraph."
    }
  ],
  "max_tokens": 200
}

Research

Public LinkedIn data.
Search through Hive.

Search for people, find company employees, and retrieve public profiles, posts, comments, and reactions. Use filters and pagination to select the results you need.

Check /capabilities for service availability and the API reference for each operation’s request fields. Pagination is finite: limit is 1–1000, page is 1–100, and pages is 1–20, with tighter limits on individual target and filter lists.

  • POST /scrapers/linkedin/people/search
  • POST /scrapers/linkedin/company/employees
  • POST /scrapers/linkedin/profile/details
  • POST /scrapers/linkedin/profile/posts
  • POST /scrapers/linkedin/post/search
  • POST /scrapers/linkedin/post/comments
  • POST /scrapers/linkedin/profile/comments
  • POST /scrapers/linkedin/profile/reactions
Profile details
{
  "profiles": [
    "https://www.linkedin.com/in/<profile-id>/"
  ],
  "detail_level": "full"
}

Public research

People, posts, web, and images.

Find candidate people and retrieve public profiles and posts on Instagram, X, Facebook, and TikTok; discover username candidates with Sherlock, search Google, and find image matches or text with Google Lens. Use the same Hive bearer key and strict snake_case JSON bodies for every operation. Unknown fields and invalid targets are rejected before work begins.

Profile requests accept 1–10 handles or canonical public URLs in profiles. Facebook also accepts numeric IDs and profile.php URLs. Results contain items, count, and unresolved. Each entry echoes the exact target and zero-based input_index, in input order, including duplicates. Unresolved reasons are not_found, private, unavailable, malformed_data, or ambiguous; omitted profiles are unavailable, not proof of nonexistence. Resolved entries include public source links, and available identity, biography, image, verification, and count fields. Missing optional fields are omitted; profiles can be private, sparse, renamed, or unavailable.

Sherlock accepts 1–5 usernames of up to 64 characters and a limit of 1–100 per distinct username (default 20). Every result has username, site, profile_url, and status: candidate. Matching handles do not establish identity. truncated: true means a work or result limit omitted results; null means completeness is unknown.

Google accepts 1–5 queries, each up to 512 characters and 32 words; pages is 1–3 per query (default 1), and limit is 1–100 results per distinct query (default 20). Optional country and language select a supported two-letter country and search interface language. Organic results preserve query, rank, title, url, and an optional snippet.

Google Lens accepts one public HTTPS image_url or a private uploaded asset_id without credentials or private addresses, plus distinct search_types: visual, exact, and/or text. The URL is at most 4096 characters. limit is 1–100 total records (default 20), interleaved in requested type order. Visual and exact matches carry a title and public URL with optional image metadata; text records carry extracted text. A valid search may return no matches. Results do not promise completeness, totals, or a next page.

Google and Sherlock return up to 500 items for five inputs, grouped in input order; duplicate inputs are collected once. Sherlock scans each username independently so earlier inputs cannot consume later inputs’ collection windows. X account creation dates use ISO 8601 UTC; an ambiguous verification flag without badge type or blue status becomes null.

operation_health provides each operation’s reason, observed_at (Unix time), and retry_after_s. Reasons distinguish rate limiting, timeout, invalid response, limited capacity, service unavailability, missing resources and invalid requests. Capacity is shared across operations and bearer keys on the deployment. Retry timing is a minimum recheck delay; a null value means no delay is known. Elapsed time does not establish recovery. Accounting recovery can clear a capacity failure to unverified until a new search succeeds. Job recovery still uses the original key.

Read scrapers.<name>.status and operation_status from GET /capabilities. unconfigured means no active configuration; configured means all operations are unverified; usable means at least one observed success with no recorded failure; degraded means an operation has a known failure. A usable LinkedIn service does not establish that all eight operations work. Observations survive restart and reset when service configuration changes. Discovery never launches research.

Calls have finite execution limits and create no lease. Do not automatically repeat a timed-out or disconnected research call: work may already have completed. Social posts and people search support same-key recovery, as do Lens jobs. The older synchronous LinkedIn, profile/details, Sherlock, Google and Lens search routes do not support idempotent replay. Errors use bad_request, unauthorized, not_found, idempotency_conflict, expired, rate_limited, unavailable, or upstream_timeout. Invalid Hive authentication returns 401. Invalid fields return 400 with safe field detail before execution. Service failures return 503 unavailable; retained job errors and capability operation status use the same code. Keep using your Hive key. Respect retry_after_s when present.

Upload private image bytes with POST /scrapers/assets and Content-Type image/jpeg, image/png, or image/webp (10 MiB maximum). Use the returned asset_id instead of image_url. Images are encrypted, bearer-scoped, and retained for 24 hours. Their bytes are sent to the image-search service for the requested search. Download with GET /scrapers/assets/{asset_id}; delete with DELETE /scrapers/assets/{asset_id}.

Submit Lens work through POST /scrapers/google_lens/jobs with a required Idempotency-Key. The 202 response contains a poll_url for GET /scrapers/google_lens/jobs/{job_id}. Repeat the same key and body after a lost submission to retrieve the same job. Poll until completed (with result), failed, or outcome_unknown. An interrupted run is never automatically restarted. Results expire after 24 hours (410); keys stay reserved for seven days. Different bodies under one key return 409.

Lens unwraps supported Google redirect links. Embedded thumbnails have a bearer-authenticated Hive image_url, image_sha256, and image_kind: thumbnail. These hashes identify the returned thumbnail bytes, not full-resolution originals. Resolve relative image paths against your Hive origin; send your Hive key only to Hive, never to public image hosts.

Instagram, X, Facebook and TikTok expose native people/search: a free-text query (1–200 characters), up to five locations hints (1–100 characters), and limit 1–50. Hints are appended in caller order to one query; ambiguous names remain text, and city and employer filters are not enforced. The response reports effective_query, location_handling and filters_enforced: false. Instagram commas become spaces to keep one search. Candidates reuse profile fields and add the exact query, absolute rank, status: candidate and missing_fields. Missing biography/avatar fields remain null; collection-wide partial status is carried on every page. Facebook returns people with canonical profile URLs and nullable usernames or IDs; its location line is not a biography. Opaque people links retain their source URL without an inferred handle or numeric ID; details/posts require supported handle or numeric targets. Facebook cards without a usable source profile URL are omitted and make the whole collection partial; if every returned card is unusable, the search fails. TikTok returns user cards. Candidates are not verified identities and have no lookup target attribution.

People search uses the same job, key and cached-page workflow as posts, with at most 50 candidates in native order after identity deduplication. Keep the same query, locations and limit on later pages. No extra profile enrichment occurs. Replays and cached pages never repeat a search. A valid empty result differs from a failed search; completeness remains unknown. Check discovery health separately from profile lookup and posts in operation_status.

Instagram, X, Facebook and TikTok also expose profile/posts. Initial requests require Idempotency-Key; send Prefer: respond-async for a prompt 202 job, or wait up to 20 seconds for a page. Poll GET /scrapers/jobs/{job_id} with your bearer. Repeat the original key and body to recover the same job; results expire after 24 hours.

Posts accept 1–10 profiles and a total page limit of 1–50. Later pages send the same body plus result_id and page, without requiring a key or starting another collection. The cached window contains up to 50 posts per unique target (40 for Facebook) and 500 attributed items. Target outcomes preserve input order and duplicates; a resolved zero-post account differs from an unresolved target. Source authors, carousel order, video thumbnails, actual tags and separate caption mentions are preserved. Facebook covers public people and pages, including numeric profiles, and reports history_scope: recent_public_timeline: usually 25–40 recent public posts. Cached pages cannot retrieve older history. An empty Facebook response remains unresolved when a zero-post count cannot be established. TikTok preserves ordered slideshow photos, playable references when supplied, and separate cover thumbnails; the post page URL is not video bytes. Author country does not establish a post geotag. Null metadata and history_complete: null indicate unknown information. Public media references can expire; send Hive credentials only to Hive.

Set retain_media: true to preserve returned photos and video thumbnails as private JPEG/PNG/WebP evidence. Each media item reports retention_status, a fixed retention_reason, and an optional asset with its authenticated relative URL, exact-byte SHA-256, size, MIME and expiry. The original source URL and original/thumbnail role remain separate. Bounds are 20 unique images, 10 MiB and 40 million pixels each, 32 MiB downloaded per job, two concurrent downloads and up to 30 seconds within the remaining job deadline. Assets share the bearer/global image quotas and expire after 24 hours. Videos remain public references. Unresolved targets, media failures and retention limits set collection-wide partial status on every cached page, even if the affected item is on another page. Duplicate sources reuse assets; replay never redownloads, including after deletion or expiry. Keep the same retention value on cached page requests.

Recover a submission and read its cached pages

Use an Idempotency-Key of 1–200 printable ASCII characters without spaces. It binds your bearer, service, operation, ordered business request and limit. A different body under the same key, or a changed body/limit with result_id, returns 409 idempotency_conflict. Foreign or wrong-operation references return 404 not_found; expired results return 410 expired. Replay tombstones reserve keys for seven days. Reads never renew expiry. A terminal failed or outcome_unknown job cannot relaunch through replay; keep the key after an interruption.

A 202 submission includes Location, Retry-After: 2 and, when requested, Preference-Applied: respond-async. Polling returns HTTP 200 with the job envelope; completion puts the first page under result. Completed replays and cached pages return HTTP 200 even with Prefer: respond-async. Initial collection starts at page 1; later pages are 1–500 and must stay inside the collected window. An out-of-window page returns 400 bad_request. Follow next_page until null. Polls, replays and cached pages perform zero additional work.

The Bash workflow below needs curl, jq and sha256sum. Choose one service/operation and preserve its key and request. It demonstrates an explicit same-key replay, bounded polling, a second cached page when available, and an authenticated image download. A thumbnail hash identifies that thumbnail’s exact bytes; an original image hash identifies the retained original bytes.

Bash · recovery, cached page and image hash
# Run in Bash with curl, jq and sha256sum installed.
set -euo pipefail
: "${HIVE_API_KEY:?Set your Hive bearer in the environment}"
HIVE_ORIGIN="https://hive-osint-dev.172-86-73-30.sslip.io"
HIVE_SERVICE="instagram"  # instagram, x, facebook or tiktok
HIVE_OPERATION="profile/posts"
# Keep this key and the exact request after a disconnect; use a new key only
# for an intentional new collection. Do not enable shell tracing.
HIVE_RESEARCH_KEY="investigation-social-001"
request='{"profiles":["nasa"],"limit":2,"retain_media":true}'
# For native people discovery instead, set these before calling submit:
# HIVE_OPERATION="people/search"
# request='{"query":"José García","locations":["Madrid"],"limit":2}'
submit() {
  curl --fail-with-body --max-time 30 -sS \
    "$HIVE_ORIGIN/scrapers/$HIVE_SERVICE/$HIVE_OPERATION" \
    -H "Authorization: Bearer $HIVE_API_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: $HIVE_RESEARCH_KEY" \
    -H "Prefer: respond-async" --data "$request"
}
reply="$(submit)"
# If the response was lost, run submit again with the SAME key and request.
# This explicit replay also demonstrates recovery without another collection.
reply="$(submit)"
for ((poll=0; poll<180; poll++)); do
  status="$(jq -r '.status // "completed"' <<< "$reply")"
  case "$status" in
    completed) break ;;
    failed|outcome_unknown)
      jq '{job_id,status,error}' <<< "$reply"
      exit 1 ;;  # Keep the key; a new key would start separate work.
    pending|running) ;;
    *) exit 1 ;;
  esac
  poll_url="$(jq -r '.poll_url' <<< "$reply")"
  [[ "$poll_url" =~ ^/scrapers/jobs/[a-zA-Z0-9_-]+$ ]]
  sleep 2
  reply="$(curl --fail-with-body --max-time 30 -sS \
    "$HIVE_ORIGIN$poll_url" -H "Authorization: Bearer $HIVE_API_KEY")"
done
[[ "$(jq -r '.status // "completed"' <<< "$reply")" == completed ]] || exit 1
page="$(jq '.result // .' <<< "$reply")"
jq '{result_id,page,count,collected_count,next_page,partial}' <<< "$page"
# The first completed page is stable. Follow next_page only when present.
if [[ "$(jq -r '.next_page' <<< "$page")" != null ]]; then
  next_request="$(jq --argjson page "$page" \
    '. + {result_id:$page.result_id,page:$page.next_page}' <<< "$request")"
  curl --fail-with-body --max-time 30 -sS \
    "$HIVE_ORIGIN/scrapers/$HIVE_SERVICE/$HIVE_OPERATION" \
    -H "Authorization: Bearer $HIVE_API_KEY" \
    -H "Content-Type: application/json" --data "$next_request"
fi
# Hash one retained original image or thumbnail from the first page.
asset="$(jq -c '[.items[].media[]? | select(.retention_status == "retained")][0] // null' <<< "$page")"
if [[ "$asset" != null ]]; then
  asset_url="$(jq -r '.asset.url' <<< "$asset")"
  [[ "$asset_url" =~ ^/scrapers/assets/[a-zA-Z0-9_-]+$ ]]
  curl --fail-with-body --max-time 30 -sS \
    "$HIVE_ORIGIN$asset_url" -H "Authorization: Bearer $HIVE_API_KEY" \
    --output retained-image.bin
  expected="$(jq -r '.asset.sha256' <<< "$asset")"
  printf '%s  retained-image.bin\n' "$expected" | sha256sum --check -
  jq '{role,sha256:.asset.sha256,expires_at:.asset.expires_at}' <<< "$asset"
fi

Examples for each operation

These response shapes are illustrative. Social submission examples show the initial 202 job separately from the completed page under the polled result. A completed replay can return the page directly with 200. Public data and optional fields can differ.

POST /scrapers/instagram/profile/details

JSON request body
{
  "profiles": [
    "nasa"
  ]
}
Illustrative result
{
  "items": [
    {
      "username": "nasa",
      "profile_url": "https://www.instagram.com/nasa/",
      "display_name": "NASA",
      "target": "nasa",
      "input_index": 0
    }
  ],
  "count": 1,
  "unresolved": []
}

POST /scrapers/instagram/profile/posts

Request headers
{
  "Idempotency-Key": "instagram-profile-posts-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/instagram/profile/posts" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: instagram-profile-posts-001" \
  -H "Prefer: respond-async" \
  --data '{"profiles":["nasa"],"limit":2}'
JSON request body
{
  "profiles": [
    "nasa"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "instagram",
  "operation": "profile/posts",
  "status": "pending",
  "created_at": 1789913600,
  "expires_at": 1790000000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "target": "nasa",
      "input_index": 0,
      "post_id": "123",
      "url": "https://www.instagram.com/p/example/",
      "author": {
        "username": "nasa",
        "profile_url": "https://www.instagram.com/nasa"
      },
      "timestamp": "2026-09-01T12:00:00+00:00",
      "text": "Public post example.",
      "media": [],
      "geotag": null,
      "tagged_users": null,
      "mentions": null,
      "context": []
    }
  ],
  "count": 1,
  "result_id": "rresult_11111111111111111111111111111111",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 500,
  "expires_at": 1790000000,
  "truncated": null,
  "partial": false,
  "targets": [
    {
      "target": "nasa",
      "input_index": 0,
      "status": "resolved",
      "collected_count": 1,
      "reason": null
    }
  ],
  "unresolved": [],
  "per_target_limit": 50,
  "history_complete": null
}

POST /scrapers/instagram/people/search

Request headers
{
  "Idempotency-Key": "instagram-people-search-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/instagram/people/search" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: instagram-people-search-001" \
  -H "Prefer: respond-async" \
  --data '{"query":"José García","locations":["Madrid"],"limit":2}'
JSON request body
{
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "instagram",
  "operation": "people/search",
  "status": "pending",
  "created_at": 1789905600,
  "expires_at": 1789992000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "query": "José García",
      "rank": 1,
      "status": "candidate",
      "username": "example_person",
      "profile_url": "https://www.instagram.com/example_person",
      "profile_id": "123456",
      "display_name": "José García",
      "biography": null,
      "image_url": "https://images.example.com/avatar.jpg",
      "missing_fields": [
        "biography"
      ]
    }
  ],
  "count": 1,
  "result_id": "rresult_22222222222222222222222222222222",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 50,
  "expires_at": 1789992000,
  "truncated": null,
  "partial": true,
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "effective_query": "José García Madrid",
  "location_handling": "query_hint",
  "filters_enforced": false
}

POST /scrapers/x/profile/details

JSON request body
{
  "profiles": [
    "nasa"
  ]
}
Illustrative result
{
  "items": [
    {
      "username": "nasa",
      "profile_url": "https://x.com/NASA",
      "display_name": "NASA",
      "target": "nasa",
      "input_index": 0
    }
  ],
  "count": 1,
  "unresolved": []
}

POST /scrapers/x/profile/posts

Request headers
{
  "Idempotency-Key": "x-profile-posts-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/x/profile/posts" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: x-profile-posts-001" \
  -H "Prefer: respond-async" \
  --data '{"profiles":["nasa"],"limit":2}'
JSON request body
{
  "profiles": [
    "nasa"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "x",
  "operation": "profile/posts",
  "status": "pending",
  "created_at": 1789913600,
  "expires_at": 1790000000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "target": "nasa",
      "input_index": 0,
      "post_id": "123",
      "url": "https://x.com/nasa/status/123",
      "author": {
        "username": "nasa",
        "profile_url": "https://x.com/nasa"
      },
      "timestamp": "2026-09-01T12:00:00+00:00",
      "text": "Public post example.",
      "media": [],
      "geotag": null,
      "tagged_users": null,
      "mentions": null,
      "context": []
    }
  ],
  "count": 1,
  "result_id": "rresult_11111111111111111111111111111111",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 500,
  "expires_at": 1790000000,
  "truncated": null,
  "partial": false,
  "targets": [
    {
      "target": "nasa",
      "input_index": 0,
      "status": "resolved",
      "collected_count": 1,
      "reason": null
    }
  ],
  "unresolved": [],
  "per_target_limit": 50,
  "history_complete": null
}

POST /scrapers/x/people/search

Request headers
{
  "Idempotency-Key": "x-people-search-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/x/people/search" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: x-people-search-001" \
  -H "Prefer: respond-async" \
  --data '{"query":"José García","locations":["Madrid"],"limit":2}'
JSON request body
{
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "x",
  "operation": "people/search",
  "status": "pending",
  "created_at": 1789905600,
  "expires_at": 1789992000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "query": "José García",
      "rank": 1,
      "status": "candidate",
      "username": "example_person",
      "profile_url": "https://x.com/example_person",
      "profile_id": "123456",
      "display_name": "José García",
      "biography": "Synthetic public biography",
      "image_url": "https://images.example.com/avatar.jpg",
      "missing_fields": [],
      "location": "Madrid"
    }
  ],
  "count": 1,
  "result_id": "rresult_22222222222222222222222222222222",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 50,
  "expires_at": 1789992000,
  "truncated": null,
  "partial": false,
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "effective_query": "José García Madrid",
  "location_handling": "query_hint",
  "filters_enforced": false
}

POST /scrapers/facebook/profile/details

JSON request body
{
  "profiles": [
    "nasa"
  ]
}
Illustrative result
{
  "items": [
    {
      "username": "nasa",
      "profile_url": "https://www.facebook.com/NASA",
      "display_name": "NASA",
      "target": "nasa",
      "input_index": 0
    }
  ],
  "count": 1,
  "unresolved": []
}

POST /scrapers/facebook/profile/posts

Request headers
{
  "Idempotency-Key": "facebook-profile-posts-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/facebook/profile/posts" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: facebook-profile-posts-001" \
  -H "Prefer: respond-async" \
  --data '{"profiles":["nasa"],"limit":2}'
JSON request body
{
  "profiles": [
    "nasa"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "facebook",
  "operation": "profile/posts",
  "status": "pending",
  "created_at": 1789913600,
  "expires_at": 1790000000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "target": "nasa",
      "input_index": 0,
      "post_id": "123",
      "url": "https://www.facebook.com/nasa/posts/123",
      "author": {
        "username": "nasa",
        "profile_url": "https://www.facebook.com/nasa"
      },
      "timestamp": "2026-09-01T12:00:00+00:00",
      "text": "Public post example.",
      "media": [],
      "geotag": null,
      "tagged_users": null,
      "mentions": null,
      "context": []
    }
  ],
  "count": 1,
  "result_id": "rresult_11111111111111111111111111111111",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 500,
  "expires_at": 1790000000,
  "truncated": null,
  "partial": false,
  "targets": [
    {
      "target": "nasa",
      "input_index": 0,
      "status": "resolved",
      "collected_count": 1,
      "reason": null
    }
  ],
  "unresolved": [],
  "per_target_limit": 40,
  "history_complete": null,
  "history_scope": "recent_public_timeline"
}

POST /scrapers/facebook/people/search

Request headers
{
  "Idempotency-Key": "facebook-people-search-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/facebook/people/search" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: facebook-people-search-001" \
  -H "Prefer: respond-async" \
  --data '{"query":"José García","locations":["Madrid"],"limit":2}'
JSON request body
{
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "facebook",
  "operation": "people/search",
  "status": "pending",
  "created_at": 1789905600,
  "expires_at": 1789992000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "query": "José García",
      "rank": 1,
      "status": "candidate",
      "username": null,
      "profile_url": "https://www.facebook.com/profile.php?id=123456",
      "profile_id": "123456",
      "display_name": "José García",
      "biography": null,
      "image_url": "https://images.example.com/avatar.jpg",
      "missing_fields": [
        "biography"
      ],
      "profile_type": "person",
      "location": "Madrid"
    }
  ],
  "count": 1,
  "result_id": "rresult_22222222222222222222222222222222",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 50,
  "expires_at": 1789992000,
  "truncated": null,
  "partial": true,
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "effective_query": "José García Madrid",
  "location_handling": "query_hint",
  "filters_enforced": false
}

POST /scrapers/tiktok/profile/details

JSON request body
{
  "profiles": [
    "nasa"
  ]
}
Illustrative result
{
  "items": [
    {
      "username": "nasa",
      "profile_url": "https://www.tiktok.com/@nasa",
      "display_name": "NASA",
      "target": "nasa",
      "input_index": 0
    }
  ],
  "count": 1,
  "unresolved": []
}

POST /scrapers/tiktok/profile/posts

Request headers
{
  "Idempotency-Key": "tiktok-profile-posts-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/tiktok/profile/posts" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: tiktok-profile-posts-001" \
  -H "Prefer: respond-async" \
  --data '{"profiles":["nasa"],"limit":2}'
JSON request body
{
  "profiles": [
    "nasa"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "tiktok",
  "operation": "profile/posts",
  "status": "pending",
  "created_at": 1789913600,
  "expires_at": 1790000000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "target": "nasa",
      "input_index": 0,
      "post_id": "123",
      "url": "https://www.tiktok.com/@nasa/video/123",
      "author": {
        "username": "nasa",
        "profile_url": "https://www.tiktok.com/@nasa"
      },
      "timestamp": "2026-09-01T12:00:00+00:00",
      "text": "Public post example.",
      "media": [],
      "geotag": null,
      "tagged_users": null,
      "mentions": null,
      "context": []
    }
  ],
  "count": 1,
  "result_id": "rresult_11111111111111111111111111111111",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 500,
  "expires_at": 1790000000,
  "truncated": null,
  "partial": false,
  "targets": [
    {
      "target": "nasa",
      "input_index": 0,
      "status": "resolved",
      "collected_count": 1,
      "reason": null
    }
  ],
  "unresolved": [],
  "per_target_limit": 50,
  "history_complete": null,
  "history_scope": "collected_window"
}

POST /scrapers/tiktok/people/search

Request headers
{
  "Idempotency-Key": "tiktok-people-search-001",
  "Prefer": "respond-async"
}
Bash · submit with your Hive key
curl --fail-with-body --max-time 30 -sS "https://hive-osint-dev.172-86-73-30.sslip.io/scrapers/tiktok/people/search" \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: tiktok-people-search-001" \
  -H "Prefer: respond-async" \
  --data '{"query":"José García","locations":["Madrid"],"limit":2}'
JSON request body
{
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "limit": 2
}
HTTP 202 · initial job
{
  "job_id": "rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "service": "tiktok",
  "operation": "people/search",
  "status": "pending",
  "created_at": 1789905600,
  "expires_at": 1789992000,
  "poll_url": "/scrapers/jobs/rjob_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "result": null,
  "error": null
}
Completed page · poll result or HTTP 200
{
  "items": [
    {
      "query": "José García",
      "rank": 1,
      "status": "candidate",
      "username": "example_person",
      "profile_url": "https://www.tiktok.com/@example_person",
      "profile_id": "123456",
      "display_name": "José García",
      "biography": "Synthetic public biography",
      "image_url": "https://images.example.com/avatar.jpg",
      "missing_fields": []
    }
  ],
  "count": 1,
  "result_id": "rresult_22222222222222222222222222222222",
  "page": 1,
  "limit": 2,
  "next_page": null,
  "collected_count": 1,
  "collection_limit": 50,
  "expires_at": 1789992000,
  "truncated": null,
  "partial": false,
  "query": "José García",
  "locations": [
    "Madrid"
  ],
  "effective_query": "José García Madrid",
  "location_handling": "query_hint",
  "filters_enforced": false
}

POST /scrapers/sherlock/search

JSON request body
{
  "usernames": [
    "nasa"
  ],
  "limit": 20
}
Illustrative result
{
  "items": [
    {
      "username": "nasa",
      "site": "GitHub",
      "profile_url": "https://github.com/nasa",
      "status": "candidate"
    }
  ],
  "count": 1,
  "truncated": null
}

POST /scrapers/google/search

JSON request body
{
  "queries": [
    "site:nasa.gov Artemis"
  ],
  "limit": 20,
  "pages": 1,
  "country": "us",
  "language": "en"
}
Illustrative result
{
  "items": [
    {
      "query": "site:nasa.gov Artemis",
      "rank": 1,
      "title": "Artemis",
      "url": "https://www.nasa.gov/artemis/",
      "snippet": "Explore the Artemis program."
    }
  ],
  "count": 1
}

POST /scrapers/google_lens/search

JSON request body
{
  "image_url": "https://gpm.nasa.gov/sites/default/files/document_files/NASA-Logo-Large.png",
  "search_types": [
    "visual",
    "exact",
    "text"
  ],
  "limit": 20
}
Illustrative result
{
  "items": [
    {
      "type": "visual",
      "title": "NASA",
      "url": "https://www.nasa.gov/"
    },
    {
      "type": "exact",
      "title": "NASA logo",
      "url": "https://www.nasa.gov/logos/"
    },
    {
      "type": "text",
      "text": "NASA"
    }
  ],
  "count": 3
}

Books

Query. Inspect. Download.

Submit POST /books/queries, then poll the opaque query ID. Inspect results through GET /books/items/{book_id}. Submit POST /books/downloads, poll the download, and retrieve its artifact when ready.

Query and download submissions require an Idempotency-Key. Availability is reported separately in /capabilities; configuration alone does not establish a working download.

POST /books/queries · body
{
  "query": "Pride and Prejudice",
  "limit": 10
}

Use a returned book_id and one of its available formats in the download body: {"book_id":"<returned-book-id>","format":"epub"}.

Reference

Manage active sessions

Keep a connection open

Renew before lease_expires_at to keep using the same route and credentials. Browser sessions can run for up to one hour; max_expires_at gives the final deadline. Create a new session once the current one expires.

Change a tunnel’s IP address

Use rotate when you need a new exit IP. Hive checks the replacement against your requested country, region, ASN, and network type. If no matching replacement is available, your current connection stays in place.

Reuse a network identity

Pass the same identity_token to request a sticky allocation. A request that cannot preserve that identity fails rather than assigning a different one. Use mobile: true; non-mobile allocations are currently unavailable.

Connect securely

Browser WebSocket connections use your Hive bearer key. Proxy connections use the separate username and password returned when you create a tunnel. Save those credentials from the creation response.

SOCKS5 and HTTP proxy authentication travels unencrypted. HTTPS CONNECT encrypts traffic to the destination after the proxy handshake; it does not encrypt the proxy credentials.

Errors

Errors and retries

400 invalid request · 401 invalid Hive authentication · 403 forbidden · 404 not found · 409 conflicting or expired state · 429 rate limited · 503 service or constraints unavailable · 504 timeout.

Errors expose stable error codes. Do not blindly retry allocations or timed-out research calls. Reuse an idempotency key where supported, and inspect an existing resource before creating another.

API reference

Requests and responses.

All endpoints use the same base URL. Fields marked required must be supplied.

POST /books/downloads

Submit Download

Parameters

Idempotency-Key header · optional

JSON body

See the lifecycle example for this operation.

Response · 200

Successful Response

POST /books/queries

Submit Query

Parameters

Idempotency-Key header · optional

JSON body

See the lifecycle example for this operation.

Response · 200

Successful Response

GET /browser/session

Inspect a browser session

Parameters

session_id query · required

Response · 200

Success

automation_protocol cdp · required
cdp_url string · optional
lease_expires_at string · optional

Format: date-time.

max_expires_at string · optional

Fixed one-hour session deadline. Renewal cannot extend it. Format: date-time.

session_id string · required
status string · optional
viewer_url string · optional
ws_endpoint string · optional

POST /browser/session

Create a managed CDP browser

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

asn string | integer | null · optional

Default: null.

country string · optional

Proxy exit country when use_proxy is true. Does not change the exit IP of a direct session. Pattern: ^[A-Za-z]{2}$. Default: "US".

identity_token string | null · optional

Default: null. Minimum length: 1. Maximum length: 128.

mobile boolean · optional

Default: true.

region string | null · optional

Default: null. Minimum length: 1. Maximum length: 100.

use_proxy boolean · optional

Opt into managed proxy access. Omit or set false for direct access from Hive. Default: false.

window_size string · optional

Pattern: ^[1-9][0-9]{2,3}x[1-9][0-9]{2,3}$. Default: "1280x720".

Response · 200

Success

automation_protocol cdp · required
cdp_url string · optional
lease_expires_at string · optional

Format: date-time.

max_expires_at string · optional

Fixed one-hour session deadline. Renewal cannot extend it. Format: date-time.

session_id string · required
status string · optional
viewer_url string · optional
ws_endpoint string · optional

POST /browser/session/renew

Extend the existing browser lease

Parameters

session_id query · required

Response · 200

Success

automation_protocol cdp · required
cdp_url string · optional
lease_expires_at string · optional

Format: date-time.

max_expires_at string · optional

Fixed one-hour session deadline. Renewal cannot extend it. Format: date-time.

session_id string · required
status string · optional
viewer_url string · optional
ws_endpoint string · optional

GET /capabilities

Discover services and supported constraints

Inspect each scraper's operation_status and operation_health. Each health entry has reason (null, rate_limited, timeout, invalid_response, capacity_limited, service_unavailable, not_found, or invalid_request), observed_at (Unix seconds or null), and retry_after_s (remaining minimum recheck delay or null when unknown). Capacity is shared across operations and bearer keys on this deployment. Discovery never starts research. An elapsed delay does not prove recovery; recover existing jobs with the original idempotency key.

Response · 200

Success

POST /exchange/image

Generate image artifacts

JSON body

count integer · optional

Minimum: 1. Maximum: 4.

prompt string · required

Minimum length: 1.

size string · optional

Response · 200

Success

POST /exchange/llm

Generate a completion

JSON body

max_tokens integer · optional

Minimum: 1. Maximum: 16384.

messages object[] · required

Minimum items: 1.

messages[].content string · required
messages[].role string · required
response_format object · optional

Response · 200

Success

GET /network/pin

Discover an available geographic and ASN pin

Parameters

country query · required
region query · optional
asn query · optional
mobile query · optional

Response · 200

Success

POST /network/tunnels

Create a verified network tunnel

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

asn string | integer | null · optional

Default: null.

country string · required

Pattern: ^[A-Za-z]{2}$.

identity_token string | null · optional

Default: null. Minimum length: 1. Maximum length: 128.

idle_timeout_s integer | null · optional

Default: null. Minimum: 1.

max_bytes integer | null · optional

Default: null. Minimum: 1.

max_connections integer | null · optional

Default: null. Minimum: 1.

mobile boolean · optional

Default: true.

region string | null · optional

Default: null. Minimum length: 1. Maximum length: 100.

source_ip string | null · optional

Default: null.

ttl_s integer | null · optional

Default: null. Minimum: 1.

Response · 200

Success

created_at string · optional

Format: date-time.

credentials object · optional
credentials.password string · required
credentials.username string · required
endpoints object · optional
endpoints.http object · optional
endpoints.http.host string · required
endpoints.http.port integer · required
endpoints.http.scheme string · required
endpoints.socks5 object · optional
endpoints.socks5.host string · required
endpoints.socks5.port integer · required
endpoints.socks5.scheme string · required
id string · optional
lease_expires_at string · optional

Format: date-time.

limits object · optional
limits.idle_timeout_s integer · optional
limits.max_bytes integer · optional
limits.max_connections integer · optional
limits.max_ttl_s integer · optional
network object · optional
network.connection_type string · optional
network.exit object · optional
network.exit.asn string · optional
network.exit.country string · optional
network.exit.hosting boolean · optional
network.exit.ip string · optional
network.exit.isp string · optional
network.exit.mobile boolean · optional
network.exit.region string · optional
network.exit.verified_at string · optional

Format: date-time.

network.quality object · optional
network.quality.verified boolean · optional
network.rotatable boolean · optional
network.rotation object · optional
network.rotation.rotated boolean · optional
source_bound boolean · optional
status string · optional
terminal_reason string | null · optional
updated_at string · optional

Format: date-time.

GET /network/tunnels/{tunnel_id}

Inspect a tunnel

Parameters

tunnel_id path · required

Response · 200

Success

created_at string · optional

Format: date-time.

endpoints object · optional
endpoints.http object · optional
endpoints.http.host string · required
endpoints.http.port integer · required
endpoints.http.scheme string · required
endpoints.socks5 object · optional
endpoints.socks5.host string · required
endpoints.socks5.port integer · required
endpoints.socks5.scheme string · required
id string · optional
lease_expires_at string · optional

Format: date-time.

limits object · optional
limits.idle_timeout_s integer · optional
limits.max_bytes integer · optional
limits.max_connections integer · optional
limits.max_ttl_s integer · optional
network object · optional
network.connection_type string · optional
network.exit object · optional
network.exit.asn string · optional
network.exit.country string · optional
network.exit.hosting boolean · optional
network.exit.ip string · optional
network.exit.isp string · optional
network.exit.mobile boolean · optional
network.exit.region string · optional
network.exit.verified_at string · optional

Format: date-time.

network.quality object · optional
network.quality.verified boolean · optional
network.rotatable boolean · optional
network.rotation object · optional
network.rotation.rotated boolean · optional
source_bound boolean · optional
status string · optional
terminal_reason string | null · optional
updated_at string · optional

Format: date-time.

POST /network/tunnels/{tunnel_id}/credentials

Replace tunnel credentials

Parameters

tunnel_id path · required

Response · 200

Success

credentials object · optional
credentials.password string · required
credentials.username string · required
id string · optional

POST /network/tunnels/{tunnel_id}/renew

Extend the lease without changing the exit

Parameters

tunnel_id path · required

JSON body

ttl_s integer · optional

Minimum: 1.

Response · 200

Success

created_at string · optional

Format: date-time.

endpoints object · optional
endpoints.http object · optional
endpoints.http.host string · required
endpoints.http.port integer · required
endpoints.http.scheme string · required
endpoints.socks5 object · optional
endpoints.socks5.host string · required
endpoints.socks5.port integer · required
endpoints.socks5.scheme string · required
id string · optional
lease_expires_at string · optional

Format: date-time.

limits object · optional
limits.idle_timeout_s integer · optional
limits.max_bytes integer · optional
limits.max_connections integer · optional
limits.max_ttl_s integer · optional
network object · optional
network.connection_type string · optional
network.exit object · optional
network.exit.asn string · optional
network.exit.country string · optional
network.exit.hosting boolean · optional
network.exit.ip string · optional
network.exit.isp string · optional
network.exit.mobile boolean · optional
network.exit.region string · optional
network.exit.verified_at string · optional

Format: date-time.

network.quality object · optional
network.quality.verified boolean · optional
network.rotatable boolean · optional
network.rotation object · optional
network.rotation.rotated boolean · optional
source_bound boolean · optional
status string · optional
terminal_reason string | null · optional
updated_at string · optional

Format: date-time.

POST /network/tunnels/{tunnel_id}/rotate

Select a verified different exit with the same constraints

Parameters

tunnel_id path · required

Response · 200

Success

created_at string · optional

Format: date-time.

endpoints object · optional
endpoints.http object · optional
endpoints.http.host string · required
endpoints.http.port integer · required
endpoints.http.scheme string · required
endpoints.socks5 object · optional
endpoints.socks5.host string · required
endpoints.socks5.port integer · required
endpoints.socks5.scheme string · required
id string · optional
lease_expires_at string · optional

Format: date-time.

limits object · optional
limits.idle_timeout_s integer · optional
limits.max_bytes integer · optional
limits.max_connections integer · optional
limits.max_ttl_s integer · optional
network object · optional
network.connection_type string · optional
network.exit object · optional
network.exit.asn string · optional
network.exit.country string · optional
network.exit.hosting boolean · optional
network.exit.ip string · optional
network.exit.isp string · optional
network.exit.mobile boolean · optional
network.exit.region string · optional
network.exit.verified_at string · optional

Format: date-time.

network.quality object · optional
network.quality.verified boolean · optional
network.rotatable boolean · optional
network.rotation object · optional
network.rotation.rotated boolean · optional
source_bound boolean · optional
status string · optional
terminal_reason string | null · optional
updated_at string · optional

Format: date-time.

GET /readyz

Read service availability

Response · 200

Success

POST /resources/captcha

Create a captcha resource

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

Provide captcha_type and the matching site_key/page_url or image_b64, or the equivalent descriptor.

action string · optional
browser_context object · optional

Optional context from the browser submitting the token. Cookie values are transient and are not stored in Hive resource records. Only include cookies needed for this CAPTCHA. Context support depends on solver availability; unsupported combinations fail explicitly.

browser_context.cookies object[] · optional

Maximum items: 100.

browser_context.cookies[].domain string · required
browser_context.cookies[].expires number · optional

Unix timestamp; omit or use -1 for session cookies.

browser_context.cookies[].http_only boolean · optional

Default: false.

browser_context.cookies[].name string · required
browser_context.cookies[].path string · required
browser_context.cookies[].secure boolean · optional

Default: false.

browser_context.cookies[].value string · required
browser_context.user_agent string · optional

Minimum length: 1. Maximum length: 1024.

captcha_type recaptcha_v2 | recaptcha_v2_enterprise | recaptcha_v3 | hcaptcha | turnstile | image · optional
descriptor object · optional
descriptor.action string · optional
descriptor.browser_context object · optional

Optional context from the browser submitting the token. Cookie values are transient and are not stored in Hive resource records. Only include cookies needed for this CAPTCHA. Context support depends on solver availability; unsupported combinations fail explicitly.

descriptor.browser_context.cookies object[] · optional

Maximum items: 100.

descriptor.browser_context.cookies[].domain string · required
descriptor.browser_context.cookies[].expires number · optional

Unix timestamp; omit or use -1 for session cookies.

descriptor.browser_context.cookies[].http_only boolean · optional

Default: false.

descriptor.browser_context.cookies[].name string · required
descriptor.browser_context.cookies[].path string · required
descriptor.browser_context.cookies[].secure boolean · optional

Default: false.

descriptor.browser_context.cookies[].value string · required
descriptor.browser_context.user_agent string · optional

Minimum length: 1. Maximum length: 1024.

descriptor.enterprise boolean · optional
descriptor.image_b64 string · optional
descriptor.min_score number · optional

Minimum: 0. Maximum: 1.

descriptor.page_url string · optional

Format: uri.

descriptor.site_key string · optional
descriptor.type recaptcha_v2 | recaptcha_v2_enterprise | recaptcha_v3 | hcaptcha | turnstile | image · optional
enterprise boolean · optional
image_b64 string · optional
min_score number · optional

Minimum: 0. Maximum: 1.

page_url string · optional

Format: uri.

site_key string · optional

Response · 200

Success

POST /resources/mail

Create a mail resource

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

country string · optional

Pattern: ^[A-Za-z]{2}$.

domain string · optional
service string · optional

Response · 200

Success

POST /resources/network

Create a network resource

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

asn string | integer | null · optional

Default: null.

country string · required

Pattern: ^[A-Za-z]{2}$.

identity_token string | null · optional

Default: null. Minimum length: 1. Maximum length: 128.

mobile boolean · optional

Default: true.

region string | null · optional

Default: null. Minimum length: 1. Maximum length: 100.

Response · 200

Success

POST /resources/phone

Create a phone resource

Parameters

Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

JSON body

country string · optional

Pattern: ^[A-Za-z]{2}$.

service string · optional

Response · 200

Success

POST /resources/{resource_id}/poll

Poll resource progress

Parameters

resource_id path · required
Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

Response · 200

Success

POST /resources/{resource_id}/renew

Extend the resource lease

Parameters

resource_id path · required
Idempotency-Key header · optional

Reuse the same key and request to replay a successful allocation.

Response · 200

Success

POST /scrapers/assets

Upload Research Image

Upload private image bytes (10 MiB maximum); retained encrypted for 24 hours.

Response · 201

Successful Response

asset_id string · required
expires_at integer · required
media_type image/jpeg | image/png | image/webp · required
sha256 string · required
size_bytes integer · required
url string · required

Bearer-authenticated, relative Hive download URL.

DELETE /scrapers/assets/{asset_id}

Delete Research Image

Delete an image. Already-submitted jobs retain their private input copy until completion.

Parameters

asset_id path · required

Response · 204

Successful Response

GET /scrapers/assets/{asset_id}

Download Research Image

Download this bearer's uploaded image, Lens thumbnail or retained post image before its expiry.

Parameters

asset_id path · required

Response · 200

Successful Response

POST /scrapers/facebook/people/search

Facebook People Search

Collect at most 50 native people candidates, including numeric profiles without usernames. Opaque people links retain their returned URL without an inferred numeric ID or username; details/posts still require supported handle or numeric targets. Location texts are appended in caller order as query hints, never enforced city filters. Prefer: respond-async returns promptly; default wait is at most 20 seconds. Cached pages/replays launch no new work.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

locations string[] · optional

Up to five location hints of 1–100 characters, appended in caller order to one native query. Ambiguous names remain text; no city resolution or AND/OR geographic filters are enforced. Maximum items: 5.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

query string · required

Free-text name, optionally with employer/city. Echoed exactly; matching does not verify identity or enforce filters. Minimum length: 1. Maximum length: 200.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

effective_query string · required

Text sent to native account search, including location hints. Instagram commas become spaces to keep one query.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

filters_enforced false · required

City and employer restrictions are not enforced. Returned accounts are candidates, never verified identities.

items object[] · required

Maximum items: 50.

items[].biography string | null · optional
items[].category string | null · optional
items[].cover_image_url string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].location string | null · optional
items[].missing_fields display_name | biography | image_url[] · required

Unavailable core profile fields. No inferred or purchased enrichment. Maximum items: 3.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_type person | page | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].query string · required
items[].rank integer · required

Absolute one-based position after canonical account deduplication, preserving native order. Minimum: 1. Maximum: 50.

items[].status candidate · required
items[].username string | null · optional
items[].website_url string | null · optional
limit integer · required

Minimum: 1. Maximum: 50.

location_handling not_requested | query_hint · required
locations string[] · required
next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

query string · required
result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

truncated true | null · required

True when collection omitted results; null means completeness is unknown.

Response · 202

Durable native people search; poll the owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/facebook/profile/details

Facebook Profile Details

Retrieve public Facebook profile or page details for up to ten targets.

JSON body

One to ten Facebook handles, numeric IDs, or canonical profile/page URLs.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 10.

items object[] · required

Maximum items: 10.

items[].biography string | null · optional
items[].category string | null · optional
items[].cover_image_url string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].location string | null · optional
items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_type person | page | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].target string · required
items[].username string | null · optional
items[].website_url string | null · optional
unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

POST /scrapers/facebook/profile/posts

Facebook Profile Posts

Return recent public person/page posts, including numeric profiles. At most 40 posts per target; pages cannot recover older history. Prefer: respond-async submits promptly.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

Collect up to 40 recent public posts per unique person or page; older history is unavailable.

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

retain_media boolean · optional

Preserve up to 20 unique photos/video thumbnails (JPEG/PNG/WebP), 10 MiB and 40 million pixels each, 32 MiB downloaded per job, two at once for up to 30 seconds within the remaining job deadline. No video download. Assets share bearer/global quotas and expire after 24 hours. Cached pages/replay never download again. Default: false.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

history_complete null · required

Full platform history is unknown. Pages cover only the cached collection.

history_scope collected_window | recent_public_timeline · optional

Facebook is limited to recent publicly visible timeline posts (typically 25–40); cached pages cannot retrieve older history. Default: "collected_window".

items object[] · required

Maximum items: 50.

items[].author object · required
items[].author.display_name string | null · optional
items[].author.image_url string | null · optional
items[].author.profile_id string | null · optional
items[].author.profile_url string · required
items[].author.username string | null · optional
items[].comments_count integer | null · optional

Minimum: 0.

items[].context object[] · required

Maximum items: 2.

items[].context[].author object · required
items[].context[].author.display_name string | null · optional
items[].context[].author.image_url string | null · optional
items[].context[].author.profile_id string | null · optional
items[].context[].author.profile_url string · required
items[].context[].author.username string | null · optional
items[].context[].comments_count integer | null · optional

Minimum: 0.

items[].context[].geotag object | null · required
items[].context[].kind repost | quote · required
items[].context[].likes_count integer | null · optional

Minimum: 0.

items[].context[].media object[] · required

Maximum items: 100.

items[].context[].media[].asset object | null · optional
items[].context[].media[].bitrate integer | null · optional

Minimum: 0.

items[].context[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].context[].media[].mime_type string | null · optional
items[].context[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].context[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].context[].media[].role original | thumbnail · required
items[].context[].media[].type image | video · required
items[].context[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].context[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].context[].post_id string · required
items[].context[].quotes_count integer | null · optional

Minimum: 0.

items[].context[].reposts_count integer | null · optional

Minimum: 0.

items[].context[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].context[].text string | null · required
items[].context[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].context[].url string · required
items[].context[].views_count integer | null · optional

Minimum: 0.

items[].geotag object | null · required
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_pinned boolean | null · optional
items[].is_quote boolean | null · optional
items[].is_repost boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].media object[] · required

Maximum items: 100.

items[].media[].asset object | null · optional
items[].media[].bitrate integer | null · optional

Minimum: 0.

items[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].media[].mime_type string | null · optional
items[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].media[].role original | thumbnail · required
items[].media[].type image | video · required
items[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].post_id string · required
items[].quotes_count integer | null · optional

Minimum: 0.

items[].reposts_count integer | null · optional

Minimum: 0.

items[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].target string · required
items[].text string | null · required
items[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].url string · required
items[].views_count integer | null · optional

Minimum: 0.

limit integer · required

Minimum: 1. Maximum: 50.

next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

per_target_limit integer · required

Minimum: 1. Maximum: 50.

result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

targets object[] · required

Maximum items: 10.

targets[].collected_count integer · required

Minimum: 0. Maximum: 50.

targets[].input_index integer · required

Minimum: 0. Maximum: 9.

targets[].reason not_found | private | unavailable | malformed_data | ambiguous | null · required
targets[].status resolved | unresolved · required
targets[].target string · required
truncated true | null · required

True when collection omitted results; null means completeness is unknown.

unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

Response · 202

Durable job; poll the returned owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/google/search

Google Search

Search Google for bounded organic results, preserving each query and its reported rank.

JSON body

One to five queries of up to 32 words; search operators are supported.

country string | null · optional

Supported two-letter search country code, such as us or gb. Minimum length: 2. Maximum length: 2.

language string | null · optional

Search interface language, such as en, zh-CN or pt-BR; does not restrict result language. Minimum length: 2. Maximum length: 5.

limit integer · optional

Maximum organic results per distinct query. Minimum: 1. Maximum: 100. Default: 20.

pages integer · optional

Maximum pages per query. Minimum: 1. Maximum: 3. Default: 1.

queries string[] · required

Minimum items: 1. Maximum items: 5.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 500.

items object[] · required

Maximum items: 500.

items[].query string · required
items[].rank integer · required

Minimum: 1.

items[].snippet string | null · optional
items[].title string · required
items[].url string · required

POST /scrapers/google_lens/jobs

Submit Google Lens Job

Submit once and safely replay the same key and body for seven days. Poll the returned URL; interrupted work is not automatically repeated.

Parameters

Idempotency-Key header · required

JSON body

Search one public HTTPS image or an owner-scoped uploaded image.

asset_id string | null · optional

Private image from POST /scrapers/assets; mutually exclusive with image_url. Pattern: ^rasset_[a-f0-9]{32}$.

image_url string | null · optional

Public HTTPS image URL without credentials or private addresses. Minimum length: 1. Maximum length: 4096.

limit integer · optional

Maximum total records across all requested types, interleaved in the requested order. Minimum: 1. Maximum: 100. Default: 20.

search_types visual | exact | text[] · required

Minimum items: 1. Maximum items: 3. Items must be distinct.

Response · 202

Successful Response

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
poll_url string · required
result object | null · optional
status pending | running | completed | failed | outcome_unknown · required

GET /scrapers/google_lens/jobs/{job_id}

Get Google Lens Job

Poll without starting a new search. Results expire after 24 hours.

Parameters

job_id path · required

Response · 200

Successful Response

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
poll_url string · required
result object | null · optional
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/google_lens/search

Google Lens Search

Find visual or exact image matches and extract text using Google Lens. Results share one total limit; a search can return no matches.

JSON body

Search one public HTTPS image or an owner-scoped uploaded image.

asset_id string | null · optional

Private image from POST /scrapers/assets; mutually exclusive with image_url. Pattern: ^rasset_[a-f0-9]{32}$.

image_url string | null · optional

Public HTTPS image URL without credentials or private addresses. Minimum length: 1. Maximum length: 4096.

limit integer · optional

Maximum total records across all requested types, interleaved in the requested order. Minimum: 1. Maximum: 100. Default: 20.

search_types visual | exact | text[] · required

Minimum items: 1. Maximum items: 3. Items must be distinct.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 100.

items object | object[] · required

Maximum items: 100.

items[].image_expires_at integer | null · optional
items[].image_height integer | null · optional

Minimum: 1. Maximum: 100000.

items[].image_kind thumbnail | null · optional
items[].image_sha256 string | null · optional

Pattern: ^[a-f0-9]{64}$.

items[].image_url string | null · optional

Maximum length: 4096.

items[].image_width integer | null · optional

Minimum: 1. Maximum: 100000.

items[].source string | null · optional

Maximum length: 512.

items[].source_icon_url string | null · optional

Maximum length: 4096.

items[].title string · required

Minimum length: 1. Maximum length: 4096.

items[].type visual | exact · required
items[].url string · required

Maximum length: 4096.

items[].text string · required

Minimum length: 1. Maximum length: 20000.

items[].type text · required
partial boolean | null · optional

POST /scrapers/instagram/people/search

Instagram People Search

Collect at most 50 native account candidates. Commas become spaces; locations are query hints. Missing biography/avatar fields are explicit. Prefer: respond-async returns promptly; default wait is at most 20 seconds. Cached pages/replays launch no new work.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

locations string[] · optional

Up to five location hints of 1–100 characters, appended in caller order to one native query. Ambiguous names remain text; no city resolution or AND/OR geographic filters are enforced. Maximum items: 5.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

query string · required

Free-text name, optionally with employer/city. Echoed exactly; matching does not verify identity or enforce filters. Minimum length: 1. Maximum length: 200.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

effective_query string · required

Text sent to native account search, including location hints. Instagram commas become spaces to keep one query.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

filters_enforced false · required

City and employer restrictions are not enforced. Returned accounts are candidates, never verified identities.

items object[] · required

Maximum items: 50.

items[].biography string | null · optional
items[].category string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].is_business boolean | null · optional
items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional
items[].missing_fields display_name | biography | image_url[] · required

Unavailable core profile fields. No inferred or purchased enrichment. Maximum items: 3.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].query string · required
items[].rank integer · required

Absolute one-based position after canonical account deduplication, preserving native order. Minimum: 1. Maximum: 50.

items[].status candidate · required
items[].username string · required
items[].website_url string | null · optional
limit integer · required

Minimum: 1. Maximum: 50.

location_handling not_requested | query_hint · required
locations string[] · required
next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

query string · required
result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

truncated true | null · required

True when collection omitted results; null means completeness is unknown.

Response · 202

Durable native account search; poll the owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/instagram/profile/details

Instagram Profile Details

Retrieve public Instagram profile details for up to ten handles or URLs.

JSON body

One to ten Instagram handles or canonical public profile URLs.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 10.

items object[] · required

Maximum items: 10.

items[].biography string | null · optional
items[].category string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_business boolean | null · optional
items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional
items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].target string · required
items[].username string · required
items[].website_url string | null · optional
unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

POST /scrapers/instagram/profile/posts

Instagram Profile Posts

Return a cached page or wait up to 20 seconds. Prefer: respond-async submits promptly. Media URLs may expire; full history is unknown.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

Collect up to 50 posts per unique profile; page the stable cached window.

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

retain_media boolean · optional

Preserve up to 20 unique photos/video thumbnails (JPEG/PNG/WebP), 10 MiB and 40 million pixels each, 32 MiB downloaded per job, two at once for up to 30 seconds within the remaining job deadline. No video download. Assets share bearer/global quotas and expire after 24 hours. Cached pages/replay never download again. Default: false.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

history_complete null · required

Full platform history is unknown. Pages cover only the cached collection.

history_scope collected_window | recent_public_timeline · optional

Facebook is limited to recent publicly visible timeline posts (typically 25–40); cached pages cannot retrieve older history. Default: "collected_window".

items object[] · required

Maximum items: 50.

items[].author object · required
items[].author.display_name string | null · optional
items[].author.image_url string | null · optional
items[].author.profile_id string | null · optional
items[].author.profile_url string · required
items[].author.username string | null · optional
items[].comments_count integer | null · optional

Minimum: 0.

items[].context object[] · required

Maximum items: 2.

items[].context[].author object · required
items[].context[].author.display_name string | null · optional
items[].context[].author.image_url string | null · optional
items[].context[].author.profile_id string | null · optional
items[].context[].author.profile_url string · required
items[].context[].author.username string | null · optional
items[].context[].comments_count integer | null · optional

Minimum: 0.

items[].context[].geotag object | null · required
items[].context[].kind repost | quote · required
items[].context[].likes_count integer | null · optional

Minimum: 0.

items[].context[].media object[] · required

Maximum items: 100.

items[].context[].media[].asset object | null · optional
items[].context[].media[].bitrate integer | null · optional

Minimum: 0.

items[].context[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].context[].media[].mime_type string | null · optional
items[].context[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].context[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].context[].media[].role original | thumbnail · required
items[].context[].media[].type image | video · required
items[].context[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].context[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].context[].post_id string · required
items[].context[].quotes_count integer | null · optional

Minimum: 0.

items[].context[].reposts_count integer | null · optional

Minimum: 0.

items[].context[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].context[].text string | null · required
items[].context[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].context[].url string · required
items[].context[].views_count integer | null · optional

Minimum: 0.

items[].geotag object | null · required
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_pinned boolean | null · optional
items[].is_quote boolean | null · optional
items[].is_repost boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].media object[] · required

Maximum items: 100.

items[].media[].asset object | null · optional
items[].media[].bitrate integer | null · optional

Minimum: 0.

items[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].media[].mime_type string | null · optional
items[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].media[].role original | thumbnail · required
items[].media[].type image | video · required
items[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].post_id string · required
items[].quotes_count integer | null · optional

Minimum: 0.

items[].reposts_count integer | null · optional

Minimum: 0.

items[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].target string · required
items[].text string | null · required
items[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].url string · required
items[].views_count integer | null · optional

Minimum: 0.

limit integer · required

Minimum: 1. Maximum: 50.

next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

per_target_limit integer · required

Minimum: 1. Maximum: 50.

result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

targets object[] · required

Maximum items: 10.

targets[].collected_count integer · required

Minimum: 0. Maximum: 50.

targets[].input_index integer · required

Minimum: 0. Maximum: 9.

targets[].reason not_found | private | unavailable | malformed_data | ambiguous | null · required
targets[].status resolved | unresolved · required
targets[].target string · required
truncated true | null · required

True when collection omitted results; null means completeness is unknown.

unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

Response · 202

Durable job; poll the returned owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

GET /scrapers/jobs/{job_id}

Get Social Research Job

Poll this bearer's social research job without launching external work.

Parameters

job_id path · required

Response · 200

Successful Response

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required
created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required
created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required
created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required
created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/linkedin/company/employees

Company Employees

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

companies string[] · required

Minimum items: 1. Maximum items: 20.

company_headcounts string[] · optional

Maximum items: 10.

detail_level basic | full · optional

Default: "basic".

exclude_functions string[] · optional

Maximum items: 30.

exclude_industries string[] · optional

Maximum items: 50.

exclude_locations string[] · optional

Maximum items: 50.

exclude_past_titles string[] · optional

Maximum items: 50.

exclude_seniority_levels string[] · optional

Maximum items: 20.

exclude_titles string[] · optional

Maximum items: 50.

experience_levels string[] · optional

Maximum items: 10.

functions string[] · optional

Maximum items: 30.

industries string[] · optional

Maximum items: 50.

limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

locations string[] · optional

Maximum items: 50.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

past_titles string[] · optional

Maximum items: 50.

query string | null · optional

Minimum length: 1. Maximum length: 300.

recently_changed_jobs boolean | null · optional
seniority_levels string[] · optional

Maximum items: 20.

titles string[] · optional

Maximum items: 50.

years_at_company string[] · optional

Maximum items: 10.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].about string | null · optional
items[].certifications object[] · optional
items[].certifications[].credential_id string | null · optional
items[].certifications[].credential_url string | null · optional
items[].certifications[].expires_at string | null · optional
items[].certifications[].issued_at string | null · optional
items[].certifications[].issuer string | null · optional
items[].certifications[].name string | null · optional
items[].connection_count integer | null · optional
items[].courses object[] · optional
items[].courses[].associated_with string | null · optional
items[].courses[].name string | null · optional
items[].courses[].number string | null · optional
items[].current_positions object[] · optional
items[].current_positions[].company string | null · optional
items[].current_positions[].company_url string | null · optional
items[].current_positions[].date_range object | null · optional
items[].current_positions[].description string | null · optional
items[].current_positions[].duration string | null · optional
items[].current_positions[].employment_type string | null · optional
items[].current_positions[].location string | null · optional
items[].current_positions[].skills string[] · optional
items[].current_positions[].title string | null · optional
items[].current_positions[].workplace_type string | null · optional
items[].education object[] · optional
items[].education[].activities string | null · optional
items[].education[].date_range object | null · optional
items[].education[].degree string | null · optional
items[].education[].description string | null · optional
items[].education[].field_of_study string | null · optional
items[].education[].school string | null · optional
items[].education[].school_url string | null · optional
items[].experience object[] · optional
items[].experience[].company string | null · optional
items[].experience[].company_url string | null · optional
items[].experience[].date_range object | null · optional
items[].experience[].description string | null · optional
items[].experience[].duration string | null · optional
items[].experience[].employment_type string | null · optional
items[].experience[].location string | null · optional
items[].experience[].skills string[] · optional
items[].experience[].title string | null · optional
items[].experience[].workplace_type string | null · optional
items[].first_name string | null · optional
items[].follower_count integer | null · optional
items[].headline string | null · optional
items[].honors object[] · optional
items[].honors[].description string | null · optional
items[].honors[].issued_at string | null · optional
items[].honors[].issuer string | null · optional
items[].honors[].title string | null · optional
items[].image object | null · optional
items[].languages object[] · optional
items[].languages[].name string · required
items[].languages[].proficiency string | null · optional
items[].last_name string | null · optional
items[].location string | null · optional
items[].name string | null · optional
items[].profile_url string | null · optional
items[].projects object[] · optional
items[].projects[].date_range object | null · optional
items[].projects[].description string | null · optional
items[].projects[].name string | null · optional
items[].projects[].url string | null · optional
items[].public_id string | null · optional
items[].publications object[] · optional
items[].publications[].description string | null · optional
items[].publications[].published_at string | null · optional
items[].publications[].publisher string | null · optional
items[].publications[].title string | null · optional
items[].publications[].url string | null · optional
items[].recommendations object[] · optional
items[].recommendations[].author object | null · optional
items[].recommendations[].relationship string | null · optional
items[].recommendations[].text string | null · optional
items[].skills object[] · optional
items[].skills[].endorsements integer | null · optional
items[].skills[].name string · required
items[].volunteering object[] · optional
items[].volunteering[].cause string | null · optional
items[].volunteering[].date_range object | null · optional
items[].volunteering[].description string | null · optional
items[].volunteering[].organization string | null · optional
items[].volunteering[].role string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/people/search

People Search

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

company_headcounts string[] · optional

Maximum items: 10.

company_locations string[] · optional

Maximum items: 70.

current_companies string[] · optional

Maximum items: 50.

current_titles string[] · optional

Maximum items: 50.

detail_level basic | full · optional

Default: "basic".

exclude_company_locations string[] · optional

Maximum items: 70.

exclude_current_companies string[] · optional

Maximum items: 50.

exclude_current_titles string[] · optional

Maximum items: 50.

exclude_functions string[] · optional

Maximum items: 30.

exclude_industries string[] · optional

Maximum items: 50.

exclude_locations string[] · optional

Maximum items: 70.

exclude_past_companies string[] · optional

Maximum items: 50.

exclude_past_titles string[] · optional

Maximum items: 50.

exclude_schools string[] · optional

Maximum items: 50.

exclude_seniority_levels string[] · optional

Maximum items: 20.

experience_levels string[] · optional

Maximum items: 10.

first_names string[] · optional

Maximum items: 50.

functions string[] · optional

Maximum items: 30.

industries string[] · optional

Maximum items: 50.

languages string[] · optional

Maximum items: 20.

last_names string[] · optional

Maximum items: 50.

limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

locations string[] · optional

Maximum items: 70.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

past_companies string[] · optional

Maximum items: 50.

past_titles string[] · optional

Maximum items: 50.

query string | null · optional

Minimum length: 1. Maximum length: 300.

recently_changed_jobs boolean | null · optional
recently_posted boolean | null · optional
schools string[] · optional

Maximum items: 50.

seniority_levels string[] · optional

Maximum items: 20.

years_at_company string[] · optional

Maximum items: 10.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].about string | null · optional
items[].certifications object[] · optional
items[].certifications[].credential_id string | null · optional
items[].certifications[].credential_url string | null · optional
items[].certifications[].expires_at string | null · optional
items[].certifications[].issued_at string | null · optional
items[].certifications[].issuer string | null · optional
items[].certifications[].name string | null · optional
items[].connection_count integer | null · optional
items[].courses object[] · optional
items[].courses[].associated_with string | null · optional
items[].courses[].name string | null · optional
items[].courses[].number string | null · optional
items[].current_positions object[] · optional
items[].current_positions[].company string | null · optional
items[].current_positions[].company_url string | null · optional
items[].current_positions[].date_range object | null · optional
items[].current_positions[].description string | null · optional
items[].current_positions[].duration string | null · optional
items[].current_positions[].employment_type string | null · optional
items[].current_positions[].location string | null · optional
items[].current_positions[].skills string[] · optional
items[].current_positions[].title string | null · optional
items[].current_positions[].workplace_type string | null · optional
items[].education object[] · optional
items[].education[].activities string | null · optional
items[].education[].date_range object | null · optional
items[].education[].degree string | null · optional
items[].education[].description string | null · optional
items[].education[].field_of_study string | null · optional
items[].education[].school string | null · optional
items[].education[].school_url string | null · optional
items[].experience object[] · optional
items[].experience[].company string | null · optional
items[].experience[].company_url string | null · optional
items[].experience[].date_range object | null · optional
items[].experience[].description string | null · optional
items[].experience[].duration string | null · optional
items[].experience[].employment_type string | null · optional
items[].experience[].location string | null · optional
items[].experience[].skills string[] · optional
items[].experience[].title string | null · optional
items[].experience[].workplace_type string | null · optional
items[].first_name string | null · optional
items[].follower_count integer | null · optional
items[].headline string | null · optional
items[].honors object[] · optional
items[].honors[].description string | null · optional
items[].honors[].issued_at string | null · optional
items[].honors[].issuer string | null · optional
items[].honors[].title string | null · optional
items[].image object | null · optional
items[].languages object[] · optional
items[].languages[].name string · required
items[].languages[].proficiency string | null · optional
items[].last_name string | null · optional
items[].location string | null · optional
items[].name string | null · optional
items[].profile_url string | null · optional
items[].projects object[] · optional
items[].projects[].date_range object | null · optional
items[].projects[].description string | null · optional
items[].projects[].name string | null · optional
items[].projects[].url string | null · optional
items[].public_id string | null · optional
items[].publications object[] · optional
items[].publications[].description string | null · optional
items[].publications[].published_at string | null · optional
items[].publications[].publisher string | null · optional
items[].publications[].title string | null · optional
items[].publications[].url string | null · optional
items[].recommendations object[] · optional
items[].recommendations[].author object | null · optional
items[].recommendations[].relationship string | null · optional
items[].recommendations[].text string | null · optional
items[].skills object[] · optional
items[].skills[].endorsements integer | null · optional
items[].skills[].name string · required
items[].volunteering object[] · optional
items[].volunteering[].cause string | null · optional
items[].volunteering[].date_range object | null · optional
items[].volunteering[].description string | null · optional
items[].volunteering[].organization string | null · optional
items[].volunteering[].role string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/post/comments

Post Comments

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

freshness hour | day | week | month | three_months | six_months | year | null · optional
include_replies boolean · optional

Default: true.

limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

posts string[] · required

Minimum items: 1. Maximum items: 20.

replies_limit integer · optional

Minimum: 0. Maximum: 100. Default: 5.

since string | null · optional

Format: date-time.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].author object | null · optional
items[].comment_id string | null · optional
items[].comment_url string | null · optional
items[].created_at string | null · optional
items[].metrics object | null · optional
items[].parent_comment_id string | null · optional
items[].post object | null · optional
items[].replies object[] · optional
items[].replies[].author object | null · optional
items[].replies[].comment_id string | null · optional
items[].replies[].comment_url string | null · optional
items[].replies[].created_at string | null · optional
items[].replies[].metrics object | null · optional
items[].replies[].parent_comment_id string | null · optional
items[].replies[].text string | null · optional
items[].text string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/post/search

Post Search

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

author_companies string[] · optional

Maximum items: 10.

author_industries string[] · optional

Maximum items: 20.

author_keywords string | null · optional

Minimum length: 1. Maximum length: 300.

author_profiles string[] · optional

Maximum items: 10.

authors_employers string[] · optional

Maximum items: 20.

comments_freshness hour | day | week | month | three_months | six_months | year | null · optional
comments_limit integer · optional

Minimum: 0. Maximum: 100. Default: 0.

content_type all | videos | images | jobs | live_videos | documents | collaborative_articles · optional

Default: "all".

freshness hour | day | week | month | three_months | six_months | year | null · optional
limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

mentioned_companies string[] · optional

Maximum items: 10.

mentioned_profiles string[] · optional

Maximum items: 10.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

queries string[] · required

Minimum items: 1. Maximum items: 20.

reactions_limit integer · optional

Minimum: 0. Maximum: 100. Default: 0.

since string | null · optional

Format: date-time.

sort relevance | date · optional

Default: "relevance".

Response · 200

Successful Response

count integer · required
items object[] · required
items[].author object | null · optional
items[].comments object[] · optional
items[].comments[].author object | null · optional
items[].comments[].comment_id string | null · optional
items[].comments[].comment_url string | null · optional
items[].comments[].created_at string | null · optional
items[].comments[].metrics object | null · optional
items[].comments[].parent_comment_id string | null · optional
items[].comments[].post object | null · optional
items[].comments[].replies object[] · optional
items[].comments[].replies[].author object | null · optional
items[].comments[].replies[].comment_id string | null · optional
items[].comments[].replies[].comment_url string | null · optional
items[].comments[].replies[].created_at string | null · optional
items[].comments[].replies[].metrics object | null · optional
items[].comments[].replies[].parent_comment_id string | null · optional
items[].comments[].replies[].text string | null · optional
items[].comments[].text string | null · optional
items[].content_type string | null · optional
items[].media object[] · optional
items[].media[].description string | null · optional
items[].media[].image object | null · optional
items[].media[].kind string | null · optional
items[].media[].title string | null · optional
items[].media[].url string | null · optional
items[].metrics object | null · optional
items[].post_id string | null · optional
items[].post_url string | null · optional
items[].posted_at string | null · optional
items[].reactions object[] · optional
items[].reactions[].author object | null · optional
items[].reactions[].created_at string | null · optional
items[].reactions[].kind string | null · optional
items[].reactions[].post object | null · optional
items[].reactions[].reaction_id string | null · optional
items[].text string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/profile/comments

Profile Comments

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

freshness hour | day | week | month | three_months | six_months | year | null · optional
limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 20.

since string | null · optional

Format: date-time.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].author object | null · optional
items[].comment_id string | null · optional
items[].comment_url string | null · optional
items[].created_at string | null · optional
items[].metrics object | null · optional
items[].parent_comment_id string | null · optional
items[].post object | null · optional
items[].replies object[] · optional
items[].replies[].author object | null · optional
items[].replies[].comment_id string | null · optional
items[].replies[].comment_url string | null · optional
items[].replies[].created_at string | null · optional
items[].replies[].metrics object | null · optional
items[].replies[].parent_comment_id string | null · optional
items[].replies[].text string | null · optional
items[].text string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/profile/details

Profile Details

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

detail_level basic | full · optional

Default: "full".

profiles string[] · required

Minimum items: 1. Maximum items: 50.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].about string | null · optional
items[].certifications object[] · optional
items[].certifications[].credential_id string | null · optional
items[].certifications[].credential_url string | null · optional
items[].certifications[].expires_at string | null · optional
items[].certifications[].issued_at string | null · optional
items[].certifications[].issuer string | null · optional
items[].certifications[].name string | null · optional
items[].connection_count integer | null · optional
items[].courses object[] · optional
items[].courses[].associated_with string | null · optional
items[].courses[].name string | null · optional
items[].courses[].number string | null · optional
items[].current_positions object[] · optional
items[].current_positions[].company string | null · optional
items[].current_positions[].company_url string | null · optional
items[].current_positions[].date_range object | null · optional
items[].current_positions[].description string | null · optional
items[].current_positions[].duration string | null · optional
items[].current_positions[].employment_type string | null · optional
items[].current_positions[].location string | null · optional
items[].current_positions[].skills string[] · optional
items[].current_positions[].title string | null · optional
items[].current_positions[].workplace_type string | null · optional
items[].education object[] · optional
items[].education[].activities string | null · optional
items[].education[].date_range object | null · optional
items[].education[].degree string | null · optional
items[].education[].description string | null · optional
items[].education[].field_of_study string | null · optional
items[].education[].school string | null · optional
items[].education[].school_url string | null · optional
items[].experience object[] · optional
items[].experience[].company string | null · optional
items[].experience[].company_url string | null · optional
items[].experience[].date_range object | null · optional
items[].experience[].description string | null · optional
items[].experience[].duration string | null · optional
items[].experience[].employment_type string | null · optional
items[].experience[].location string | null · optional
items[].experience[].skills string[] · optional
items[].experience[].title string | null · optional
items[].experience[].workplace_type string | null · optional
items[].first_name string | null · optional
items[].follower_count integer | null · optional
items[].headline string | null · optional
items[].honors object[] · optional
items[].honors[].description string | null · optional
items[].honors[].issued_at string | null · optional
items[].honors[].issuer string | null · optional
items[].honors[].title string | null · optional
items[].image object | null · optional
items[].languages object[] · optional
items[].languages[].name string · required
items[].languages[].proficiency string | null · optional
items[].last_name string | null · optional
items[].location string | null · optional
items[].name string | null · optional
items[].profile_url string | null · optional
items[].projects object[] · optional
items[].projects[].date_range object | null · optional
items[].projects[].description string | null · optional
items[].projects[].name string | null · optional
items[].projects[].url string | null · optional
items[].public_id string | null · optional
items[].publications object[] · optional
items[].publications[].description string | null · optional
items[].publications[].published_at string | null · optional
items[].publications[].publisher string | null · optional
items[].publications[].title string | null · optional
items[].publications[].url string | null · optional
items[].recommendations object[] · optional
items[].recommendations[].author object | null · optional
items[].recommendations[].relationship string | null · optional
items[].recommendations[].text string | null · optional
items[].skills object[] · optional
items[].skills[].endorsements integer | null · optional
items[].skills[].name string · required
items[].volunteering object[] · optional
items[].volunteering[].cause string | null · optional
items[].volunteering[].date_range object | null · optional
items[].volunteering[].description string | null · optional
items[].volunteering[].organization string | null · optional
items[].volunteering[].role string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/profile/posts

Profile Posts

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

comments_limit integer · optional

Minimum: 0. Maximum: 100. Default: 0.

freshness hour | day | week | month | three_months | six_months | year | null · optional
include_quotes boolean · optional

Default: true.

include_reposts boolean · optional

Default: true.

limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 20.

reactions_limit integer · optional

Minimum: 0. Maximum: 100. Default: 0.

since string | null · optional

Format: date-time.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].author object | null · optional
items[].comments object[] · optional
items[].comments[].author object | null · optional
items[].comments[].comment_id string | null · optional
items[].comments[].comment_url string | null · optional
items[].comments[].created_at string | null · optional
items[].comments[].metrics object | null · optional
items[].comments[].parent_comment_id string | null · optional
items[].comments[].post object | null · optional
items[].comments[].replies object[] · optional
items[].comments[].replies[].author object | null · optional
items[].comments[].replies[].comment_id string | null · optional
items[].comments[].replies[].comment_url string | null · optional
items[].comments[].replies[].created_at string | null · optional
items[].comments[].replies[].metrics object | null · optional
items[].comments[].replies[].parent_comment_id string | null · optional
items[].comments[].replies[].text string | null · optional
items[].comments[].text string | null · optional
items[].content_type string | null · optional
items[].media object[] · optional
items[].media[].description string | null · optional
items[].media[].image object | null · optional
items[].media[].kind string | null · optional
items[].media[].title string | null · optional
items[].media[].url string | null · optional
items[].metrics object | null · optional
items[].post_id string | null · optional
items[].post_url string | null · optional
items[].posted_at string | null · optional
items[].reactions object[] · optional
items[].reactions[].author object | null · optional
items[].reactions[].created_at string | null · optional
items[].reactions[].kind string | null · optional
items[].reactions[].post object | null · optional
items[].reactions[].reaction_id string | null · optional
items[].text string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/linkedin/profile/reactions

Profile Reactions

Retrieve public LinkedIn data using the documented filters and pagination fields.

JSON body

freshness hour | day | week | month | three_months | six_months | year | null · optional
limit integer · optional

Minimum: 1. Maximum: 1000. Default: 100.

page integer · optional

Minimum: 1. Maximum: 100. Default: 1.

pages integer · optional

Minimum: 1. Maximum: 20. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 20.

since string | null · optional

Format: date-time.

Response · 200

Successful Response

count integer · required
items object[] · required
items[].author object | null · optional
items[].created_at string | null · optional
items[].kind string | null · optional
items[].post object | null · optional
items[].reaction_id string | null · optional
next_page integer | null · optional
page integer | null · optional
total integer | null · optional

POST /scrapers/sherlock/search

Sherlock Search

Discover public username candidates with Sherlock. Matching handles do not establish identity; completeness may be unknown.

JSON body

Discover candidate accounts for one to five public usernames.

limit integer · optional

Maximum candidates per distinct username. Minimum: 1. Maximum: 100. Default: 20.

usernames string[] · required

Minimum items: 1. Maximum items: 5.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 500.

items object[] · required

Maximum items: 500.

items[].profile_url string · required
items[].site string · required
items[].status candidate · required
items[].username string · required
truncated true | null · required

True when a work or result limit omitted results; null means completeness is unknown. Candidate matches do not establish identity.

POST /scrapers/tiktok/people/search

Tiktok People Search

Collect at most 50 native user candidates with available profile fields. Location texts are appended in caller order as query hints, never enforced city filters. Prefer: respond-async returns promptly; default wait is at most 20 seconds. Cached pages/replays launch no new work.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

locations string[] · optional

Up to five location hints of 1–100 characters, appended in caller order to one native query. Ambiguous names remain text; no city resolution or AND/OR geographic filters are enforced. Maximum items: 5.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

query string · required

Free-text name, optionally with employer/city. Echoed exactly; matching does not verify identity or enforce filters. Minimum length: 1. Maximum length: 200.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

effective_query string · required

Text sent to native account search, including location hints. Instagram commas become spaces to keep one query.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

filters_enforced false · required

City and employer restrictions are not enforced. Returned accounts are candidates, never verified identities.

items object[] · required

Maximum items: 50.

items[].biography string | null · optional
items[].created_at string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].friends_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].is_organization boolean | null · optional
items[].is_private boolean | null · optional
items[].is_seller boolean | null · optional
items[].is_verified boolean | null · optional
items[].language string | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].missing_fields display_name | biography | image_url[] · required

Unavailable core profile fields. No inferred or purchased enrichment. Maximum items: 3.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].query string · required
items[].rank integer · required

Absolute one-based position after canonical account deduplication, preserving native order. Minimum: 1. Maximum: 50.

items[].status candidate · required
items[].username string · required
items[].website_url string | null · optional
limit integer · required

Minimum: 1. Maximum: 50.

location_handling not_requested | query_hint · required
locations string[] · required
next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

query string · required
result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

truncated true | null · required

True when collection omitted results; null means completeness is unknown.

Response · 202

Durable native user search; poll the owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/tiktok/profile/details

Tiktok Profile Details

Retrieve public TikTok profile details for up to ten usernames or profile URLs.

JSON body

One to ten TikTok usernames or canonical public @username URLs.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 10.

items object[] · required

Maximum items: 10.

items[].biography string | null · optional
items[].created_at string | null · optional
items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].friends_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_organization boolean | null · optional
items[].is_private boolean | null · optional
items[].is_seller boolean | null · optional
items[].is_verified boolean | null · optional
items[].language string | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].target string · required
items[].username string · required
items[].website_url string | null · optional
unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

POST /scrapers/tiktok/profile/posts

Tiktok Profile Posts

Return public videos and ordered slideshow images, with separate cover thumbnails and source authors. Prefer: respond-async submits promptly.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

Collect up to 50 public videos or slideshows per unique profile.

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

retain_media boolean · optional

Preserve up to 20 unique photos/video thumbnails (JPEG/PNG/WebP), 10 MiB and 40 million pixels each, 32 MiB downloaded per job, two at once for up to 30 seconds within the remaining job deadline. No video download. Assets share bearer/global quotas and expire after 24 hours. Cached pages/replay never download again. Default: false.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

history_complete null · required

Full platform history is unknown. Pages cover only the cached collection.

history_scope collected_window | recent_public_timeline · optional

Facebook is limited to recent publicly visible timeline posts (typically 25–40); cached pages cannot retrieve older history. Default: "collected_window".

items object[] · required

Maximum items: 50.

items[].author object · required
items[].author.display_name string | null · optional
items[].author.image_url string | null · optional
items[].author.profile_id string | null · optional
items[].author.profile_url string · required
items[].author.username string | null · optional
items[].comments_count integer | null · optional

Minimum: 0.

items[].context object[] · required

Maximum items: 2.

items[].context[].author object · required
items[].context[].author.display_name string | null · optional
items[].context[].author.image_url string | null · optional
items[].context[].author.profile_id string | null · optional
items[].context[].author.profile_url string · required
items[].context[].author.username string | null · optional
items[].context[].comments_count integer | null · optional

Minimum: 0.

items[].context[].geotag object | null · required
items[].context[].kind repost | quote · required
items[].context[].likes_count integer | null · optional

Minimum: 0.

items[].context[].media object[] · required

Maximum items: 100.

items[].context[].media[].asset object | null · optional
items[].context[].media[].bitrate integer | null · optional

Minimum: 0.

items[].context[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].context[].media[].mime_type string | null · optional
items[].context[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].context[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].context[].media[].role original | thumbnail · required
items[].context[].media[].type image | video · required
items[].context[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].context[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].context[].post_id string · required
items[].context[].quotes_count integer | null · optional

Minimum: 0.

items[].context[].reposts_count integer | null · optional

Minimum: 0.

items[].context[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].context[].text string | null · required
items[].context[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].context[].url string · required
items[].context[].views_count integer | null · optional

Minimum: 0.

items[].geotag object | null · required
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_pinned boolean | null · optional
items[].is_quote boolean | null · optional
items[].is_repost boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].media object[] · required

Maximum items: 100.

items[].media[].asset object | null · optional
items[].media[].bitrate integer | null · optional

Minimum: 0.

items[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].media[].mime_type string | null · optional
items[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].media[].role original | thumbnail · required
items[].media[].type image | video · required
items[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].post_id string · required
items[].quotes_count integer | null · optional

Minimum: 0.

items[].reposts_count integer | null · optional

Minimum: 0.

items[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].target string · required
items[].text string | null · required
items[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].url string · required
items[].views_count integer | null · optional

Minimum: 0.

limit integer · required

Minimum: 1. Maximum: 50.

next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

per_target_limit integer · required

Minimum: 1. Maximum: 50.

result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

targets object[] · required

Maximum items: 10.

targets[].collected_count integer · required

Minimum: 0. Maximum: 50.

targets[].input_index integer · required

Minimum: 0. Maximum: 9.

targets[].reason not_found | private | unavailable | malformed_data | ambiguous | null · required
targets[].status resolved | unresolved · required
targets[].target string · required
truncated true | null · required

True when collection omitted results; null means completeness is unknown.

unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

Response · 202

Durable job; poll the returned owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/x/people/search

X People Search

Collect at most 50 native account candidates with available profile fields. Locations are query hints, not filters. Prefer: respond-async returns promptly; default wait is at most 20 seconds. Cached pages/replays launch no new work.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

locations string[] · optional

Up to five location hints of 1–100 characters, appended in caller order to one native query. Ambiguous names remain text; no city resolution or AND/OR geographic filters are enforced. Maximum items: 5.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

query string · required

Free-text name, optionally with employer/city. Echoed exactly; matching does not verify identity or enforce filters. Minimum length: 1. Maximum length: 200.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

effective_query string · required

Text sent to native account search, including location hints. Instagram commas become spaces to keep one query.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

filters_enforced false · required

City and employer restrictions are not enforced. Returned accounts are candidates, never verified identities.

items object[] · required

Maximum items: 50.

items[].biography string | null · optional
items[].cover_image_url string | null · optional
items[].created_at string | null · optional

Account creation timestamp in ISO 8601 UTC.

items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].is_blue_verified boolean | null · optional
items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional

Verification observation; absent or null when the source supplies only an ambiguous untyped flag.

items[].likes_count integer | null · optional

Minimum: 0.

items[].listed_count integer | null · optional

Minimum: 0.

items[].location string | null · optional
items[].media_count integer | null · optional

Minimum: 0.

items[].missing_fields display_name | biography | image_url[] · required

Unavailable core profile fields. No inferred or purchased enrichment. Maximum items: 3.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].query string · required
items[].rank integer · required

Absolute one-based position after canonical account deduplication, preserving native order. Minimum: 1. Maximum: 50.

items[].status candidate · required
items[].username string · required
items[].verification_type string | null · optional
items[].website_url string | null · optional
limit integer · required

Minimum: 1. Maximum: 50.

location_handling not_requested | query_hint · required
locations string[] · required
next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

query string · required
result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

truncated true | null · required

True when collection omitted results; null means completeness is unknown.

Response · 202

Durable native account search; poll the owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required

POST /scrapers/x/profile/details

X Profile Details

Retrieve public X profile details for up to ten handles or profile URLs.

JSON body

One to ten X handles or canonical x.com or twitter.com profile URLs.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

Response · 200

Successful Response

count integer · required

Minimum: 0. Maximum: 10.

items object[] · required

Maximum items: 10.

items[].biography string | null · optional
items[].cover_image_url string | null · optional
items[].created_at string | null · optional

Account creation timestamp in ISO 8601 UTC.

items[].display_name string | null · optional
items[].followers_count integer | null · optional

Minimum: 0.

items[].following_count integer | null · optional

Minimum: 0.

items[].image_url string | null · optional
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_blue_verified boolean | null · optional
items[].is_private boolean | null · optional
items[].is_verified boolean | null · optional

Verification observation; absent or null when the source supplies only an ambiguous untyped flag.

items[].likes_count integer | null · optional

Minimum: 0.

items[].listed_count integer | null · optional

Minimum: 0.

items[].location string | null · optional
items[].media_count integer | null · optional

Minimum: 0.

items[].posts_count integer | null · optional

Minimum: 0.

items[].profile_id string | null · optional
items[].profile_url string · required
items[].public_links object[] | null · optional
items[].target string · required
items[].username string · required
items[].verification_type string | null · optional
items[].website_url string | null · optional
unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

POST /scrapers/x/profile/posts

X Profile Posts

Return bounded X posts with source authors, ordered media and quote/repost context. Prefer: respond-async submits promptly.

Parameters

Idempotency-Key header · optional

Required for initial collection; cached result_id pages need no key.

prefer header · optional

JSON body

Collect up to 50 posts per unique profile; page the stable cached window.

limit integer · optional

Minimum: 1. Maximum: 50. Default: 20.

page integer · optional

One-based cached page. Initial collection requires page 1; later pages require result_id and cannot extend the collected window. Minimum: 1. Maximum: 500. Default: 1.

profiles string[] · required

Minimum items: 1. Maximum items: 10.

result_id string | null · optional

Owner- and operation-bound immutable collection. Keep the same business request, ordered inputs and limit. Cached pages require no Idempotency-Key and launch no additional work. Pattern: ^rresult_[a-f0-9]{32}$.

retain_media boolean · optional

Preserve up to 20 unique photos/video thumbnails (JPEG/PNG/WebP), 10 MiB and 40 million pixels each, 32 MiB downloaded per job, two at once for up to 30 seconds within the remaining job deadline. No video download. Assets share bearer/global quotas and expire after 24 hours. Cached pages/replay never download again. Default: false.

Response · 200

Successful Response

collected_count integer · required

Minimum: 0. Maximum: 500.

collection_limit integer · required

Minimum: 1. Maximum: 500.

count integer · required

Minimum: 0. Maximum: 50.

expires_at integer · required

Unix seconds; the collection expires 24 hours after submission. Polling, replay and cached pages do not renew it.

history_complete null · required

Full platform history is unknown. Pages cover only the cached collection.

history_scope collected_window | recent_public_timeline · optional

Facebook is limited to recent publicly visible timeline posts (typically 25–40); cached pages cannot retrieve older history. Default: "collected_window".

items object[] · required

Maximum items: 50.

items[].author object · required
items[].author.display_name string | null · optional
items[].author.image_url string | null · optional
items[].author.profile_id string | null · optional
items[].author.profile_url string · required
items[].author.username string | null · optional
items[].comments_count integer | null · optional

Minimum: 0.

items[].context object[] · required

Maximum items: 2.

items[].context[].author object · required
items[].context[].author.display_name string | null · optional
items[].context[].author.image_url string | null · optional
items[].context[].author.profile_id string | null · optional
items[].context[].author.profile_url string · required
items[].context[].author.username string | null · optional
items[].context[].comments_count integer | null · optional

Minimum: 0.

items[].context[].geotag object | null · required
items[].context[].kind repost | quote · required
items[].context[].likes_count integer | null · optional

Minimum: 0.

items[].context[].media object[] · required

Maximum items: 100.

items[].context[].media[].asset object | null · optional
items[].context[].media[].bitrate integer | null · optional

Minimum: 0.

items[].context[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].context[].media[].mime_type string | null · optional
items[].context[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].context[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].context[].media[].role original | thumbnail · required
items[].context[].media[].type image | video · required
items[].context[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].context[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].context[].post_id string · required
items[].context[].quotes_count integer | null · optional

Minimum: 0.

items[].context[].reposts_count integer | null · optional

Minimum: 0.

items[].context[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].context[].text string | null · required
items[].context[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].context[].url string · required
items[].context[].views_count integer | null · optional

Minimum: 0.

items[].geotag object | null · required
items[].input_index integer · required

Minimum: 0. Maximum: 9.

items[].is_pinned boolean | null · optional
items[].is_quote boolean | null · optional
items[].is_repost boolean | null · optional
items[].likes_count integer | null · optional

Minimum: 0.

items[].media object[] · required

Maximum items: 100.

items[].media[].asset object | null · optional
items[].media[].bitrate integer | null · optional

Minimum: 0.

items[].media[].group_index integer · required

Zero-based position in the source carousel; variants share a group. Minimum: 0. Maximum: 49.

items[].media[].mime_type string | null · optional
items[].media[].retention_reason not_requested | video_not_retained | count_limit | job_byte_limit | destination_rejected | source_unavailable | unsupported_format | invalid_image | too_large | quota_exceeded | timeout | download_failed | storage_unavailable | null · optional

Default: "not_requested".

items[].media[].retention_status retained | skipped | failed · optional

Default: "skipped".

items[].media[].role original | thumbnail · required
items[].media[].type image | video · required
items[].media[].url string · required

Original public source reference; may expire. Separate from the authenticated retained asset URL.

items[].mentions object[] | null · required

Caption/text mentions, separate from actual tags. Maximum items: 100.

items[].post_id string · required
items[].quotes_count integer | null · optional

Minimum: 0.

items[].reposts_count integer | null · optional

Minimum: 0.

items[].tagged_users object[] | null · required

Actual source tags; null means unavailable. Maximum items: 100.

items[].target string · required
items[].text string | null · required
items[].timestamp string | null · required

UTC ISO 8601 time; null means unavailable, never inferred epoch zero.

items[].url string · required
items[].views_count integer | null · optional

Minimum: 0.

limit integer · required

Minimum: 1. Maximum: 50.

next_page integer | null · required

Minimum: 2. Maximum: 500.

page integer · required

Minimum: 1. Maximum: 500.

partial boolean · required

Collection-wide flag repeated on every cached page: missing candidate core fields, unresolved post targets, or image retention failures/limits can set it, even when absent from this page.

per_target_limit integer · required

Minimum: 1. Maximum: 50.

result_id string · required

Pattern: ^rresult_[a-f0-9]{32}$.

targets object[] · required

Maximum items: 10.

targets[].collected_count integer · required

Minimum: 0. Maximum: 50.

targets[].input_index integer · required

Minimum: 0. Maximum: 9.

targets[].reason not_found | private | unavailable | malformed_data | ambiguous | null · required
targets[].status resolved | unresolved · required
targets[].target string · required
truncated true | null · required

True when collection omitted results; null means completeness is unknown.

unresolved object[] · required

Maximum items: 10.

unresolved[].input_index integer · required

Minimum: 0. Maximum: 9.

unresolved[].reason not_found | private | unavailable | malformed_data | ambiguous · required
unresolved[].target string · required

Response · 202

Durable job; poll the returned owner-scoped URL.

created_at integer · required
error string | null · optional
expires_at integer · required
job_id string · required
operation string · required
poll_url string · required

Relative Hive URL. Poll with the same bearer; GET returns this job envelope (200), with the completed first page under result. Terminal failed/outcome_unknown jobs never relaunch on replay.

result object | null · optional
service string · required
status pending | running | completed | failed | outcome_unknown · required