---
title: "Request a quote for a Company Followers extraction"
method: POST
path: "/api/v1/signals/{signal_id}/extraction/quote"
tags: ["Signals"]
---

# Request a quote for a Company Followers extraction

`POST /api/v1/signals/{signal_id}/extraction/quote`

## Request

- Base URL: `https://api.rodz.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.rodz.io/api/v1/signals/{signal_id}/extraction/quote`
- Auth: HTTP bearer

Get the price of extracting every follower of your Company Followers pages who matches the signal's ICP filters — the step that turns an `icp` signal from `active`-but-silent into one that delivers leads. **Quoting is free and holds no credits**; nothing is extracted until you accept.

**Input:** the signal ID in the path; no body. The quote is computed from the signal's stored config: `linkedinCompanyUrls` (required) and at least one ICP filter — `targetPersonas`, `customPersonaTitles`, `companySizeFilters`, `locations` or `targetCompanies`. To change what is quoted, `PATCH /api/v1/signals/{signal_id}` first, then quote again.

**Output:** `extraction` (same shape as `GET .../extraction`). Usually `status: quoted` straight away, with `estimatedFollowers` and `creditsQuoted`. It can also come back `awaiting_quote`: the quote is still being computed — read `GET .../extraction` again after a few minutes.

**Pricing:** 0.5 credit per matching follower, minimum 75 credits per extraction. A quote stays valid 30 days (`expiresAt`); unaccepted, it then turns `failed` with `error: expired` and you request a new one.

**One step instead of three:** create or update the signal with `config.autoQuote: true` and a `config.maxCredits` budget, and the quote is requested — and accepted when it is within budget — for you as soon as the signal is `active`.

**Errors:** `NO_COMPANIES` (400, no `linkedinCompanyUrls`), `NO_FILTER` (400, no ICP filter), `COMPANY_UNRESOLVED` (400, a `targetCompanies` URL could not be matched — the message lists them), `TOO_MANY_TITLES` / `FILTERS_TOO_LONG` (400, more targeting than one extraction can carry — the message says how much to remove), `WRONG_EXTRACTION_MODE` (400, the signal is in `count` mode — use `.../extraction/extract`), `UNSUPPORTED` (400, not a Company Followers signal), `INSUFFICIENT_CREDITS` (402, balance under the 75-credit minimum — top up first), `ALREADY_ACTIVE` (409, a quote or extraction is already open — accept or decline it first), `COMPANY_PAGE_UNAVAILABLE` (422, a `linkedinCompanyUrls` page does not exist on LinkedIn — `error.companyUrls` lists it; nothing is held or charged; replace it with PATCH /api/v1/signals/{signal_id}), `NOT_FOUND` (404).

## Path parameters

- `signal_id` string, required

## Response `200`

Successful Response

- object: The extraction of a Company Followers signal, or `null` when it has none.
  - `extraction` object, nullable: One follower extraction of a Company Followers signal: its quote, its credits, its delivery.
    - `id` string, required: Extraction id.
    - `mode` 'icp' | 'count', required: `icp`: every follower matching the signal's filters, priced by a quote you accept. `count`: a fixed number of followers, unfiltered, started at once.
    - `status` string, required: `awaiting_quote` (the quote is being computed — read this endpoint again in a minute), `quoted` (priced, waiting for your accept or decline), `accepted` (credits held, extraction starting), `processing` (extraction running), `results_ready` / `imported` (leads being delivered), `settled` (done: delivered leads charged, the rest of the hold returned), `declined` (you declined the quote), `failed` (see `error`).
    - `requestedCount` integer, nullable: `count` mode: the number of followers ordered. `null` in `icp` mode.
    - `estimatedFollowers` integer, nullable: `icp` mode: followers of these pages matching your filters, as counted for the quote. `null` until the quote is ready.
    - `creditsQuoted` number, nullable: The price of the extraction: in `icp` mode 0.5 credit per matching follower, with a minimum of 75 credits; in `count` mode 1 credit per follower requested. `null` until the quote is ready.
    - `creditsHeld` number: Credits reserved on your balance for this extraction (from accept until it settles). Quoting holds nothing.
    - `creditsCharged` number: Credits actually charged — for the leads delivered, never above the hold.
    - `creditsReleased` number: Credits of the hold returned to your balance (undelivered, declined, expired).
    - `deliveredCount` integer, nullable: Leads delivered so far by this extraction.
    - `error` string, nullable: Why a `failed` extraction stopped: `expired` (the quote was not accepted within 30 days — request a new one), `insufficient_credits`, `cancelled` (the signal was paused before the extraction started), `companies_unavailable` (the company pages could not be read — try again later), `company_page_unavailable` (a page in `linkedinCompanyUrls` does not exist on LinkedIn — nothing was charged; replace it, then start a new extraction), `extraction_failed`. `null` otherwise.
    - `createdAt` string, nullable: ISO-8601, UTC.
    - `updatedAt` string, nullable: ISO-8601, UTC.
    - `expiresAt` string, nullable: `quoted` only: when the quote lapses if neither accepted nor declined (30 days after it was issued). It then turns `failed` with `error: expired` and nothing is charged.

## Other responses

- `400`: The signal cannot be quoted as configured
- `402`: Balance below the minimum price of an extraction
- `404`: No signal with this id on your account
- `409`: An extraction is already open on this signal
- `422`: A company page of the signal does not exist on LinkedIn — nothing is held or charged
- `429`: Rate limit exceeded. Retry after the number of seconds in the `Retry-After` response header.

---

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