---
title: "Read an article"
method: GET
path: "/articles/{id}"
tags: ["Articles"]
---

# Read an article

`GET /articles/{id}`

## Request

- Base URL: `https://api.screvi.com/api/v1`
- URL: `https://api.screvi.com/api/v1/articles/{id}`
- Auth: API key in header `X-API-Key`

One article with its body, tags and highlights. `format=text` returns the body as plain text with paragraph breaks (the right choice for feeding a model); `format=html` (default) returns the sanitised HTML. Long bodies can be paged with `offset` and `max_chars`; `content_truncated` says whether there is more. If the body has not been fetched yet, `content` is null and `parse_state` says why.

## Path parameters

- `id` string, uuid, required

## Query parameters

- `format` 'html' | 'text'
- `offset` integer
- `max_chars` integer

## Response `200`

The article

- object
  - `data` ArticleWithContent
    - `id` string, uuid
    - `title` string, nullable
    - `author` string, nullable
    - `url` string
    - `canonical_url` string, nullable
    - `excerpt` string, nullable
    - `status` 'unread' | 'reading' | 'read' | 'archived': Reading status
    - `home_status` 'inbox' | 'later' | 'archive': Where the article sits in the app
    - `favorite` boolean
    - `progress_percentage` integer
    - `reading_time_minutes` integer, nullable
    - `word_count` integer, nullable
    - `source_domain` string, nullable
    - `site_name` string, nullable
    - `language` string, nullable
    - `saved_at` string, date-time
    - `published_date` string, date-time, nullable
    - `updated_at` string, date-time
    - `parse_state` 'queued' | 'fetching' | 'parsed' | 'failed'
    - `note` string, nullable
    - `deleted` boolean
    - `image_url` string, nullable
    - `screvi_url` string: Link to the article in the Screvi app
    - `highlight_count` integer
    - `tags` Tag[]
      - `id` string, uuid
      - `name` string
      - `color` string, nullable
    - `content_format` 'html' | 'text'
    - `content` string, nullable: The body, or null when not fetched yet
    - `content_length` integer: Total body length in characters
    - `content_offset` integer
    - `content_truncated` boolean: True when offset + returned length < content_length
    - `parse_error` string, nullable
    - `parse_failure` object, nullable: Structured reason the body could not be extracted
    - `pdf_url` string, nullable
    - `epub_url` string, nullable
    - `last_fetched_at` string, date-time, nullable
    - `started_reading_at` string, date-time, nullable
    - `completed_reading_at` string, date-time, nullable
    - `summary` string, nullable: AI summary, when one has been generated
    - `transcript` object, nullable: Timed transcript for video and podcast articles
    - `highlights` Highlight[]
      - `id` string, uuid
      - `content` string: The highlight text
      - `note` string, nullable: User note attached to the highlight
      - `favorite` boolean
      - `url` string, nullable
      - `location` number, nullable: Position in the source (Kindle location, page, or offset)
      - `date` string, date-time, nullable
      - `created_at` string, date-time
      - `updated_at` string, date-time
      - `tags` Tag[]
        - `id` string, uuid
        - `name` string
        - `color` string, nullable
      - `source` HighlightSource
        - `id` string, uuid
        - `name` string
        - `type` 'book' | 'article' | 'tweet' | 'self' | 'podcast' | 'video' | 'custom' | 'youtube' | 'pdf'
        - `author` string, nullable
        - `image_url` string, nullable
        - `url` string, nullable
      - `metadata` object: Free-form JSON stored with the highlight. Only returned when `include_metadata=true`.

## Other responses

- `404`: Not found

---

[API](https://skmtc.dev/screvi/apis/screvi-public-api.md) · [All operations](https://skmtc.dev/screvi/apis/screvi-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/screvi/apis/screvi-public-api/revisions/b14be9630c5d?raw)
