Endpoints: sites and columns
On this page
GET/api/v1/sites
- Scoperead
- Credits free
Response
200freeColumnAvailable is never present for a key or an agent.
[
{
"id": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0",
"domain": "kolibri.example",
"siteName": "Kolibri Courier",
"status": "ready",
"analysedAt": "2026-09-28",
"offeredTopics": 7,
"cadence": "Tuesday and Friday",
"articleCount": 23,
"needsReviewCount": 2,
"thumbnailUrl": "/api/v1/sites/3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0/thumbnail?v=1790000000"
}
]thumbnailUrlpoints at a route a key cannot call.
curl "$BRENZURI_URL/api/v1/sites" \
-H "Authorization: Bearer $BRENZURI_KEY"GET/api/v1/sites/{siteID}
- Scoperead
- Credits free
delivery and freeColumnAvailable are never present for a key or an agent.
Path
| Name | Type | Description |
|---|---|---|
siteID | string |
Response
200
{
"id": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0",
"domain": "kolibri.example",
"siteName": "Kolibri Courier",
"status": "ready",
"analysedAt": "2026-09-28",
"voice": {
"id": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0-voice",
"name": "Kolibri Courier",
"tone": "Plain, local, specific",
"spelling": "british",
"avoid": [
"game-changing"
],
"prefer": [
"name the road or the pier"
],
"styleGuide": "Short paragraphs. Numbers before adjectives.",
"attribution": "light"
},
"samples": [],
"plan": {
"summary": "A local paper for the northern coast.",
"audience": "Residents and commuters",
"language": "en",
"inventory": {
"pagesRead": 12,
"pagesListed": 140,
"hasBlog": true,
"postsLast90Days": 31,
"postsLast30Days": 11,
"titleOnly": false
},
"topics": [
{
"id": "ferry-timetables",
"title": "Ferry timetables on the northern coast",
"short": "Ferry timetables",
"keywords": [
"ferry",
"timetable",
"northern route"
],
"coverage": "absent",
"coveredBy": [],
"independentOrigins": 4,
"state": "ready",
"offered": true,
"origins": [
{
"outlet": "harbour-authority.example",
"title": "Northern route: one timetable from 3 November",
"url": "https://harbour-authority.example/news/northern-route-timetable",
"publishedAt": "2026-10-02",
"reprints": 0
}
],
"yourSources": 0
}
],
"cadence": {
"schedule": "Tuesday and Friday",
"weeklyBudget": 2,
"reason": "The site publishes about 11 posts a month."
},
"analysedAt": "2026-09-28"
},
"unmatchedSources": 0,
"voiceDraftedFrom": {
"count": 0,
"samples": []
},
"writing": [],
"written": [],
"houseStyle": {
"status": "confirmed",
"proposal": false,
"descriptor": "Flat gouache shapes in muted harbour colours, generous empty sky.",
"palette": [
"#1F3A5F",
"#C9B28F",
"#6E8B74"
]
}
}Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found |
The example is abridged: samples,setupand the nested objects are shortened. The fields are in Objects.
curl "$BRENZURI_URL/api/v1/sites/$SITE_ID" \
-H "Authorization: Bearer $BRENZURI_KEY"POST/api/v1/sites/{siteID}/analyze
- Scopeedit
- Credits free
- Role edit
jobId on the event stream, or wait for the site.read webhook. A re-read proposes a new house style beside the confirmed one and never overwrites it.
Path
| Name | Type | Description |
|---|---|---|
siteID | string |
Response
200{ siteId, jobId, steps }, where steps is the list of steps the read will run.
{
"siteId": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0",
"jobId": "C8A41E07-52B9-4D36-8F1A-0B7E9D3C6A25",
"steps": [
{
"id": "read",
"name": "Read your site",
"estMs": 2000
},
{
"id": "describe",
"name": "Described the site",
"estMs": 6000
},
{
"id": "style",
"name": "Reading the illustration style",
"estMs": 8000
},
{
"id": "plan",
"name": "Checking sources",
"estMs": 11000
},
{
"id": "ready",
"name": "Plan ready",
"estMs": 400
}
]
}Errors
| Status | Code | When |
|---|---|---|
| 409 | site_reading | |
| 429 | rate_limited |
The stylestep reads the illustration style and is optional: if it fails the read still finishes.
curl -X POST "$BRENZURI_URL/api/v1/sites/$SITE_ID/analyze" \
-H "Authorization: Bearer $BRENZURI_KEY"POST/api/v1/sites/{siteID}/topics/check
- Scopebrief
- Credits free
Path
| Name | Type | Description |
|---|---|---|
siteID | string |
Body
| Name | Type | Description |
|---|---|---|
topicrequired | string |
Response
200independentOrigins, state (ready from 3 origins, thin from 1, none), whether the site already covers it, which pages cover it, whether it is in the library, and credits the article would cost.
{
"independentOrigins": 4,
"state": "ready",
"coveredOnSite": false,
"coveredBy": [],
"inLibrary": false,
"credits": 1
}Errors
| Status | Code | When |
|---|---|---|
| 409 | site_not_ready | |
| 429 | rate_limited |
curl -X POST "$BRENZURI_URL/api/v1/sites/$SITE_ID/topics/check" \
-H "Authorization: Bearer $BRENZURI_KEY" \
-H "Content-Type: application/json" \
-d '{
"topic": "Ferry timetables on the northern coast"
}'GET/api/v1/sites/{siteID}/topics/{topicId}
- Scoperead
- Credits free
Path
| Name | Type | Description |
|---|---|---|
siteID | string | |
topicId | string | id of an entry in the site plan’s topics. |
Response
200{ topic, origins, yourSources, workspaceSources }. topic is a Column.
{
"topic": {
"id": "ferry-timetables",
"title": "Ferry timetables on the northern coast",
"short": "Ferry timetables",
"keywords": [
"ferry",
"timetable",
"northern route"
],
"coverage": "absent",
"coveredBy": [],
"independentOrigins": 4,
"state": "ready",
"offered": true,
"origins": [
{
"outlet": "harbour-authority.example",
"title": "Northern route: one timetable from 3 November",
"url": "https://harbour-authority.example/news/northern-route-timetable",
"publishedAt": "2026-10-02",
"reprints": 0
}
],
"yourSources": 0
},
"origins": [
{
"outlet": "harbour-authority.example",
"title": "Northern route: one timetable from 3 November",
"url": "https://harbour-authority.example/news/northern-route-timetable",
"publishedAt": "2026-10-02",
"reprints": 0
}
],
"yourSources": [],
"workspaceSources": []
}Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found |
curl "$BRENZURI_URL/api/v1/sites/$SITE_ID/topics/$TOPIC_ID" \
-H "Authorization: Bearer $BRENZURI_KEY"POST/api/v1/sites/{siteID}/topics/{topicId}/write
- Scopegenerate
- Credits 1, or 2 for a long brief; held, captured when done
- Role edit
Path
| Name | Type | Description |
|---|---|---|
siteID | string | |
topicId | string | id of an entry in the site plan’s topics. |
Body
| Name | Type | Description |
|---|---|---|
flagged | boolean |
Response
200
{
"articleId": "9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4",
"jobId": "C8A41E07-52B9-4D36-8F1A-0B7E9D3C6A25",
"creditsHeld": 1,
"briefId": "5D2E8A14-7B3C-4F69-A0D1-9C46E3B7F208"
}Errors
| Status | Code | When |
|---|---|---|
| 409 | column_not_ready | flagged was not sent. |
| 409 | site_not_ready | |
| 402 | insufficient_credits | |
| 429 | budget_exhausted |
curl -X POST "$BRENZURI_URL/api/v1/sites/$SITE_ID/topics/$TOPIC_ID/write" \
-H "Authorization: Bearer $BRENZURI_KEY" \
-H "Content-Type: application/json" \
-d '{
"flagged": false
}'POST/api/v1/sites/{siteID}/topics/{topicId}/sources
- Scopeedit
- Credits free
- Role edit
url, note, copyOf. A column holds at most 10 of your sources.
Path
| Name | Type | Description |
|---|---|---|
siteID | string | |
topicId | string | id of an entry in the site plan’s topics. |
Body
| Name | Type | Description |
|---|---|---|
url | string | |
note | string | |
copyOf | string |
Response
200GET /sites/{siteID}/topics/{topicId} returns it.
Errors
| Status | Code | When |
|---|---|---|
| 400 | validation | url, note and copyOf. |
| 415 | unsupported_pdf | |
| 422 | unreadable_source | |
| 409 | too_many_sources | |
| 409 | source_exists | |
| 400 | unsafe_url |
curl -X POST "$BRENZURI_URL/api/v1/sites/$SITE_ID/topics/$TOPIC_ID/sources" \
-H "Authorization: Bearer $BRENZURI_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://coast-gazette.example/transport/ferries-share-timetable"
}'