---
title: "List the companies a watchlist is watching"
method: GET
path: "/api/v1/watchlists/{signalId}/companies"
tags: ["Watchlists"]
---

# List the companies a watchlist is watching

`GET /api/v1/watchlists/{signalId}/companies`

## 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/watchlists/{signalId}/companies`
- Auth: HTTP bearer

See which companies a Job Offers Watchlist is watching, and — crucially — which of them we could not match to a real employer, since those are silently never checked for postings.

**Input:** `signalId` (path parameter).

**Output:** `total`, `matched` (entries matched to a real employer and being checked), `unmatched` (entries that are not), and `companies` — each with `id` (pass it to DELETE), `companyName`, `companyDomain`, `companyLinkedinUrl`, `matched`, `status` (`active` or `archived`), `lastCheckedAt`, and `lastJobSeenAt` (the most recent posting delivered for that company).

Check `unmatched` first when a watchlist delivers less than you expected: an unmatched company looks identical to a company that simply is not hiring. Fix one by re-adding it under a different spelling of its name, or by its domain.

## Path parameters

- `signalId` string, required: Id of the watchlist signal, as returned by the create endpoint.

## Response `200`

Successful Response

- object
  - `total` integer, required
  - `matched` integer, required: Entries matched to a real employer and being checked.
  - `unmatched` integer, required: Entries not currently being checked — the sum of `pending` and `notFound`. Reported so a half-working list is visible instead of looking like a list that simply is not hiring. Which of the two it is decides what to do about it, so read those two rather than this total.
  - `pending` integer, required: Entries not looked up yet. A large list is worked through over successive passes; these need no action and resolve on their own.
  - `notFound` integer, required: Entries looked up with no matching employer. These will not resolve on their own — re-add them under their public trading name or their domain.
  - `companies` object[], required
    - `id` string, required: Id of this entry — pass it to DELETE to stop watching.
    - `companyName` string, nullable
    - `companyDomain` string, nullable
    - `companyLinkedinUrl` string, nullable
    - `matched` boolean, required: Whether this company is matched to a real employer and being checked for postings. `false` covers two different situations — read `resolutionStatus` to tell them apart before acting on it.
    - `resolutionStatus` string, required: Why this company is, or is not, being checked: - `resolved` - matched to an employer and being checked for postings. - `pending` - not looked up yet. A large list is worked through over successive passes, so a newly added company waits its turn. Nothing to fix. - `not_found` - looked up, and no employer matched the name supplied. This one will not resolve on its own: re-add the company under the name it trades under publicly (without the legal form), or under its domain.
    - `status` string, required: `active` (being checked) or `archived`.
    - `lastCheckedAt` string, nullable
    - `lastJobSeenAt` string, nullable: Date of the most recent posting delivered for this company.

## Other responses

- `400`: The signal exists but watches the other kind of subject
- `404`: No watchlist signal with this id on your account
- `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)
