---
title: "Search articles"
method: GET
path: "/api/search"
tags: ["Search"]
---

# Search articles

`GET /api/search`

## Request

- Base URL: `https://v3-api.newscatcherapi.com` (the document declares no server; this is the origin it was published from)
- URL: `https://v3-api.newscatcherapi.com/api/search`
- Auth: none declared. Required headers: `x-api-token`

Full-text search across the NewsCatcher News API index. Supports filtering by keyword, language, country, source, publication date, and dozens of other parameters; results can optionally be grouped into clusters of similar articles.

## Query parameters

- `q` string, required: Search query using Lucene-like syntax: supports boolean operators (AND, OR, NOT, and &&, ||, ! as aliases), exact phrase matching with double quotes, grouping with parentheses, and wildcards. Cannot be empty.
- `search_in` string: Which fields to search the query against. Up to 2 values from: title, content, title_content, summary (summary requires an NLP plan). NLP/translation plans additionally allow searching translated fields: title_translated, content_translated, summary_translated, title_content_translated.
- `predefined_sources` unknown
- `sources` unknown
- `source_groups` unknown
- `not_sources` unknown
- `lang` unknown
- `not_lang` unknown
- `countries` unknown
- `not_countries` unknown
- `not_author_name` unknown
- `from_` union: Start of the date range (inclusive). Accepts natural-language and common date formats (e.g. 'YYYY/mm/dd', 'YYYY/mm/dd HH:MM:SS', '1 day ago'). Defaults to 7 days ago at midnight UTC if omitted.
  - string
  - string, date-time
- `to_` union: End of the date range (inclusive). Accepts natural-language and common date formats (e.g. 'YYYY/mm/dd', 'YYYY/mm/dd HH:MM:SS', '1 day ago'). Defaults to now if omitted.
  - string
  - string, date-time
- `published_date_precision` string: Filter by how precisely the published date is known: 'full' (exact date and time), 'date' (day known, time unknown), or 'timezone unknown' (date and time known, but not the timezone).
- `by_parse_date` union: When true, the date range and sorting apply to the date NewsCatcher parsed/ingested the article instead of its published date.
  - string
  - boolean
- `sort_by` string: Sort order for results: 'relevancy' (default, best text match first), 'date' (newest first), '-date' (oldest first), or 'rank' (most authoritative source first).
- `ranked_only` union: When true, only returns articles from sources that have a known rank (excludes unranked sources).
  - string
  - boolean
- `from_rank` union: Minimum source rank (lower rank = more authoritative/popular source). Integer between 1 and 999999.
  - string
  - integer
- `to_rank` union: Maximum source rank (lower rank = more authoritative/popular source). Integer between 1 and 999999.
  - string
  - integer
- `is_headline` union: Filter by whether the article was featured as a headline on its source's homepage at the time of parsing.
  - string
  - boolean
- `is_opinion` union: Filter by whether the article is opinion/editorial content.
  - string
  - boolean
- `is_paid_content` union: Filter by whether the article is behind a paywall or marked as sponsored/paid content.
  - string
  - boolean
- `parent_url` unknown
- `all_links` unknown
- `all_domain_links` unknown
- `all_links_text` unknown
- `word_count_min` union: Minimum article word count. Must be non-negative, and less than word_count_max if both are set.
  - string
  - integer
- `word_count_max` union: Maximum article word count. Must be non-negative, and greater than word_count_min if both are set.
  - string
  - integer
- `page` union: Page number of results to return, starting at 1.
  - string
  - integer
- `page_size` union: Number of articles per page. Integer between 1 and 1000.
  - string
  - integer
- `clustering_variable` string: Which article field to base clustering similarity on: 'content', 'title', or 'summary'.
- `clustering_enabled` union: When true, groups similar articles into clusters in the response instead of returning a flat list. A single request's date range cannot span both before and after 2026-01-01, since clustering uses different embeddings on either side of that date.
  - string
  - boolean
- `clustering_threshold` union: Similarity threshold for clustering, greater than 0 and up to 1 inclusive. Higher values require greater similarity to group articles into the same cluster.
  - number
  - string
- `include_nlp_data` union: For NLP-enabled plans, controls whether the nlp object is included in the response for each article (excluded by default). Basic plan always includes nlp.theme regardless of this setting.
  - string
  - boolean
