---
title: "Search UFCalendar articles"
method: GET
path: "/v1/articles"
tags: ["Articles"]
---

# Search UFCalendar articles

`GET /v1/articles`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/articles`
- Auth: HTTP bearer

UFCalendar's own editorial archive — previews, recaps, investigations, fighter-pay and technique pieces — newest first. `q` (at least 2 characters) matches the title, summary or a tag, accent-insensitive (and the translated title and summary when `locale` is set); `tag` is an exact tag match; `locale` is one of the 13 site languages (`en` default, `es`, `pt`, `de`, `fr`, `tr`, `ru`, `ka`, `ja`, `ko`, `pl`, `sr`, `zh`) — a row serves its translation when one exists and English otherwise, and its `locale` names the language actually served. Each row: `slug`, `url` (the canonical page in the requested language), `title`, `description`, `author_name`, `tags`, `published_at`, `locale`. Pass the `slug` to `/v1/articles/{slug}` for the body. A `q` under 2 characters 400s `invalid_query`; an unknown `locale` 400s `invalid_locale`. Betting-advice editorial (picks, parlays) is not served. Link back when quoting.

## Query parameters

- `q` string
- `tag` string
- `locale` 'en' | 'es' | 'pt' | 'de' | 'fr' | 'tr' | 'ru' | 'ka' | 'ja' | 'ko' | 'pl' | 'sr' | 'zh'
- `cursor` string
- `limit` integer

## Response `200`

Articles, newest first

- ArticlesPageResponse: Newest first.
  - `data` ArticleListItem[], required
    - `slug` string, required
    - `url` string, required: The canonical page in the requested language.
    - `title` string, required
    - `description` string, required
    - `author_name` string, required
    - `tags` string[], required
    - `published_at` string, date-time, nullable, required
    - `locale` 'en' | 'es' | 'pt' | 'de' | 'fr' | 'tr' | 'ru' | 'ka' | 'ja' | 'ko' | 'pl' | 'sr' | 'zh', required: The 13 site languages.
  - `meta` object, required
    - `locale` 'en' | 'es' | 'pt' | 'de' | 'fr' | 'tr' | 'ru' | 'ka' | 'ja' | 'ko' | 'pl' | 'sr' | 'zh', required: The 13 site languages.
    - `note` string, required
    - `pagination` CursorPagination, required: Cursor pagination WITHOUT the applied `limit` (the newer list routes — changes, fight search, splits, venues, articles — do not echo it).
      - `next_cursor` string, nullable, required: Opaque; pass as `?cursor=`. Null on the last page.
      - `has_more` boolean, required
    - `ignored_params` string[]: Present only when the request carried query parameters this endpoint does not take — they were ignored. Same list as the `X-UFCalendar-Ignored-Params` header. Sorted, unique.

## Other responses

- `304`: Not Modified — `If-None-Match` matched the current weak `ETag`. Empty body.
- `400`: Invalid input (`invalid_query`, `invalid_locale`).
- `401`: Missing/invalid API key (`unauthorized`).
- `403`: No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api.
- `404`: Not found (`not_found`; staged-org data 404s until the org is promoted).
- `429`: Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`.
- `500`: Something broke on our side (`internal_error`). It has been logged under the `request_id`.

---

[API](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api.md) · [All operations](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/revisions/9623cc8fb70b?raw)
