# /techcrunch/articles/search

`POST /api/techcrunch/articles/search`

Price: 10 credits

Search and browse the full TechCrunch archive back to 2005. Combine a full-text query with section, topic-tag, region, storyline and author filters, publish and update date ranges, an 'In Brief' short-news switch and the sort order. Each result carries headline, excerpt, publish and update timestamps, credited authors and the resolved taxonomy terms.

## How to use it

List TechCrunch articles. Set count for how many to return. Filter with keyword (full text), categories/tags/regions/storylines and their _exclude twins (slugs from techcrunch/categories/search and techcrunch/tags/search), authors (slugs like 'sarah-perez'), wp_author_ids, and the published_after/published_before/updated_after/updated_before ISO 8601 UTC ranges, which line up with the published_at and updated_at values in the result. only_brief=true keeps just the short 'In Brief' items. taxonomy_relation switches the taxonomy filters between AND and OR. sort accepts date, modified, relevance (only meaningful together with keyword), title, slug, id or author; order is asc or desc. Each item has id, article_title, alias, web_url, excerpt, published_at, updated_at, reading_time_minutes, image, image_id, authors[] and taxonomy terms — pass id or web_url to techcrunch/articles for the full body.

## Parameters

- `access-token` (string, required)

## Request body

- `timeout` (integer) — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)
- `keyword` (string, nullable) — Full-text query matched against article title and body (examples: "openai")
- `categories` (array, nullable) — Only articles filed under these section slugs (examples: ["artificial-intelligence"])
- `categories_exclude` (array, nullable) — Drop articles filed under these section slugs
- `tags` (array, nullable) — Only articles carrying these topic tag slugs (examples: ["openai"])
- `tags_exclude` (array, nullable) — Drop articles carrying these topic tag slugs
- `regions` (array, nullable) — Only articles tagged with these region slugs (examples: ["india"])
- `regions_exclude` (array, nullable) — Drop articles tagged with these region slugs
- `storylines` (array, nullable) — Only articles belonging to these storyline collection slugs
- `storylines_exclude` (array, nullable) — Drop articles belonging to these storyline collection slugs
- `authors` (array, nullable) — Only articles credited to these author slugs (examples: ["sarah-perez"])
- `authors_exclude` (array, nullable) — Drop articles credited to these author slugs
- `wp_author_ids` (array, nullable) — Only articles owned by these publishing account ids, as returned in wp_author_id
- `wp_author_ids_exclude` (array, nullable) — Drop articles owned by these publishing account ids
- `published_after` (string, nullable) — Only articles whose published_at is at or after this ISO 8601 UTC moment (examples: "2020-01-01T00:00:00")
- `published_before` (string, nullable) — Only articles whose published_at is before this ISO 8601 UTC moment (examples: "2021-01-01T00:00:00")
- `updated_after` (string, nullable) — Only articles whose updated_at is at or after this ISO 8601 UTC moment
- `updated_before` (string, nullable) — Only articles whose updated_at is before this ISO 8601 UTC moment
- `only_brief` (boolean, nullable) — Restrict to short 'In Brief' news items; false is the same as leaving it unset
- `taxonomy_relation` (string, nullable) — Combine the section, tag, region and storyline filters with AND or OR (one of: "AND", "OR")
- `sort` (string, nullable) — Field the results are ordered by (one of: "date", "modified", "relevance", "title", "slug", "id", "author")
- `order` (string, nullable) — Sort direction (one of: "asc", "desc")
- `offset` (integer) — Skip this many matching articles before collecting (default: 0; min: 0)
- `count` (integer, required) — Max number of articles to return (min: 1)

## Response

### 200 — Successful Response

