Objects
On this page
Field names are camelCase. A field that is not set is omitted. Fields marked optional can be missing; every other field is always present. Ids are strings. Articles, claims, sources, briefs and jobs use upper-case UUIDs; sites, brands, illustrations and webhooks use lower-case. In addingLanguagesthe job and brief ids are lower-case. Compare them without regard to case.Dates are ISO 8601 in UTC, except analysedAtandpausedAton a site, which areyyyy-MM-dd.
Enumerations #
| Field | Values |
|---|---|
status of an article | draft, generating, needsReview, approved, published, held, archived |
origin of an article | manual, beat, agent, schedule |
state of a claim | corroborated, singleSource, circular, disputed, parallel |
purpose of a brief | news, explainer, background, roundup, press, blog |
tone of a brief | neutral, explanatory, formal, conversational |
length of a brief | short, standard, long |
structure of a brief | ibc, list, qa |
illustration of a brief | generate, upload, none |
status of a site | reading, ready, failed, paused |
status of a delivery | delivered, held, retrying, cancelled |
outcome of a delivery | published, draft, awaitingApproval |
status of a house style | draft, confirmed, off, superseded |
status of an illustration | ready, skipped, generating, failed |
kind of a part of an estimate | article, version |
mode of a paragraph rewrite | shorter, longer, tone |
target of an export | markdown, pdf, docx |
status of a job | queued, running, paused, done, failed, cancelled |
kind of a job (a key or an agent sees article and site) | article, preview, beat, site, dryRun |
kind of a connection | wordpress, webhook |
publishPolicy of a connection (auto is refused) | draft, auto, approval |
Objects #
Article
Engine type ArticleDTO
GET /articles/{id} and by every edit. For a key or an agent comments is always [] and delivery is never present.
| Field | Type | Description |
|---|---|---|
id | string | |
status | string | draft, generating, needsReview, approved, published, held or archived. |
title | string | |
lead | string | |
language | string | en, or bhs for Bosnian/Croatian/Serbian. A language version is an article of its own and has its own language; see Language versions. |
words | integer | |
paragraphs | Paragraph[] | ## or ### prefix. |
sources | Source[] | |
claims | Claim[] | corroborated is flagged. |
quality | QualityCheck[] | |
versions | Version[] | |
comments | object[] | [] for a key or an agent. |
label | Label | |
brandName | string | |
siteIdoptional | string | |
origin | string | manual, beat, agent or schedule. |
by | string | Maya Chen · via agent. |
archivedoptional | object | { at, by, agent? }, present when the article is archived. |
feedbackAskedoptional | boolean | |
runoptional | Run | status is generating: the job that is writing it. |
blocksoptional | Block[] | |
deckoptional | string | |
deliveryoptional | object | |
internalLinksoptional | object[] | { id, n, anchor, url, title }. |
illustrationoptional | Illustration | |
primaryArticleIdoptional | string | |
languageVersionsoptional | LanguageVersion[] | |
addingLanguagesoptional | AddingLanguages |
IDs are not cased consistently. Article, claim, source, brief and job ids are upper-case UUID strings; site, brand and illustration ids are lower-case. Routes accept either; compare case-insensitively. A field that is not set is omitted from the JSON. It is never null.
{
"id": "9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4",
"status": "needsReview",
"title": "Ferry operators agree on a single timetable for the northern route",
"lead": "Three ferry operators will publish one shared timetable for the northern route from 3 November.",
"language": "en",
"words": 412,
"paragraphs": [
{
"n": 1,
"text": "Three ferry operators will publish one shared timetable for the northern route from 3 November, the harbour authority said.",
"claimIds": [
"E1A7C3B9-0D42-4F58-96AE-3B1C8D7F2045"
]
},
{
"n": 2,
"text": "## What changes for commuters",
"claimIds": []
},
{
"n": 3,
"text": "Commuters will see 14 daily crossings instead of 9, and a single fare table applies on all of them.",
"claimIds": [
"4B90D6E2-A317-4C8B-B5F0-7E2A19C3D864",
"A63F2E58-9C10-47DB-8E3A-D5B07C41F192"
]
}
],
"blocks": [
{
"n": 1,
"text": "Three ferry operators will publish one shared timetable for the northern route from 3 November, the harbour authority said.",
"claimIds": [
"E1A7C3B9-0D42-4F58-96AE-3B1C8D7F2045"
]
},
{
"kind": "heading",
"level": 2,
"text": "What changes for commuters",
"n": 2,
"claimIds": []
},
{
"n": 3,
"text": "Commuters will see 14 daily crossings instead of 9, and a single fare table applies on all of them.",
"claimIds": [
"4B90D6E2-A317-4C8B-B5F0-7E2A19C3D864",
"A63F2E58-9C10-47DB-8E3A-D5B07C41F192"
]
}
],
"sources": [
{
"id": "71C2E9A0-B4D8-4536-9F1E-A08D3C56B7E4",
"origin": "harbour-authority.example",
"title": "Northern route: one timetable from 3 November",
"url": "https://harbour-authority.example/news/northern-route-timetable",
"score": 75,
"official": false,
"contributed": "Contributed: 2 claims",
"soleForClaims": 1
},
{
"id": "D90B5F13-2E67-4A8C-B1D4-6C3E7A0F5982",
"origin": "coast-gazette.example",
"title": "Ferries to share a timetable",
"url": "https://coast-gazette.example/transport/ferries-share-timetable",
"score": 75,
"official": false,
"contributed": "Contributed: 2 claims",
"soleForClaims": 0
}
],
"claims": [
{
"id": "E1A7C3B9-0D42-4F58-96AE-3B1C8D7F2045",
"text": "The shared timetable starts on 3 November.",
"state": "corroborated",
"originCount": 2,
"sourceIds": [
"71C2E9A0-B4D8-4536-9F1E-A08D3C56B7E4",
"D90B5F13-2E67-4A8C-B1D4-6C3E7A0F5982"
],
"paragraph": 1,
"keptFlag": false
},
{
"id": "4B90D6E2-A317-4C8B-B5F0-7E2A19C3D864",
"text": "The route will have 14 daily crossings instead of 9.",
"state": "singleSource",
"originCount": 1,
"sourceIds": [
"71C2E9A0-B4D8-4536-9F1E-A08D3C56B7E4"
],
"paragraph": 3,
"keptFlag": false
},
{
"id": "A63F2E58-9C10-47DB-8E3A-D5B07C41F192",
"text": "A single fare table applies on all crossings.",
"state": "corroborated",
"originCount": 2,
"sourceIds": [
"71C2E9A0-B4D8-4536-9F1E-A08D3C56B7E4",
"D90B5F13-2E67-4A8C-B1D4-6C3E7A0F5982"
],
"paragraph": 3,
"keptFlag": false
}
],
"quality": [
{
"id": "q-readback",
"name": "Read back against the sources",
"verdict": "passed",
"detail": "Every figure and quote in the text appears in a source."
},
{
"id": "q-length",
"name": "Length",
"verdict": "warning",
"detail": "412 words."
}
],
"versions": [
{
"n": 1,
"label": "Generated",
"when": "2026-10-06T12:04:11Z",
"by": "Claude (newsroom agent)",
"model": "writer-v3",
"note": "Written from 2 origins · 3 claims checked · 1 marked",
"agent": "Claude (newsroom agent)"
}
],
"comments": [],
"label": {
"reviewedByHuman": false
},
"brandName": "Kolibri Courier",
"siteId": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0",
"origin": "agent",
"by": "Maya Chen · via agent",
"deck": "The harbour authority says commuters get 14 daily crossings."
}Paragraph
Engine type ParagraphDTO
n addresses the unit in the edit routes.
| Field | Type | Description |
|---|---|---|
n | integer | |
text | string | **bold** markers. |
claimIds | string[] |
Block
Engine type BlockDTO
n, text and claimIds; the other kinds add kind and their own fields.
| Field | Type | Description |
|---|---|---|
kind | string | heading, paragraph, list or table. A paragraph block omits it. |
n | integer | |
text | string | |
claimIds | string[] | |
leveloptional | integer | |
orderedoptional | boolean | |
itemsoptional | object[] | { text, claimIds } per item. |
headersoptional | string[] | |
rowsoptional | object[] | { cells, claimIds } per row. |
Claim
Engine type ClaimDTO
| Field | Type | Description |
|---|---|---|
id | string | POST /articles/{id}/claims/{claimId}/sources. |
text | string | |
state | string | corroborated, singleSource, circular, disputed or parallel. See Corroboration and flags. |
originCount | integer | |
sourceIds | string[] | |
paragraph | integer | n the claim sits in. |
keptFlag | boolean | |
keptNoteoptional | string |
Source
Engine type SourceDTO
| Field | Type | Description |
|---|---|---|
id | string | |
origin | string | |
title | string | |
url | string | |
score | integer | |
official | boolean | |
contributed | string | |
relationoptional | string | |
soleForClaims | integer |
Quality check
Engine type QualityCheckDTO
q-readback and q-length; do not build logic on a list of them.
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
verdict | string | passed or warning. |
detail | string | |
actionLabeloptional | string | |
itemsoptional | string[] | |
unitsoptional | integer[] | |
targetoptional | integer | |
dismissedByoptional | string | |
dismissNoteoptional | string |
Version
Engine type VersionDTO
| Field | Type | Description |
|---|---|---|
n | integer | |
label | string | Generated or Source added. |
when | string | |
by | string | |
model | string | |
note | string | |
agentoptional | string | API key <name> (<display>). |
titleoptional | string |
Label
Engine type ArticleLabelDTO
| Field | Type | Description |
|---|---|---|
reviewedByHuman | boolean | |
approvedVersionoptional | integer | |
approvedAtoptional | string | |
approvedByoptional | string | |
acknowledgedoptional | object[] | { statement, note, by }. |
Article summary
Engine type ArticleSummaryDTO
GET /articles.
| Field | Type | Description |
|---|---|---|
id | string | |
title | string | |
status | string | draft, generating, needsReview, approved, published, held or archived. |
updatedAt | string | |
brandName | string | |
siteIdoptional | string | |
origin | string | manual, beat, agent or schedule. |
beatNameoptional | string | |
agentNameoptional | string | |
by | string | |
flaggedClaims | integer | corroborated. |
words | integer | |
language | string | |
runoptional | Run | |
primaryArticleIdoptional | string |
Run
Engine type ArticleRunDTO
| Field | Type | Description |
|---|---|---|
jobId | string | |
status | string | |
briefIdoptional | string |
Illustration
Engine type ArticleIllustrationDTO
| Field | Type | Description |
|---|---|---|
id | string | |
status | string | ready, skipped, generating or failed. |
urloptional | string | status is ready. Fetch it with the same key. |
altText | string | |
captionoptional | string | |
label | string | AI-generated. |
styleLabel | string | |
reasonoptional | string | |
regenerating | boolean | |
lastFailureoptional | string | |
regenerationsLeftoptional | integer |
Language version
Engine type LanguageVersionDTO
languageVersions on an article: the article itself or one of its language versions. Each is an article with its own approval, so approved is that article’s own.
| Field | Type | Description |
|---|---|---|
language | string | |
articleId | string | GET /articles/{id}. |
status | string | draft, generating, needsReview, approved, published, held or archived: the status of that article. |
approved | boolean |
[
{
"language": "en",
"articleId": "9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4",
"status": "approved",
"approved": true
},
{
"language": "es",
"articleId": "1B7E4D90-3C52-4A18-9F6D-C80A2E5B7143",
"status": "needsReview",
"approved": false
}
]Adding languages
Engine type ArticleAddingDTO
addingLanguages of an article while POST /articles/{id}/languages is writing versions for it.
| Field | Type | Description |
|---|---|---|
jobId | string | GET /jobs/{id}/events. |
status | string | queued, running or paused. |
briefIdoptional | string | |
languages | string[] |
Brief
Engine type BriefDTO
POST /briefs, where every field is optional.
| Field | Type | Description |
|---|---|---|
id | string | |
brandIdoptional | string | |
siteIdoptional | string | |
topic | string | |
angle | string | |
useUrls | string[] | |
excludeDomains | string[] | |
purpose | string | news, explainer, background, roundup, press or blog. Default explainer. |
audience | string | |
region | string | Global. |
language | string | +, as en+es+de: the first code is the article, each other code is a version of it. Default en. One code is accepted as it is, whatever it is, as long as it has no spaces. With + every code must be one of the 22 supported languages, each once, and is lower-cased; anything else is refused with 422 invalid_language. |
tone | string | neutral, explanatory, formal or conversational. Default neutral. |
length | string | short, standard or long. A long article costs 2 credits. Default standard. |
targetWords | integer | |
structure | string | ibc, list or qa. Default ibc. |
keywords | string[] | |
mustAppear | string[] | |
preferDomains | string[] | |
illustration | string | generate, upload or none. Default none. Only generate adds the illustrating step. |
imageStyleoptional | string | |
imageFormatoptional | string | |
seo | boolean |
{
"id": "5D2E8A14-7B3C-4F69-A0D1-9C46E3B7F208",
"siteId": "3b6f0c52-6a41-4d0e-9a53-71c8f2d5a1e0",
"topic": "Ferry operators agree on a single timetable for the northern route",
"angle": "What changes for commuters from November",
"useUrls": [],
"excludeDomains": [],
"purpose": "news",
"audience": "",
"region": "Global",
"language": "en",
"tone": "neutral",
"length": "standard",
"targetWords": 900,
"structure": "ibc",
"keywords": [],
"mustAppear": [
"the November start date"
],
"preferDomains": [],
"illustration": "none",
"seo": true
}Estimate
Engine type EstimateResponse
| Field | Type | Description |
|---|---|---|
credits | integer | |
parts | object[] | { label, credits, kind }, where kind is article or version. A version is labelled by language, for example Spanish version. The credits of the parts add up to credits. |
steps | object[] | { id, name, estMs }. Each language version adds its own write-, seo- (only when the brief asks for the SEO fields) and qa- steps, after the steps of the article. |
enough | boolean |
{
"credits": 1,
"parts": [
{
"label": "Article",
"credits": 1,
"kind": "article"
}
],
"steps": [
{
"id": "find",
"name": "Searching your domains",
"estMs": 14200
},
{
"id": "group",
"name": "Grouping by origin",
"estMs": 6100
},
{
"id": "read",
"name": "Reading one page per origin",
"estMs": 39400
},
{
"id": "check",
"name": "Checking claims across origins",
"estMs": 30800
},
{
"id": "write",
"name": "Writing",
"estMs": 48000
},
{
"id": "seo",
"name": "Writing the SEO fields",
"estMs": 4000
},
{
"id": "qa",
"name": "Reading the finished text back",
"estMs": 9000
}
],
"enough": true
}Started job
Engine type StartJobResponse
POST /articles. The article exists at once, in generating.
| Field | Type | Description |
|---|---|---|
articleId | string | |
jobId | string | GET /jobs/{id}/events. |
creditsHeld | integer | |
briefIdoptional | string | |
stepsoptional | object[] | { id, name, estMs }. Present on POST /articles and POST /articles/{id}/languages; not on writing a column. |
{
"articleId": "9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4",
"jobId": "C8A41E07-52B9-4D36-8F1A-0B7E9D3C6A25",
"creditsHeld": 1,
"briefId": "5D2E8A14-7B3C-4F69-A0D1-9C46E3B7F208",
"steps": [
{
"id": "find",
"name": "Searching your domains",
"estMs": 14200
},
{
"id": "group",
"name": "Grouping by origin",
"estMs": 6100
},
{
"id": "read",
"name": "Reading one page per origin",
"estMs": 39400
},
{
"id": "check",
"name": "Checking claims across origins",
"estMs": 30800
},
{
"id": "write",
"name": "Writing",
"estMs": 48000
},
{
"id": "seo",
"name": "Writing the SEO fields",
"estMs": 4000
},
{
"id": "qa",
"name": "Reading the finished text back",
"estMs": 9000
}
]
}Job event
Engine type JobEventDTO
data: line of the event stream.
| Field | Type | Description |
|---|---|---|
kind | string | step, done, failed, refunded or ping. |
stepIdoptional | string | find, group, read, check, write, seo, qa or illustrate, and for a language version write-, seo- or qa- followed by the language code, as write-es. A job that adds languages starts with sources. For a site read: read, describe, style, plan or ready. |
statusoptional | string | todo, running, done or failed. |
summaryoptional | string | |
detailsoptional | object[] | { text, tag, tagLabel? } where tag is ok, flag, warn or info. |
msoptional | integer | |
articleIdoptional | string | done: the finished article. |
messageoptional | string | failed: what went wrong. |
optionaloptional | boolean | failed: whether the step may be skipped. |
creditsoptional | integer | refunded: credits released. |
reasonoptional | string | failed: a machine reason such as provider_gave_up. On refunded: unused when the job finished and the credits of the language versions that were skipped, failed or came back empty were released; the stream carries on and a done follows. |
queuedoptional | integer | ping: position in the queue while the job waits. |
A finished job ends with {"articleId":"9F3B1C2A-6D4E-4B7A-8C15-2E0A7D91B3F4","kind":"done"}.
{
"details": [
{
"tag": "ok",
"text": "2 independent origins"
}
],
"kind": "step",
"ms": 6120,
"status": "done",
"stepId": "group",
"summary": "5 results · 2 origins"
}Site summary
Engine type SiteSummaryDTO
GET /sites.
| Field | Type | Description |
|---|---|---|
id | string | |
domain | string | |
siteName | string | |
status | string | reading, ready, failed or paused. |
failureoptional | string | |
analysedAtoptional | string | |
offeredTopics | integer | |
cadenceoptional | string | |
articleCount | integer | |
needsReviewCount | integer | |
brandIdoptional | string | |
thumbnailUrloptional | string | |
pausedAtoptional | string | |
freeColumnAvailableoptional | boolean |
Site
Engine type SiteDTO
delivery and freeColumnAvailable are never present for a key or an agent. Nested objects other than plan, voice, writing, written, linkPages and houseStyle are shaped like their screens and are not listed here.
| Field | Type | Description |
|---|---|---|
id | string | |
domain | string | |
siteName | string | |
status | string | reading, ready, failed or paused. |
failureoptional | string | |
analysedAtoptional | string | |
guessedKindoptional | string | |
voiceoptional | Voice | |
samples | object[] | { url, title, publishedAt? }. |
planoptional | SitePlan | |
brandIdoptional | string | |
jobIdoptional | string | reading: the job to follow. |
setup | object[] | |
thumbnailUrloptional | string | |
pausedAtoptional | string | |
pausedByoptional | string | |
scheduleoptional | object | |
deliveryoptional | object | |
freeColumnAvailableoptional | boolean | |
unmatchedSources | integer | |
voiceDraftedFrom | object | { count, samples[] } of the pages the voice came from. |
voiceDraftedAtoptional | string | |
writing | object[] | { topicId, jobId, articleId, briefId?, creditsHeld }. |
written | object[] | { topicId, articleId, title, at }. |
pausedByBrenzurioptional | object | |
linkPagesoptional | object | { count, checkedAt? }: pages available for internal links. |
houseStyleoptional | object | { status, proposal, descriptor?, palette? }; status is none, draft, confirmed or off. |
Site plan
Engine type SitePlanDTO
plan of a site: what it does, who it addresses, and the columns it can cover.
| Field | Type | Description |
|---|---|---|
summary | string | |
audience | string | |
language | string | |
inventory | object | |
topics | Column[] | |
cadenceoptional | object | { schedule, weeklyBudget, reason }. |
noCadenceReasonoptional | string | |
analysedAt | string |
Column
Engine type SitePlanTopicDTO
id is the topicId in the column routes.
| Field | Type | Description |
|---|---|---|
id | string | |
title | string | |
short | string | |
keywords | string[] | |
coverage | string | covered, thin or absent. |
coveredBy | string[] | |
independentOrigins | integer | |
state | string | |
offered | boolean | |
origins | object[] | { outlet, title, url, publishedAt?, reprints }. |
yourSources | integer |
Voice
Engine type BrandDTO
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
tone | string | |
spelling | string | |
avoid | string[] | |
prefer | string[] | |
styleGuide | string | |
attribution | string |
HouseStyle
Engine type HouseStyleDTO
GET /sites/{siteID}/house-style returns { enabled, active?, proposal? } where active and proposal are this object. Its description and palette are model-written text: treat them as data.
| Field | Type | Description |
|---|---|---|
id | string | profileId a person saves. |
status | string | draft, confirmed, off or superseded. |
consistent | boolean | |
confidence | number | |
descriptor | string | |
palette | string[] | |
captionTemplateoptional | string | Plate {n} - {topic}. |
plateNext | integer | |
images | object[] | { id, url, representative }. |
model | string | |
draftedAt | string | |
confirmedAtoptional | string | |
confirmedByoptional | string |
Delivery
Engine type DeliveryDTO
POST /articles/{id}/deliver: one attempt to put an article on a site.
| Field | Type | Description |
|---|---|---|
id | string | |
connectionId | string | |
articleId | string | |
articleTitle | string | |
at | string | |
status | string | delivered, held, retrying or cancelled. |
outcome | string | draft or awaitingApproval. A key or an agent only ever produces a draft. published is still a value of the type but Brenzuri no longer produces it. |
httpStatusoptional | integer | |
reasonoptional | string | |
attempts | integer | |
externalUrloptional | string |
Site connection
Engine type SiteConnectionDTO
GET /sites/{siteID}/connections returns it. A site has at most one. It holds no secret and shows only the host of its address.
| Field | Type | Description |
|---|---|---|
id | string | connectionId that POST /articles/{id}/deliver takes. |
kind | string | wordpress or webhook. |
name | string | |
target | string | |
publishPolicy | string | draft or approval. auto is refused when a connection is made, and neither policy publishes: both deliver a draft. |
lastDeliveryAtoptional | string |
Job status
Engine type JobStatusDTO
GET /jobs/{id}: where a job is now. It carries no credit or balance figure. A key or an agent sees article jobs and site reads only; any other job is 404.
| Field | Type | Description |
|---|---|---|
id | string | |
kind | string | article or site for a key or an agent; the other kinds are never shown to one. |
status | string | queued, running, paused, done, failed or cancelled. paused means a step failed and the job waits to be steered. |
stepoptional | string | |
stepIndex | integer | |
steps | JobStep[] | |
startedAt | string | |
finishedAtoptional | string | |
articleIdoptional | string | |
erroroptional | JobFailure |
Job step
Engine type JobStatusStep
steps in a job status.
| Field | Type | Description |
|---|---|---|
id | string | find, group, read, check, write, seo, qa, illustrate for an article, with write-, seo- and qa- and a language code for each language version, and sources for a job that adds languages; read, describe, style, plan, ready for a site read. |
nameoptional | string | |
status | string | todo, running, done or failed. |
optional | boolean |
Job failure
Engine type JobStatusFailure
error of a job status.
| Field | Type | Description |
|---|---|---|
code | string | cancelled, or the cause: fetch_timeout, too_few_origins, model_timeout, provider_error or other. |
message | string |