last_viewed_at, and users can explicitly mark articles complete or incomplete.
Only published articles are returned.
Actions
all / list
Returns a paginated list of published articles with the current user’s progress joined.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | number | No | Max results, default 100, max 500 |
offset | number | No | Pagination offset, default 0 |
filters.startHere | boolean | No | Only return “Start Here” articles |
filters.category | string | No | Filter by category slug |
filters.searchTerm | string | No | Case-insensitive title search |
startHere | boolean | No | Shorthand for filters.startHere |
get
Returns a single published article by slug (preferred) or id. Automatically records last_viewed_at for the current user as a side effect.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | Conditional | Article slug — preferred lookup key |
id | string | Conditional | Article UUID — used if slug is not provided |
slug or id is required.
Response
progress
Returns all progress records for the current user — one entry per article they have viewed or completed.
Parameters — none
Response
mark-complete
Marks an article as completed for the current user. Sets both completed_at and last_viewed_at to now.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Conditional | Article UUID (request ID) |
articleId | string | Conditional | Article UUID (data field) — used if id not provided |
mark-incomplete
Clears the completed_at timestamp for an article, marking it as not completed.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Conditional | Article UUID (request ID) |
articleId | string | Conditional | Article UUID (data field) |
Error codes
| Code | Meaning |
|---|---|
VALIDATION_ERROR | Missing article ID or slug |
NOT_FOUND | Article not found or not published |
INTERNAL_ERROR | Unexpected server error |

