# The article object

Every endpoint and the WebSocket stream return articles in the same shape.

article

```json
{
 "id": "art_9f2c1d7e4b8a6035",
 "title": "Apple unveils new on-device AI features, shares rise in premarket trading",
 "url": "https://www.example-publisher.com/markets/apple-ai-features",
 "source": {
 "name": "Example Publisher",
 "domain": "example-publisher.com"
 },
 "publisher": "Example Publisher",
 "published_at": "2026-10-06T12:31:04Z",
 "ingested_at": "2026-10-06T12:31:09Z",
 "category": "stocks",
 "type": "news",
 "tickers": [
 "AAPL"
 ],
 "listings": [
 {
 "symbol": "AAPL",
 "exchange": "NASDAQ"
 }
 ],
 "snippet": "Apple on Tuesday introduced a set of on-device AI features for iPhone and Mac, sending the stock higher before the open.",
 "summary": "Apple announced new on-device AI features for iPhone and Mac. Shares rose about 2% in premarket trading as analysts called the update a catalyst for the upgrade cycle.",
 "body": null,
 "entities": [
 {
 "type": "company",
 "name": "Apple Inc.",
 "symbol": "AAPL"
 },
 {
 "type": "product",
 "name": "iPhone"
 }
 ],
 "language": "en"
}
```

## Fields

- `id` (string) Stable article identifier (prefix `art_`). The same story syndicated under several tickers has one id.
- `title` (string) Headline as published.
- `url` (string) Canonical link to the original article.
- `source` (object) `name` and `domain` of the wire or site the article was read from.
- `publisher` (string | null) Who issued the article. On a wire release this is the company named on the release, or the wire itself when the page does not name one.
- `published_at` (string (ISO 8601, UTC)) When the publisher released the article.
- `ingested_at` (string (ISO 8601, UTC)) When MarketNewsAPI first saw it. The gap to `published_at` is our latency.
- `category` (string) `stocks`.
- `type` (string) One of `news`, `press_release` or `legal`. For stocks the three filters are `category=stocks&type=news`, `category=stocks&type=press_release` and `category=stocks&type=legal`. `type=press_release` implies `category=stocks`.
- `tickers` (string[]) Symbols the article names, without an exchange (uppercase, e.g. `AAPL`, `BRK.B`). The same symbol on two exchanges appears once here. Use `listings` to tell them apart.
- `listings` (object[]) Each listing named in the article: `symbol` and `exchange` (for example `TSXV` / `MRVL` and `OTCQB` / `MBCOF`). `TSXV:MRVL` is not the US stock `MRVL`.
- `snippet` (string | null) Publisher-provided excerpt or first paragraph.
- `summary` (string | null) AI-generated, neutral 1–3 sentence summary. `null` on the immediate WebSocket and for a few seconds on REST, until the summary is written. Some very old archive items are still empty. The summaries socket and `GET /news/{id}` return it once it exists.
- `body` (string | null) Full text of a press release, including short releases. Third-party news returns `null` (follow `url`).
- `entities` (object[]) Named entities: `type` (`company`, `country`, `person`, `product`, `organization`, and others), `name`, optional `symbol`.
- `language` (string) ISO 639-1 language code. Currently always `en`.

## One article, many symbols

A story about Apple and Microsoft is one article with `"tickers": ["AAPL", "MSFT"]`, not two copies. If the same press release is distributed through several wires, we keep the first copy and merge the symbols.

## Nullable fields

Fields marked `| null` can be missing for some articles. Arrays are always present (possibly empty). New optional fields may be added at any time, so make your parser ignore unknown fields.
