---
title: "List signals"
method: GET
path: "/api/v1/signals"
tags: ["Account Management"]
---

# List signals

`GET /api/v1/signals`

## 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`
- Auth: HTTP bearer

View all your configured lead detection signals and their current status — see which ones are active, how many leads they detected today and in total, and review each signal's full configuration.

**Input:** API authentication (via API key); optional query filters: `status` (`active` or `paused`), `signalTypeId` (filter by signal type, e.g., `competitor_relationship_monitoring`, `job_changes`), and `createdByThisKey` (`true` returns only the signals created with the API key making the call, instead of every signal on the account — use it to stop a staging integration from seeing production signals; signals created in the dashboard belong to no key and are never returned when it is `true`).

**Output:** An array of signals, each with: id, name, status, signalTypeId, full config (the criteria you're monitoring: linkedinCompanyUrls, targetPersonas, locations, excludedTitles, etc.), webhookUrl, dailyLeadLimit, leadsToday, leadsTotal, duplicateHandling policy, and createdAt/updatedAt/lastLeadAt timestamps. Also returns a count of total signals.

**Signals waiting on you:** `actionRequired=true` returns only the active signals that produce nothing until you act — a New Decision Maker or Account watchlist whose company matching waits for your confirmation (`MATCHING_CONFIRMATION_REQUIRED`), a Company Followers signal whose follower extraction waits for a quote (`QUOTE_REQUIRED`), or one whose extraction stopped because a LinkedIn company page it names does not exist (`COMPANY_PAGE_UNAVAILABLE`) — each with its `warnings`, which give the quote and the call that unblocks it. Poll it from a dashboard, or let us tell you: when a signal starts waiting on you, the account owners get an email and the signal's `webhookUrl` receives a `signal.action_required` event (see the Webhooks section), followed by `signal.action_resolved` once it no longer waits.

## Query parameters

- `status` string, nullable: Filter by status: active, paused
- `signalTypeId` string, nullable: Filter by signal type
- `ids` string, nullable: Fetch only these signals — a comma-separated list of ids (e.g. ?ids=id1,id2,id3). Up to 100 ids per request; for more, make multiple calls or page the full list with limit/offset.
- `limit` integer, nullable: Max signals to return (pagination). Omit to return all.
- `offset` integer: Number of signals to skip (pagination).
- `actionRequired` boolean: `true` returns only the active signals that produce nothing until you act — a watchlist whose company matching waits for your confirmation, a Company Followers signal whose extraction waits for a quote — each with its `warnings`, which say what to do and which call does it. Default `false`.
- `createdByThisKey` boolean: Return only the signals created with the API key making this call, instead of every signal on the account. Use it to keep a staging integration from seeing production signals. Signals created in the dashboard belong to no key and are never returned when this is true.

## Response `200`

Successful Response

- object: list of signals for public API.
  - `signals` object[], required
    - `id` string, required
    - `name` string, required
    - `status` string, required
    - `signalTypeId` string, required
    - `webhookUrl` string, nullable
    - `config` object, nullable: Signal-specific configuration
    - `dailyLeadLimit` integer, required
    - `leadsToday` integer, required
    - `leadsTotal` integer, required
    - `duplicateHandling` string, required: Duplicate lead handling: 'refuse' (never accept), 'allow' (always accept), or 'Xd' (accept after X days)
    - `createdAt` string, required
    - `updatedAt` string, required
    - `lastLeadAt` string, nullable
    - `warnings` SignalConfigWarning[], nullable: Present only with `actionRequired=true`: every warning of the signal, as GET /api/v1/signals/{signal_id} returns them, including the one that says what you need to do (`MATCHING_CONFIRMATION_REQUIRED`, `QUOTE_REQUIRED` or `COMPANY_PAGE_UNAVAILABLE`).
      - `code` string, required: Stable identifier. `VALUE_BELOW_MINIMUM` (a value under the documented minimum is applied as the minimum), `VALUE_ADJUSTED` (a value the search cannot use as written is applied as the nearest one it can, e.g. a `publishedDate` of 14d searches 15 days), `FIELD_NOT_USED` (a stored field this signal ignores), `UNKNOWN_SIZE_NOT_ACCEPTED`, `CATEGORY_WITH_OWN_INDUSTRIES` (a category listed together with industries it already covers), `UNKNOWN_INDUSTRY` (a value matching no published industry), `UNKNOWN_FIELD` (a config key this signal does not have), `UNKNOWN_TOOL` / `UNKNOWN_CATEGORY` (a tracked tool or category name that is not in the catalog of GET /api/v1/signals/technographic-tools; on a GMB Discovery signal, a `category` that is not a Google Maps category, so the signal matches no business), `UNKNOWN_CITY` (GMB Discovery: cities in `cities` that are not in the signal's `country` — `values` lists them; when none is, the signal matches no business until `cities` or `country` is changed; never an error, nothing stored is changed), `NO_FOLLOWER_SOURCE` (a Company Followers signal with no follower extraction set up yet, so it produces nothing), `DAILY_LIMIT_PENDING` (a job signal's `dailyLeadLimit` changed less than a day after its search was last rebuilt: the search keeps its previous volume until the time in `values`, while the leads delivered per day already follow the new limit), `WATCHED_LIST_EMPTY` (a watchlist reading its list from your CRM holds no company or person — the CRM is not connected, the list could not be read, or it is empty — so it produces nothing until the list fills; cleared on its own once it does), `QUOTE_REQUIRED` (an `active` Company Followers signal in `icp` mode whose follower extraction has not been priced and accepted, so it produces nothing yet: `values[0]` says why — `not_requested`, `awaiting_acceptance` (then `values[1]` is the quoted price in credits), `expired`, `declined`, `failed`, or, after an automatic quote, `auto_quote_refused` / `auto_accept_refused` (then `values[1]` is the error code); the message names the call to make — see POST /api/v1/signals/{signal_id}/extraction/quote; cleared once a quote is accepted), `WATCHED_LIST_IMPORTING` (a company watchlist whose HubSpot list is still being read: companies are added as they arrive; `values[0]` is the number of members read so far, `values[1]` the list id; cleared once the whole list is read), `MATCHING_CONFIRMATION_REQUIRED` (a New Decision Maker or Account watchlist whose companies must be matched to their LinkedIn company page before they can be watched, at a cost above the amount we match without asking: nothing is matched or charged until you confirm with POST /api/v1/watchlists/{signalId}/companies/confirm-matching; `values[0]` is the maximum cost, `values[1]` the number of companies to match; cleared once confirmed), `DESTINATION_UNAVAILABLE` (the outreach campaign this signal sends leads to cannot receive them — not found, archived, ended or without any step — so leads are not reaching it: `values[0]` is `campaign_not_found`, `campaign_archived`, `campaign_ended` or `campaign_no_steps`; cleared once a lead reaches the campaign or the signal's destination is changed), `DESTINATION_NEEDS_CONTACT` (the signal delivers companies with no contact and a destination in `destinations` only accepts people, so none of its leads reach that destination), `DESTINATION_SKIPS_COMPANY_ONLY` (some leads are companies with no contact, e.g. no one matching your personas was found, and a destination only accepts people), `DESTINATION_NEEDS_EMAIL` (a destination only accepts leads with an email and `getEmails` is off) — for these three, `values[0]` is the destination key in `destinations`, the next values are the fixes: `add_persona` (turn on `enablePersonaTargeting` with `targetPersonas`), `require_contact` (turn on `requireContact`), `add_company_destination` (add a destination that accepts companies: `hubspot`, `pipedrive`, `googleSheets` or `customWebhook`), `enable_email_finding` (turn on `getEmails`); severity `warning` when those leads reach no destination at all, `info` when another destination still receives them; never blocks the save; `COMPANY_PAGE_UNAVAILABLE` (a Company Followers signal whose extraction stopped because a page in `linkedinCompanyUrls` does not exist on LinkedIn: nothing was extracted or charged; `values` lists the pages; replace them with PATCH /api/v1/signals/{signal_id}, then start the extraction again; cleared once the pages are replaced or a new extraction runs), `COMPANY_PAGE_UNVERIFIED` (create / PATCH responses only: a page in `linkedinCompanyUrls` could not be verified at that moment and was accepted; `values` lists them — if one does not exist, its extraction stops without using credits and the signal carries `COMPANY_PAGE_UNAVAILABLE`).
      - `severity` string, required: `info`: nothing to do. `warning`: probably not what you meant.
      - `field` string, required: The `config` key concerned, camelCase (or `dailyLeadLimit`).
      - `message` string, required
      - `values` string[]: The offending values, when there are some.
  - `total` integer, required

## Other responses

- `422`: Validation Error
- `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)
