Skip to main content
Company Watchlist filters CatchAll job results to a predefined list of companies and scores each matching record per company. Use it to track specific companies — a portfolio, a competitor set, or any curated list — instead of running broad queries.

How it works

Company Watchlist uses three connected concepts: Entities are individual company definitions. Each entity stores identifying information — name, domain, description, alternative names, key persons — that the system uses to recognize the company in web content. Datasets are named collections of entities. A dataset acts as a watchlist or portfolio. You create it once and can reuse it across multiple jobs and monitors. Connected jobs are standard CatchAll jobs submitted with a connected_dataset_ids parameter. Adding this parameter activates company search mode; everything else about the job — query, validators, enrichments, date ranges — works identically to a normal job.

Create entities

The name field is required. You must also provide at least one of description or domain (inside additional_attributes.company_attributes). Matching quality depends on what you provide. domain and description are the most reliable signals:
  • Two companies can share a name, but not a domain.
  • Companies might have the same name, but they usually operate in different sectors. That’s why description is the key to a proper disambiguation

Single entity

Writing effective descriptions

The description field is the primary signal used to tell two companies with the same name apart. A specific, factual description gives the matching model distinctive features to anchor on — vague, marketing-style text produces false positives or missed coverage. The goal is to fingerprint the company, not to sell it. Aim for two to four sentences covering what the company is and what it offers. Good description:
Apollo Global Management is a US-based alternative asset management firm headquartered in New York City, founded in 1990 by Leon Black, Marc Rowan, and Josh Harris. It manages private equity, credit, and real assets funds with over $650 billion in assets under management and is publicly traded on the NYSE under the ticker APO.
Bad description:
Apollo is a global leader providing innovative solutions to clients across multiple industries worldwide.
The bad example fits dozens of companies named Apollo equally well. Consider two real ones: Apollo Global Management (New York City; alternative asset management; founded 1990; NYSE: APO) and Apollo Hospitals (Chennai, India; private hospital chain; founded 1983 by Dr. Prathap C. Reddy; largest private hospital network in Asia). The name alone tells you nothing — what separates them is geography, industry, founders, and products. The same pattern applies to “Delta” (airline vs. faucets vs. dental insurance) and “Dove” (Unilever personal care vs. Mars chocolate). The details that do the disambiguation work are: aliases, specific industry, headquarters location, founding year and founders, and concrete products or services. Generic adjectives (“leading,” “innovative,” “world-class”) carry no disambiguating signal — drop them.
Before saving: Could this description be true of a different company with the same name? If yes, add the attribute that breaks the tie — usually industry, geography, or flagship products.
A complete description includes:
  • Full legal name
  • Specific industry or sector — not “technology” but “freight forwarding and customs brokerage”
  • Headquarters city and country, plus main regions of operation
  • Concrete products, services, and brand names
  • Parent company, subsidiaries, ticker, or public/private status when relevant

Attach an external entity ID

Use the optional external_entity_id field to store your own identifier for an entity — a CRM, data warehouse, or internal database ID. CatchAll stores it as provided and returns it on entity responses, dataset entity summaries, and connected entities in job results, so you can join CatchAll output back to your systems without maintaining a separate mapping.
The value is a free-form string of up to 255 characters and is not enforced as unique — CatchAll does not deduplicate entities by it. You can set it when creating an entity (single or batch) and change it later with PATCH /catchAll/entities/{entity_id}. When no value is set, the field is returned as null.

Batch

Use batch creation when adding multiple entities at once. Each entity is processed independently — one failure does not affect the others.

Create a dataset

From entity IDs

Create a dataset from existing entity IDs. All IDs must belong to your organization — any invalid ID returns 400.

From CSV

Upload a CSV to create both entities and the dataset in a single request — the fastest path for most use cases. The name and domain columns are required; all other columns are optional. Use semicolons to separate multiple values in alternative_names and key_persons. Rows with an empty name are skipped and reported in validation_report.

Wait for the dataset to be ready

Poll GET /catchAll/datasets/{dataset_id} until latest_status reaches ready. Do not submit a job before this step completes.

Submit a connected job

Add connected_dataset_ids to a standard job submission to activate company search mode:
Only one dataset per job is supported at this time, even though connected_dataset_ids accepts an array.
Poll GET /catchAll/status/{job_id} until status is completed, then retrieve results. See Jobs for the polling pattern.

Filter by association type

When a job is connected to a dataset, you can control how strictly entities must relate to each result by setting ed_association_type. When omitted, no association-type filter is applied and all matching records are returned regardless of how the entity relates to the event.
Each matched entity in the results includes an association_type field (event_associated or mention) indicating how it relates to that specific record.

Get all news for a watchlist

To retrieve all news about your tracked companies without filtering by a specific topic, set fetch_all_watchlist_news: true. Use this when you want a broad news feed for a portfolio or competitor set rather than a targeted event search. Wildcard queries (*) and generic phrases like “all news” also trigger this behavior automatically.
fetch_all_watchlist_news requires connected_dataset_ids to be set. Sending it without a connected watchlist returns a validation error.
Monitors created from an all-news job preserve this behavior — each recurring run collects all news for the connected watchlist, not topic-restricted results.

Get results

Retrieve results the same way as a normal job. Each record includes a connected_entities array with one entry per matched company. Entities with ed_score of 0 are filtered out automatically and never appear.

See also