Skip to content
unzoi docs

Filters and signals

Filters narrow a query without making ranking fuzzier. Adding words to q costs relevance; adding a filter costs nothing.

Every filter

All of these work on /search, /stories and /top-headlines, and as arguments to the equivalent MCP tools.

Name Type Description
source string Source domain, e.g. bbc.co.uk.
source_type string web | citation | academic_archive | defense_archive | journal_archive | non_textual | other.
publisher_country string The publisher's canonical two-character country identifier.
language string Source language, ISO-639-3, e.g. eng, fra, ara, zho.
story_id string A cluster id from /stories, to expand one story into its articles.
topic string An exact canonical topic identifier returned by the API.
organization string An exact organization entity.
person string An exact person entity.
country string A mentioned country's canonical two-character identifier.
author string An exact article author.
location string An exact mentioned location.
location_id string An exact canonical location identifier.
city string An exact mentioned city.
region string An exact mentioned region.
name string An exact proper name.
mentioned_date string An exact date mentioned in the article text.
quote_verb string An exact verb introducing a quotation.
amount_object string An exact object described by a numeric amount.

Where the values come from

FilterVocabulary
languageISO 639-3, three letters: eng, fra, ara, zho. Not en.
country, publisher_countryTwo-character country identifiers. country is a country mentioned in the article; publisher_country is where the outlet is.
topicCanonical topic identifiers, returned in every article's topics. Coarse and machine-generated — treat them as a filter, not as a taxonomy to show a user.
organization, person, nameExtracted entities, lower-cased and canonicalised. Read them off a result.
location, city, regionFull location strings as extracted ("Austin, Texas, United States"). For stable matching prefer location_id.
location_idA numeric canonical identifier, from an article's location_details via /doc/{id}.
sourceThe publisher's domain, e.g. bbc.co.uk. No scheme, no www..
story_idA cluster id from /stories or from any article's story_id.
mentioned_dateA date mentioned in the text, YYYY-MM-DD — not the publication date.
quote_verb, amount_objectFrom an article's quotes and amounts; see /doc/{id}.

Signals

Every article carries derived intensities across three families. They are not sentiment and not a classification — they measure how strongly an article's language sits in a given register, so range-filtering on them finds coverage with a particular character rather than a particular word.

Each article reports the version that produced them (signals.version), so a change to the model is visible in the data rather than silently shifting your thresholds.

Industry

What sector the coverage is about.

economy · healthcare · agriculture · labor · environment · energy · transportation · real_estate · finance · defense · science_technology · trade · public_sector

Business context

The financial register the article is written in.

financial_uncertainty · financial_negative · financial_positive · legal_litigation · financial_stability_stress

Risk context

Disruption, threat and instability language.

anxiety · conflict · supply_disruption · cyber_incident · climate · health_security · governance_risk

Filtering on them

One constraint:

curl -s -G "https://api.unzoi.com/search" -H "x-api-key: $UNZOI_KEY" \
  --data-urlencode "q=quarterly results" \
  --data-urlencode "signal=financial_uncertainty" \
  --data-urlencode "signal_min=2.0"

Several at once, ANDed, as name[:min[:max]] separated by commas — an empty bound means unbounded:

curl -s -G "https://api.unzoi.com/search" -H "x-api-key: $UNZOI_KEY" \
  --data-urlencode "q=shipping" \
  --data-urlencode "signals=supply_disruption:1.5:,transportation:0.5:3"

Over MCP the same thing is an array of objects, which is easier for a model to emit correctly:

{
  "name": "search_news",
  "arguments": {
    "q": "shipping",
    "signals": [
      { "name": "supply_disruption", "min": 1.5 },
      { "name": "transportation", "min": 0.5, "max": 3 }
    ]
  }
}

There is no absolute scale to memorise — intensities are relative, and the useful thresholds depend on the corpus slice you are looking at. Entity and signal filtering shows how to find a threshold empirically instead of guessing one.