- `has_nlp` boolean: When true, only returns articles that have NLP enrichment data. Requires an NLP plan.
- `theme` string: Filter by article theme. One of: Business, Politics, Entertainment, Sports, Finance, Crime, Tech, General, Health, Economics, Science, Automotive, Weather, Travel, Lifestyle, Financial Crime. Comma-separated values are OR'd together; values joined with ' AND ' within one comma-separated group must all match the same article (e.g. 'Tech AND Finance,Sports' matches Tech-and-Finance articles, or Sports articles).
- `not_theme` string: Exclude articles with any of the given themes. Same allowed values as theme, but does not support ' AND ' grouping - always excludes on any match.
- `ORG_entity_name` string: Filter articles that mention the given organization name(s) in NLP-extracted named entities. Requires an NLP plan.
- `PER_entity_name` string: Filter articles that mention the given person name(s) in NLP-extracted named entities. Requires an NLP plan.
- `LOC_entity_name` string: Filter articles that mention the given location name(s) in NLP-extracted named entities. Requires an NLP plan.
- `MISC_entity_name` string: Filter articles that mention the given miscellaneous entity name(s) in NLP-extracted named entities. Requires an NLP plan.
- `title_sentiment_min` number: Minimum sentiment score for the article title, from -1 (most negative) to 1 (most positive), as determined by NLP analysis. Requires an NLP plan.
- `title_sentiment_max` number: Maximum sentiment score for the article title, from -1 (most negative) to 1 (most positive), as determined by NLP analysis. Requires an NLP plan.
- `content_sentiment_min` number: Minimum sentiment score for the article content, from -1 (most negative) to 1 (most positive), as determined by NLP analysis. Requires an NLP plan.
- `content_sentiment_max` number: Maximum sentiment score for the article content, from -1 (most negative) to 1 (most positive), as determined by NLP analysis. Requires an NLP plan.
- `iptc_tags` unknown
- `not_iptc_tags` unknown
- `source_name` unknown
- `iab_tags` unknown
- `not_iab_tags` unknown
- `exclude_duplicates` union: Excludes duplicate articles from results, keeping only the original publisher's version. Only available for English articles published on or after 2024-05-13, and non-English articles published on or after 2025-03-17.
  - string
  - boolean
- `additional_domain_info` union: Includes extra domain-level information (e.g. traffic/audience data) for each article's source, where available.
  - string
  - boolean
- `is_news_domain` union: Filter by whether the domain is classified as a genuine news domain, as opposed to e.g. a blog, forum, or non-news site.
  - string
  - boolean
- `news_domain_type` unknown
- `news_type` unknown
- `include_translation_fields` union: Includes machine-translated title/content fields (title_translated_en, content_translated_en) in the response for non-English articles. Automatically enabled if search_in includes a '_translated' field.
  - string
  - boolean
- `robots_compliant` union: Filter by whether the source's robots.txt permitted content extraction: true returns only compliant articles, false returns only non-compliant ones.
  - string
  - boolean

## Headers

- `x-api-token` string, required: Your NewsCatcher API key, used to authenticate this request.

## Response `200`

Successful Response

- union
  - SearchResponse: SearchResponse DTO class.
    - `status` string: Always 'ok' for a successful search.
    - `total_hits` integer, required: Total number of articles matching the query, across all pages.
    - `page` integer, required: Current page number returned.
    - `total_pages` integer, required: Total number of pages available for this query, given page_size.
    - `page_size` integer, required: Number of articles returned per page.
    - `articles` object[], required: Articles matching the query for this page.
    - `user_input` object, required: Echo of the request parameters that produced this response.
  - ClusteringSearchResponse: ClusteringSearchResponse DTO class.
    - `status` string: Always 'ok' for a successful search.
    - `total_hits` integer, required: Total number of articles matching the query, across all pages, before clustering.
    - `page` integer, required: Current page number returned.
    - `total_pages` integer, required: Total number of pages available for this query, given page_size.
    - `page_size` integer, required: Number of articles requested per page, before grouping into clusters.
    - `clusters_count` integer, required: Number of clusters returned.
    - `clusters` Cluster[], required: Articles for this page, grouped into clusters of similar content.
      - `cluster_id` string, required: Identifier for this cluster of similar articles.
      - `cluster_size` integer, required: Number of articles in this cluster.
      - `articles` object[], required: Articles grouped into this cluster.
    - `user_input` object, required: Echo of the request parameters that produced this response.

## Other responses

- `401`: Missing or invalid `x-api-token` header.
- `403`: A supplied parameter isn't included in your subscription plan, or the requested date range exceeds your plan's allowed history window. Also returned to free tier (trial) keys whose trial has ended or whose included calls are used up.
- `408`: Your query reached the search backend but did not finish within 30 seconds. Narrow the date range, lower page_size, or simplify the query. Note this covers only genuinely slow queries - if the backend could not be reached at all the response is 503, which is retryable as-is.
- `422`: Request validation failed, e.g. an invalid parameter value or a missing required field.
- `429`: Rate limit exceeded for your plan.
- `499`: The HTTP status line is 499, but the response body's own `status_code` field reads 422 - a known quirk of this API's validation-error handling for cases not covered by the standard 422 path, not a documentation error.
- `503`: The search backend could not be reached, so the query was never executed. Nothing about the request needs to change - retry it unchanged.

---

[API](https://skmtc.dev/newscatcherapi/apis/newscatcher-v3-production-api.md) - [All operations](https://skmtc.dev/newscatcherapi/apis/newscatcher-v3-production-api/llms.txt) - [OpenAPI document](https://skmtc.dev/newscatcherapi/apis/newscatcher-v3-production-api/revisions/a3950aefb3e5?raw)
