# The article object

| Field | Type | |
|---|---|---|
| `id` | `string` | UUID. Stable for the article's life, rewrites included. |
| `projectId` | `string` | The project it belongs to. |
| `title` | `string` | The headline. Render it as the page's `h1`; it's not a block. |
| `slug` | `string` | URL segment, stable across rewrites. |
| `status` | `"ready"` | Always `"ready"`, which means published. A content key sees published articles only. |
| `topic` | `string` | The search query the article targets. |
| `cluster` | `string \| null` | The topic cluster, for grouping and navigation. |
| `blocks` | `Block[]` | The body as [typed blocks](/docs/api/blocks). Never HTML. |
| `seo` | `SeoMetadata` | [Head tags and JSON-LD](/docs/api/seo). |
| `thumbnailUrl` | `string \| null` | The cover image on the SEO for SaaS CDN, generated at 1536×1024. |
| `createdAt` | `string` | ISO 8601, when the article was written. If you review articles before publishing, it can be earlier than the publish date. The guides use it as the published date. |
| `updatedAt` | `string` | ISO 8601. The last change a reader can see: publishing, a rewrite, an edit, a link we added. Internal changes that readers can't see never move it, so it's safe for a sitemap `lastmod` ([Sitemap](/docs/api/sitemap)) and an "Updated" byline. |
| `related` | `{ title, href }[]` | [Single reads](/docs/api/get) only. |

All of it as TypeScript types: [`types.ts`](https://seoforsaas.dev/r/files/lib/seoforsaas/types.ts) (`Article`, `ArticleDetail`, `ContentBlock`, `SeoMetadata`, `WebhookEvent`). A real one: the [example article](/docs/api/example).
