---
title: "Call the startScrape MCP tool"
method: POST
path: "/api/v1/actions/startScrape"
tags: ["Actions"]
---

# Call the startScrape MCP tool

`POST /api/v1/actions/startScrape`

## Request

- Base URL: `https://app.reachium.io`
- URL: `https://app.reachium.io/api/v1/actions/startScrape`
- Auth: HTTP bearer

Start a LinkedIn scrape into a lead list. LAUNCH action on the user's real LinkedIn account. Six job types, chosen via "type" plus that type's own required field: omit "type" (or pass "sales_navigator"/"linkedin_search") with "url" set to a pasted search URL, same as before, letting the URL shape pick Sales Navigator vs standard search; or pass "type":"post_commenters" or "post_reactors" with "post_url" set to a post URL (the two cannot be told apart from the URL alone, so "type" is required for these); or "type":"company_engagement" with "entity_url" set to a company or profile URL, whose recent posts' reactors and commenters become leads (post_count, default 5, caps how many recent posts it walks); or "type":"content_search" with "search_url" set to a LinkedIn content-search URL (linkedin.com/search/results/content/...), whose matching posts' authors become leads. post_commenters/post_reactors/company_engagement/content_search need an existing lead_list_id (getLeadLists); they do not support new_list_name over MCP, call createLeadList first if a fresh list is wanted. sales_navigator/linkedin_search still take lead_list_id OR new_list_name. Two-step: the FIRST call returns a preview (account, what will be scraped, result cap, today's quota) plus a confirm_token and starts nothing; call again with confirm_token to run it. Sales Navigator searches need a Sales Navigator or Recruiter seat (check getLinkedInAccounts or getPlaybook("lead_gen") first); the other five types run on any connected seat. open_profile_mode filters on open-profile status (sales_navigator/linkedin_search only), but that status is only known once a lead has been visited or enriched (a campaign visit_profile step, or the InMail-activation list_enrichment job), it is NOT learned at scrape/search time, so open_only will typically keep few or none of the leads found by this scrape until they are later visited or enriched. There is no cancel once a scrape starts: it runs to completion and hourly/daily caps bound how much it can spend, so if a result turns out unwanted, delete the target list with deleteLeadList instead of trying to stop the run. sales_navigator/linkedin_search/company_engagement/content_search run in the background: poll getScrapeJob. post_commenters/post_reactors complete synchronously within this call and return their counts directly.

Called through the Actions bridge: the response is that tool's own result, wrapped as `{ data: <tool result> }` under HTTP 200. Billing, daily-cap, and confirm-step outcomes are embedded INSIDE `data`, never remapped to an HTTP status (see the templated `/api/v1/actions/{toolName}` operation above for the full protocol, and `x-mcp-actions` for this tool's machine-readable scope/cap/confirm_behavior fields). Authentication, request-shape, and optional idempotency-protocol failures still use their documented non-200 statuses.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `type` 'sales_navigator' | 'linkedin_search' | 'post_commenters' | 'post_reactors' | 'company_engagement' | 'content_search': Which scrape to run. Omit (or "sales_navigator"/"linkedin_search") for the original URL-shape-derived behavior with "url". REQUIRED to be exactly "post_commenters", "post_reactors", "company_engagement", or "content_search" to reach those four newer types.
  - `url` string, uri: sales_navigator/linkedin_search only: the LinkedIn search URL copied from the browser after applying filters.
  - `post_url` string, uri: post_commenters/post_reactors only: the LinkedIn post URL whose commenters or reactors become leads.
  - `entity_url` string, uri: company_engagement only: a LinkedIn company (/company/...) or profile (/in/...) URL. Its recent posts' reactors and commenters become leads.
  - `post_count` integer: company_engagement only: how many of the entity's most recent posts to walk (default 5, max 10). Posts with zero reactions and comments are skipped before counting toward this.
  - `search_url` string, uri: content_search only: a LinkedIn content-search URL (linkedin.com/search/results/content/...). Authors of matching posts become leads.
  - `account_id` string, uuid, required: LinkedIn account UUID from getLinkedInAccounts.
  - `lead_list_id` string, uuid: Existing lead list to scrape into (getLeadLists). For sales_navigator/linkedin_search, pass this OR new_list_name. For the other four types this is REQUIRED (no new-list creation over MCP for them).
  - `new_list_name` string: sales_navigator/linkedin_search only: name for a new lead list, created when the scrape is confirmed. Not supported for post_commenters/post_reactors/company_engagement/content_search.
  - `max_results` integer: Results to collect (default 100; capped at the account's daily scrape cap). A value below 1 is raised to 1, never refused.
  - `open_profile_mode` 'all' | 'open_only': sales_navigator/linkedin_search only: "all" (default) saves everyone found; "open_only" saves only leads already known to be open-profile from an earlier visit or enrichment. That status is never learned at scrape/search time, so open_only typically keeps few or none of this scrape's results: to build an open-profile list, use manageLeadList (split_by_open_profile) on a list whose leads have been visited or enriched. Splitting into two lists is a scraper-page-only feature, not available here.
  - `confirm_token` string: From the preview response; resend with the same arguments to execute.

## Response `200`

The result of calling this tool.

- object
  - `data` unknown, required
  - `error` unknown, required

## Other responses

- `400`: The request body was not a JSON object (code invalid_request), or Idempotency-Key is malformed (code invalid_idempotency_key).
- `401`: Missing or invalid API key. Send `Authorization: Bearer rmcp_...` (code unauthorized).
- `403`: This tool is out of the key’s granted scope (code insufficient_scope).
- `409`: This Idempotency-Key has an unresolved in-flight or ambiguous result (code request_in_flight). Reconcile before using a new key.
- `422`: This Idempotency-Key was already used with a different request body (code idempotency_key_reuse).
- `429`: Rate limited: shared `mcp:ip:{ip}` (600/60s) or `mcp:key:{keyId}` (120/60s) bucket, the SAME buckets the MCP endpoint uses (code rate_limited).
- `500`: Unhandled server error (code internal_error).

---

[API](https://skmtc.dev/reachium/apis/reachium-api.md) · [All operations](https://skmtc.dev/reachium/apis/reachium-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reachium/apis/reachium-api/revisions/30c16b30b499?raw)