- `@type` (string) (default: "TechcrunchArticleCard")
- `id` (integer, required)
- `article_title` (string, required)
- `alias` (string, required)
- `web_url` (string, required)
- `published_at` (integer, nullable)
- `updated_at` (integer, nullable)
- `excerpt` (string, nullable)
- `subtitle` (string, nullable)
- `social_title` (string, nullable)
- `seo_description` (string, nullable)
- `reading_time_minutes` (integer, nullable)
- `is_brief` (boolean) (default: false)
- `is_breaking` (boolean) (default: false)
- `is_featured` (boolean) (default: false)
- `post_format` (string, nullable)
- `image` (string, nullable)
- `image_id` (integer, nullable)
- `apple_news_url` (string, nullable)
- `wp_author_id` (integer, nullable)
- `authors` (array) (default: [])
  - `@type` (string) (default: "TechcrunchArticleAuthor")
  - `id` (integer, required)
  - `name` (string, required)
  - `alias` (string, required)
  - `login` (string, nullable)
  - `job_title` (string, nullable)
  - `organization` (string, nullable)
  - `description` (string, nullable)
  - `profile_url` (string, nullable)
  - `image` (string, nullable)
  - `article_count` (integer, nullable)
  - `guest_author_id` (integer, nullable)
  - `twitter_url` (string, nullable)
  - `linkedin_url` (string, nullable)
  - `facebook_url` (string, nullable)
  - `homepage_url` (string, nullable)
- `categories` (array) (default: [])
  - `@type` (string) (default: "TechcrunchTerm")
  - `id` (integer, required)
  - `name` (string, required)
  - `alias` (string, nullable)
  - `taxonomy` (string, nullable)
  - `web_url` (string, nullable)
  - `description` (string, nullable)
  - `content_count` (integer, nullable)
  - `parent_id` (integer, nullable)
- `tags` (array) (default: [])
  - `@type` (string) (default: "TechcrunchTerm")
  - `id` (integer, required)
  - `name` (string, required)
  - `alias` (string, nullable)
  - `taxonomy` (string, nullable)
  - `web_url` (string, nullable)
  - `description` (string, nullable)
  - `content_count` (integer, nullable)
  - `parent_id` (integer, nullable)
- `regions` (array) (default: [])
  - `@type` (string) (default: "TechcrunchTerm")
  - `id` (integer, required)
  - `name` (string, required)
  - `alias` (string, nullable)
  - `taxonomy` (string, nullable)
  - `web_url` (string, nullable)
  - `description` (string, nullable)
  - `content_count` (integer, nullable)
  - `parent_id` (integer, nullable)
- `storylines` (array) (default: [])
  - `@type` (string) (default: "TechcrunchTerm")
  - `id` (integer, required)
  - `name` (string, required)
  - `alias` (string, nullable)
  - `taxonomy` (string, nullable)
  - `web_url` (string, nullable)
  - `description` (string, nullable)
  - `content_count` (integer, nullable)
  - `parent_id` (integer, nullable)

## Errors

### 422 — Validation Error

The request body did not validate

What to do: Check the fields against this schema. A URN with the wrong prefix is the most common cause.

- `detail` (array)
  - `loc` (array, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any)
  - `ctx` (object)

### 408

The request ran past its time limit

What to do: Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.

### 412

The entity was not found, or a precondition failed

What to do: Retrying will not help: either the entity does not exist, or the input points at a different one.

### 429

Too many requests: a rate limit or a usage window is exhausted

What to do: When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.

### 500

Something broke on our side

What to do: Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.

### 529

Rate limit reached, or the endpoint is overloaded

What to do: Wait at least 30 seconds, then retry.

## Response envelope

Success: Array of objects (may be empty if no results)

Error: Error may coexist with partial results if it occurs mid-execution. Check X-Error header and status code.

Every response carries these headers:

- `X-Error` — Error message text (present only on error)
- `X-Request-ID` — Unique request identifier
- `X-Execution-Time` — Execution time in seconds
- `X-Result-Count` — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.
- `X-Total-Available-Results` — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.
- `X-Warning` — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.
- `X-Retry-After` — Seconds to wait before retrying. Present only on 429.

