Schemas
Status
The one and only member of an error body — there is never a partial resource beside it.
AccountRole
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe role's name, as member pickers show it — unique in the account, surrounding spaces dropped, at most 100 characters. A second role of the same name is ALREADY_EXISTS. The list is ordered by it.
descriptionWhat the role is for, in a sentence a member picker can show next to the choice; at most 1000 characters, empty when there is none.
grantsWhat the role holds, as {permission, level} — a section id from permissions and READ or WRITE. A grant covers the section's whole subtree and brings its implies along. Every member holding the role holds exactly these, and a change counts from their next request. Nobody may define a role wider than their own: that is PERMISSION_DENIED.
member_countHow many members of the account hold the role now. A role that a member holds, or that an invitation names, cannot be deleted.
AccountRoleCreate
display_nameThe role's name, as member pickers show it — unique in the account, surrounding spaces dropped, at most 100 characters. A second role of the same name is ALREADY_EXISTS. The list is ordered by it.
descriptionWhat the role is for, in a sentence a member picker can show next to the choice; at most 1000 characters, empty when there is none.
grantsWhat the role holds, as {permission, level} — a section id from permissions and READ or WRITE. A grant covers the section's whole subtree and brings its implies along. Every member holding the role holds exactly these, and a change counts from their next request. Nobody may define a role wider than their own: that is PERMISSION_DENIED.
AccountRoleUpdate
display_nameThe role's name, as member pickers show it — unique in the account, surrounding spaces dropped, at most 100 characters. A second role of the same name is ALREADY_EXISTS. The list is ordered by it.
descriptionWhat the role is for, in a sentence a member picker can show next to the choice; at most 1000 characters, empty when there is none.
grantsWhat the role holds, as {permission, level} — a section id from permissions and READ or WRITE. A grant covers the section's whole subtree and brings its implies along. Every member holding the role holds exactly these, and a change counts from their next request. Nobody may define a role wider than their own: that is PERMISSION_DENIED.
Invitation
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
emailThe address the invitation is mailed to, stored lowercase. One pending invitation per address: inviting it again, or inviting a member's address, is ALREADY_EXISTS. The list is ordered by it.
roleThe role the membership will hold once the invitation is accepted: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role}. Nobody may invite with a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections invitation grants, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may grant a section they do not hold themselves.
inviterThe member who sent the invitation, as users/{user}; absent once that user no longer exists.
statePENDING until expire_time, then EXPIRED: the link no longer works, but the invitation stays listed for 30 days so it can be sent again with :resend — or withdrawn. An accepted invitation is gone.
expire_timeWhen the link stops working: 7 days after the invitation was sent, or sent again.
InvitationCreate
emailThe address the invitation is mailed to, stored lowercase. One pending invitation per address: inviting it again, or inviting a member's address, is ALREADY_EXISTS. The list is ordered by it.
roleThe role the membership will hold once the invitation is accepted: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role}. Nobody may invite with a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections invitation grants, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may grant a section they do not hold themselves.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used in this account returns the invitation that key created, and mails nothing.
InvitationUpdate
emailThe address the invitation is mailed to, stored lowercase. One pending invitation per address: inviting it again, or inviting a member's address, is ALREADY_EXISTS. The list is ordered by it.
roleThe role the membership will hold once the invitation is accepted: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role}. Nobody may invite with a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections invitation grants, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may grant a section they do not hold themselves.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used in this account returns the invitation that key created, and mails nothing.
Member
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
userThe member, as users/{user} — the same name the account's owner uses. The last segment is also this membership's id.
emailThe member's email address, from their user profile. The list is ordered by it.
firstnameThe member's first name, from their user profile; absent when they gave none.
lastnameThe member's last name, from their user profile; absent when they gave none.
roleThe membership's role: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role} — never another account's. The owner's membership reads roles/admin — dormant while they own the account, and what they keep after handing it over — and cannot be changed. Nobody may give a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections membership holds, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may give a grant they do not hold themselves.
is_ownerTrue for the account's one owner, who holds everything whatever the role says. The owner's membership is neither removed nor changed; the account is handed over first (accounts/{account}:transfer_ownership).
effective_grantsWhat the member actually holds, computed on every read: the role's grants — or the membership's own — with implies followed, minimal and in the order of permissions. The owner's are everything. Sections every member may read are readable whatever this says.
MemberCreate
roleThe membership's role: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role} — never another account's. The owner's membership reads roles/admin — dormant while they own the account, and what they keep after handing it over — and cannot be changed. Nobody may give a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections membership holds, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may give a grant they do not hold themselves.
MemberUpdate
roleThe membership's role: roles/admin, roles/editor or roles/sections (see roles), or one of the account's own, accounts/{account}/roles/{role} — never another account's. The owner's membership reads roles/admin — dormant while they own the account, and what they keep after handing it over — and cannot be changed. Nobody may give a role wider than their own: that is PERMISSION_DENIED.
grantsThe sections a roles/sections membership holds, as {permission, level} — a section id from permissions and READ or WRITE. Empty, and refused when sent, under any other role. Nobody may give a grant they do not hold themselves.
Permission
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
parentThe section this one belongs to, as its resource name. Absent on the two roots — account, everything about the account itself, and website, everything inside its websites. A grant on a section covers every section under it.
display_nameThe section's name as a person reads it, in English. tenant-admin shows its own translation, looked up by id, and falls back to this one.
descriptionWhat a grant on this section lets a member do, in a sentence or two a role editor can show as help text.
readable_by_all_membersTrue where every member of the account may read without any grant — everything inside the websites, and the account's settings and projects — so that every picker works under every role. On such a section a READ grant only decides whether it shows in the menu; changing anything still takes WRITE.
impliesThe grants holding this section brings along, as {when, permission, level}: whoever holds when (READ or WRITE) on this section — or on a section above it — holds level on permission too. It is what keeps a narrow role usable: writing a theme uploads its logo, so it brings writing to the media library with it. Empty on most sections.
Role
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe role's name as a person reads it, in English.
descriptionWhat a member with this role may do, in a sentence or two a member picker can show next to the choice.
grantsWhat the role holds, as {permission, level} — computed from permissions on every read rather than stored, so a section a new release adds is in roles/admin and roles/editor the day it ships. Minimal: no grant that another one already covers, and implies already followed. Empty for roles/sections, whose grants are each membership's own.
Account
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe account's label, as the admin shows it in the account switcher.
is_activeWhether the account is in use. An inactive one is invisible on this surface: the list skips it and a read answers NOT_FOUND.
ownerThe member who owns the account, as users/{user}: whoever created it, or the first member of an account made for them. An account has exactly one owner; neither Create nor Update sets it, and only the owner moves it, with :transfer_ownership. The owner may do everything in the account whatever their role says, is the only member who may delete it or hand it over, and can be neither removed from it nor leave it.
AccountCreate
display_nameThe account's label, as the admin shows it in the account switcher.
is_activeWhether the account is in use. An inactive one is invisible on this surface: the list skips it and a read answers NOT_FOUND.
AccountUpdate
display_nameThe account's label, as the admin shows it in the account switcher.
is_activeWhether the account is in use. An inactive one is invisible on this surface: the list skips it and a read answers NOT_FOUND.
AiBilling
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
balanceThe AI balance as Money: what runs on the platform's key (MANAGED) are paid from. It is the balance after the latest row of ai_transactions, and it can be negative when runs started together spent past it.
currency_codeThe currency the balance, the limits and every charge are kept in (ISO 4217).
monthly_limitThe most the account may spend on the platform's key in a calendar month (UTC), as Money. A run that could take the month past it is refused before it starts. Leave it unset for no limit.
daily_limitThe most the account may spend on the platform's key in a calendar day (UTC), as Money. A run that could take the day past it is refused before it starts.
max_concurrent_executionsThe most runs the account may have queued or running at once, on any connection. A run created past it is refused with CONCURRENCY_LIMIT_REACHED.
platform_monthly_limitThe platform's monthly ceiling for this account, as Money. It applies over monthly_limit: the lower of the two is the one in force.
platform_daily_limitThe platform's daily ceiling for this account, as Money, in force over daily_limit.
platform_max_concurrent_executionsThe platform's ceiling on runs queued or running at once for this account, in force over max_concurrent_executions.
spend_todayWhat runs on the platform's key were charged today (UTC), as Money — the figure daily_limit is measured against.
spend_mtdWhat runs on the platform's key were charged this calendar month so far (UTC), as Money — the figure monthly_limit is measured against.
AiBillingCreate
monthly_limitThe most the account may spend on the platform's key in a calendar month (UTC), as Money. A run that could take the month past it is refused before it starts. Leave it unset for no limit.
daily_limitThe most the account may spend on the platform's key in a calendar day (UTC), as Money. A run that could take the day past it is refused before it starts.
max_concurrent_executionsThe most runs the account may have queued or running at once, on any connection. A run created past it is refused with CONCURRENCY_LIMIT_REACHED.
AiBillingUpdate
monthly_limitThe most the account may spend on the platform's key in a calendar month (UTC), as Money. A run that could take the month past it is refused before it starts. Leave it unset for no limit.
daily_limitThe most the account may spend on the platform's key in a calendar day (UTC), as Money. A run that could take the day past it is refused before it starts.
max_concurrent_executionsThe most runs the account may have queued or running at once, on any connection. A run created past it is refused with CONCURRENCY_LIMIT_REACHED.
AiTransaction
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
typeCHARGE for a run on the platform's key; TOP_UP, REFUND, ADJUSTMENT or BONUS for a change made by the platform.
amountThe row's amount as Money, signed: negative for a charge, positive for money put in.
balance_afterThe balance right after this row, as Money, so a statement reads without adding up the rows before it.
execution_idThe ai_executions entry a CHARGE is for. Absent on every other type.
usage_record_idThe ai_usage_records entry — the attempt and its token counts — a CHARGE was priced from.
pricing_idThe price row a CHARGE was priced at. Price rows never change, so a later price change does not restate it.
descriptionWhat the row is for, in words: the run and attempt of a charge, or the reason given for a change.
AiTransactionUpdate
AiUsageRecord
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
execution_idThe ai_executions entry the attempt belongs to.
attemptThe number of the attempt within its run, as in the run's attempts.
agent_idThe ai_agents entry the run executed.
model_idThe ai_models entry the attempt ran on.
providerThe AI provider that served the attempt, by the platform's name for it.
connection_modeWhose key the attempt used: BYOK (the account's own, billed by the provider) or MANAGED (the platform's, charged to the AI balance).
input_tokensInput tokens the provider counted for the attempt, cache reads and writes not included.
output_tokensOutput tokens the provider counted for the attempt.
cache_read_input_tokensInput tokens the provider served from its prompt cache.
cache_creation_input_tokensInput tokens the provider wrote to its prompt cache.
raw_usageThe provider's own usage object for the attempt, exactly as it arrived, kept beside the four counters above.
AiUsageRecordUpdate
AiAgent
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe label that tells this agent apart in a list. Required on create unless source_system_agent supplies it.
descriptionWhat the agent is for, for the people who maintain it.
instruction_idThe id of the account's ai_instructions entry this agent runs. Required on create unless source_system_agent is set, which creates the instruction too.
instruction_versionPin the agent to one version of its instruction. Absent means the instruction's active_version at the moment a run starts.
preferred_model_idThe ai_models entry a run uses when it does not name a model. Must be AVAILABLE when set, and able to run what this agent asks of it.
allowed_model_idsThe only models a run of this agent may name. Empty means any available model; when not empty, it must include preferred_model_id.
max_tokensThe most tokens one run may write, at most the model's max_output_tokens. Defaults to 16000.
effortHow hard the model is asked to think: LOW, MEDIUM, HIGH, XHIGH or MAX. Leave it unset for the model's default — and on a model without the EFFORT capability, which refuses any level.
output_formatTEXT (the default); JSON — an answer that follows output_schema, on a model with STRUCTURED_OUTPUT; or IMAGE — a picture, on a model with IMAGE_GENERATION, whose rendered instruction is the prompt and whose result is an artifact of the run rather than text.
output_schemaThe JSON Schema object a JSON agent's answer must follow. Required when output_format is JSON and refused otherwise.
image_widthThe width of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_heightThe height of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_qualityHow much care an IMAGE agent's picture is drawn with: LOW, MEDIUM, HIGH, XHIGH or MAX. Interpreted by the model's provider: on openai it is the picture's quality, and a higher one produces more output tokens; bfl has no such setting and ignores it. Leave it unset for the provider's default. Refused on a TEXT or JSON agent.
connection_modeWhich of the account's connections a run may be authorized through: ANY (the default), BYOK_ONLY or MANAGED_ONLY.
max_attemptsHow many times a run is tried when the provider fails in a way worth retrying: 1 to 10, default 3.
timeoutHow long one call to the provider may take: a number of seconds with the s suffix, 1s to 600s. Defaults to 120s.
allowed_toolsTools the model may call. Must be empty: tool calling is not available yet.
is_enabledWhether the agent may run. Switch it off to stop new runs without deleting it.
versionThe configuration's version: 1 on create, and one more on every update. Each version's settings are kept under versions.
AiAgentCreate
display_nameThe label that tells this agent apart in a list. Required on create unless source_system_agent supplies it.
descriptionWhat the agent is for, for the people who maintain it.
instruction_idThe id of the account's ai_instructions entry this agent runs. Required on create unless source_system_agent is set, which creates the instruction too.
instruction_versionPin the agent to one version of its instruction. Absent means the instruction's active_version at the moment a run starts.
preferred_model_idThe ai_models entry a run uses when it does not name a model. Must be AVAILABLE when set, and able to run what this agent asks of it.
allowed_model_idsThe only models a run of this agent may name. Empty means any available model; when not empty, it must include preferred_model_id.
max_tokensThe most tokens one run may write, at most the model's max_output_tokens. Defaults to 16000.
effortHow hard the model is asked to think: LOW, MEDIUM, HIGH, XHIGH or MAX. Leave it unset for the model's default — and on a model without the EFFORT capability, which refuses any level.
output_formatTEXT (the default); JSON — an answer that follows output_schema, on a model with STRUCTURED_OUTPUT; or IMAGE — a picture, on a model with IMAGE_GENERATION, whose rendered instruction is the prompt and whose result is an artifact of the run rather than text.
output_schemaThe JSON Schema object a JSON agent's answer must follow. Required when output_format is JSON and refused otherwise.
image_widthThe width of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_heightThe height of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_qualityHow much care an IMAGE agent's picture is drawn with: LOW, MEDIUM, HIGH, XHIGH or MAX. Interpreted by the model's provider: on openai it is the picture's quality, and a higher one produces more output tokens; bfl has no such setting and ignores it. Leave it unset for the provider's default. Refused on a TEXT or JSON agent.
connection_modeWhich of the account's connections a run may be authorized through: ANY (the default), BYOK_ONLY or MANAGED_ONLY.
max_attemptsHow many times a run is tried when the provider fails in a way worth retrying: 1 to 10, default 3.
timeoutHow long one call to the provider may take: a number of seconds with the s suffix, 1s to 600s. Defaults to 120s.
allowed_toolsTools the model may call. Must be empty: tool calling is not available yet.
is_enabledWhether the agent may run. Switch it off to stop new runs without deleting it.
source_system_agentCreate only: the id of an ai_system_agents entry to copy. Its settings and its instruction text — as a new instruction of this account — become the new agent's, under any fields the body also sets.
AiAgentUpdate
display_nameThe label that tells this agent apart in a list. Required on create unless source_system_agent supplies it.
descriptionWhat the agent is for, for the people who maintain it.
instruction_idThe id of the account's ai_instructions entry this agent runs. Required on create unless source_system_agent is set, which creates the instruction too.
instruction_versionPin the agent to one version of its instruction. Absent means the instruction's active_version at the moment a run starts.
preferred_model_idThe ai_models entry a run uses when it does not name a model. Must be AVAILABLE when set, and able to run what this agent asks of it.
allowed_model_idsThe only models a run of this agent may name. Empty means any available model; when not empty, it must include preferred_model_id.
max_tokensThe most tokens one run may write, at most the model's max_output_tokens. Defaults to 16000.
effortHow hard the model is asked to think: LOW, MEDIUM, HIGH, XHIGH or MAX. Leave it unset for the model's default — and on a model without the EFFORT capability, which refuses any level.
output_formatTEXT (the default); JSON — an answer that follows output_schema, on a model with STRUCTURED_OUTPUT; or IMAGE — a picture, on a model with IMAGE_GENERATION, whose rendered instruction is the prompt and whose result is an artifact of the run rather than text.
output_schemaThe JSON Schema object a JSON agent's answer must follow. Required when output_format is JSON and refused otherwise.
image_widthThe width of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_heightThe height of the picture an IMAGE agent asks for, in pixels, 64 to 4096; defaults to 1024. Refused on a TEXT or JSON agent.
image_qualityHow much care an IMAGE agent's picture is drawn with: LOW, MEDIUM, HIGH, XHIGH or MAX. Interpreted by the model's provider: on openai it is the picture's quality, and a higher one produces more output tokens; bfl has no such setting and ignores it. Leave it unset for the provider's default. Refused on a TEXT or JSON agent.
connection_modeWhich of the account's connections a run may be authorized through: ANY (the default), BYOK_ONLY or MANAGED_ONLY.
max_attemptsHow many times a run is tried when the provider fails in a way worth retrying: 1 to 10, default 3.
timeoutHow long one call to the provider may take: a number of seconds with the s suffix, 1s to 600s. Defaults to 120s.
allowed_toolsTools the model may call. Must be empty: tool calling is not available yet.
is_enabledWhether the agent may run. Switch it off to stop new runs without deleting it.
source_system_agentCreate only: the id of an ai_system_agents entry to copy. Its settings and its instruction text — as a new instruction of this account — become the new agent's, under any fields the body also sets.
AiAgentVersion
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
ai_agent_idThe agent this is a version of. Fixed by the URL.
versionThe version number — also this resource's id, and the version the agent had.
snapshotThe agent exactly as it stood at this version: every field of the agent resource, except etag.
created_byThe user whose write produced this version, as users/{user}.
AiAgentVersionUpdate
AiConnection
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
providerThe AI provider this connection reaches, by the platform's name for it. Set on create and fixed afterwards: a stored key belongs to exactly one provider.
modeBYOK — your own provider API key, used without touching your AI balance — or MANAGED, the platform's key, charged to the balance. Fixed after create.
display_nameThe label that tells this connection apart in a list, such as Production key. Free text.
key_hintThe last four characters of the stored key — the only part of it any response carries, so that two keys can be told apart. Absent on a MANAGED connection, which has no key of its own.
is_enabledWhether runs may use this connection. Switch it off to stop a key being used without deleting it — and to turn managed access off for the account, since a MANAGED connection cannot be deleted.
priorityThe order connections are tried in when an agent may use more than one: lower goes first. Your keys start at 0 and the managed connection at 100, so a key you add is used before your balance is.
statusWhat the platform last learned about the key: UNVERIFIED until it is checked, then VALID or INVALID — moved by :verify, and by a run the provider refused for the key's sake. EXPIRED is reserved for providers that report it. Always UNVERIFIED on a MANAGED connection, which has no key of its own to learn anything about.
last_verify_timeWhen status was last decided by asking the provider (RFC 3339, UTC); cleared when the key is replaced, and absent on a MANAGED connection. Sort by it together with a provider filter — that is the pair an index backs.
AiConnectionCreate
display_nameThe label that tells this connection apart in a list, such as Production key. Free text.
providerThe AI provider this connection reaches, by the platform's name for it. Set on create and fixed afterwards: a stored key belongs to exactly one provider.
modeBYOK — your own provider API key, used without touching your AI balance — or MANAGED, the platform's key, charged to the balance. Fixed after create.
api_keyThe provider API key. Required when creating a BYOK connection and refused on MANAGED; send it on Update to replace the stored key. It is encrypted before it is stored and no call ever returns it — key_hint is all that comes back.
is_enabledWhether runs may use this connection. Switch it off to stop a key being used without deleting it — and to turn managed access off for the account, since a MANAGED connection cannot be deleted.
priorityThe order connections are tried in when an agent may use more than one: lower goes first. Your keys start at 0 and the managed connection at 100, so a key you add is used before your balance is.
AiConnectionUpdate
display_nameThe label that tells this connection apart in a list, such as Production key. Free text.
api_keyThe provider API key. Required when creating a BYOK connection and refused on MANAGED; send it on Update to replace the stored key. It is encrypted before it is stored and no call ever returns it — key_hint is all that comes back.
is_enabledWhether runs may use this connection. Switch it off to stop a key being used without deleting it — and to turn managed access off for the account, since a MANAGED connection cannot be deleted.
priorityThe order connections are tried in when an agent may use more than one: lower goes first. Your keys start at 0 and the managed connection at 100, so a key you add is used before your balance is.
AiExecution
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
agent_idThe id of the account's ai_agents entry this run executes. Set on create and fixed afterwards.
agent_versionThe version of the agent this run uses, resolved when the run was created. Its settings are kept under the agent's versions, so the run can be reproduced after the agent changes.
instruction_versionThe version of the agent's instruction whose text this run uses, resolved when the run was created.
model_idThe ai_models entry the run uses. Leave it out to use the agent's preferred_model_id; when the agent lists allowed_model_ids, only those can be named.
providerThe AI provider of the run's model, by the platform's name for it.
inputWhat the run works on: variables, an object filling every {{variable}} the instruction uses (strings, integers or booleans), and optionally text — material for the instruction to act on, such as a page to translate.
stateQUEUED, RUNNING, then SUCCEEDED, FAILED, CANCELLED or EXPIRED. A retryable failure puts the run back to QUEUED until its attempts run out.
connection_idThe ai_connections entry the latest attempt was authorized through. Absent until an attempt was routed.
connection_modeWhose key the latest attempt used: BYOK (the account's own) or MANAGED (the platform's, paid from the AI balance).
usageWhat the run consumed, summed over every attempt that reported it: input_tokens, output_tokens, cache_read_input_tokens, cache_creation_input_tokens, and for an IMAGE run image_count and megapixels_milli (thousandths of a megapixel).
costWhat the run was charged to the AI balance, summed over its attempts, as Money. Present once an attempt on the platform's key (MANAGED) was charged; a run on the account's own key has no cost here, because the provider bills the account directly.
outputThe result of a SUCCEEDED run: text, or json for an agent with output_format JSON, or artifacts for an IMAGE agent — each with its storage_key, mime_type, width, height and byte_size, the bytes living in the platform's store — and output_truncated, true when a text answer stopped at max_tokens.
errorWhy a FAILED or EXPIRED run stopped, in the same shape as an API error: code, status, message and, where there is one, a PRECONDITION_FAILURE whose type says why.
attemptsEvery attempt, in order: number, start_time, end_time, http_status (0 when no response arrived), error_code, message, and usage when the attempt's usage is known.
source_moduleWho started the run, in the caller's own words — editorial, import. Stored and filterable, never interpreted. Fixed after create.
source_idThe caller's own reference for what the run is for, within source_module, which it requires. Filter by it together with source_module.
metadataAny other correlation the caller wants back with the run, as an object of at most 16 KB. Returned as sent; not filterable.
expire_timeA deadline for starting: a run not started by then becomes EXPIRED without calling the provider (RFC 3339, UTC). Sort by it together with a state filter.
start_timeWhen the first attempt started (RFC 3339, UTC).
end_timeWhen the run reached the state it is in, if that state is final (RFC 3339, UTC).
AiExecutionCreate
agent_idThe id of the account's ai_agents entry this run executes. Set on create and fixed afterwards.
inputWhat the run works on: variables, an object filling every {{variable}} the instruction uses (strings, integers or booleans), and optionally text — material for the instruction to act on, such as a page to translate.
model_idThe ai_models entry the run uses. Leave it out to use the agent's preferred_model_id; when the agent lists allowed_model_ids, only those can be named.
source_moduleWho started the run, in the caller's own words — editorial, import. Stored and filterable, never interpreted. Fixed after create.
source_idThe caller's own reference for what the run is for, within source_module, which it requires. Filter by it together with source_module.
metadataAny other correlation the caller wants back with the run, as an object of at most 16 KB. Returned as sent; not filterable.
expire_timeA deadline for starting: a run not started by then becomes EXPIRED without calling the provider (RFC 3339, UTC). Sort by it together with a state filter.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used returns the run that key created instead of starting another.
AiExecutionUpdate
agent_idThe id of the account's ai_agents entry this run executes. Set on create and fixed afterwards.
model_idThe ai_models entry the run uses. Leave it out to use the agent's preferred_model_id; when the agent lists allowed_model_ids, only those can be named.
inputWhat the run works on: variables, an object filling every {{variable}} the instruction uses (strings, integers or booleans), and optionally text — material for the instruction to act on, such as a page to translate.
source_moduleWho started the run, in the caller's own words — editorial, import. Stored and filterable, never interpreted. Fixed after create.
source_idThe caller's own reference for what the run is for, within source_module, which it requires. Filter by it together with source_module.
metadataAny other correlation the caller wants back with the run, as an object of at most 16 KB. Returned as sent; not filterable.
expire_timeA deadline for starting: a run not started by then becomes EXPIRED without calling the provider (RFC 3339, UTC). Sort by it together with a state filter.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used returns the run that key created instead of starting another.
AiInstruction
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe label that tells this instruction apart in a list. Free text.
descriptionWhat the instruction is for, for the people who maintain it.
variablesThe variable names the text may reference as {{name}}: lower-case letters, digits and _. A version that references a name not listed here is refused, and so is a run that supplies one — or leaves a referenced one out.
active_versionThe version a run uses unless its agent pins another. The first version becomes active by itself; after that, set this field to switch. Absent until a version exists.
AiInstructionCreate
display_nameThe label that tells this instruction apart in a list. Free text.
descriptionWhat the instruction is for, for the people who maintain it.
variablesThe variable names the text may reference as {{name}}: lower-case letters, digits and _. A version that references a name not listed here is refused, and so is a run that supplies one — or leaves a referenced one out.
active_versionThe version a run uses unless its agent pins another. The first version becomes active by itself; after that, set this field to switch. Absent until a version exists.
AiInstructionUpdate
display_nameThe label that tells this instruction apart in a list. Free text.
descriptionWhat the instruction is for, for the people who maintain it.
variablesThe variable names the text may reference as {{name}}: lower-case letters, digits and _. A version that references a name not listed here is refused, and so is a run that supplies one — or leaves a referenced one out.
active_versionThe version a run uses unless its agent pins another. The first version becomes active by itself; after that, set this field to switch. Absent until a version exists.
AiInstructionVersion
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
ai_instruction_idThe instruction this is a version of. Fixed by the URL.
versionThe version number — also this resource's id. Assigned by the server: one more than the instruction's latest.
contentThe template text. {{name}} is replaced by the run's value for name, which must be one of the instruction's variables; any other text, other braces included, is sent as written.
notesWhy this version exists — the one thing a comparison of two texts cannot tell you.
created_byThe user who wrote this version, as users/{user}.
AiInstructionVersionCreate
contentThe template text. {{name}} is replaced by the run's value for name, which must be one of the instruction's variables; any other text, other braces included, is sent as written.
notesWhy this version exists — the one thing a comparison of two texts cannot tell you.
AiInstructionVersionUpdate
contentThe template text. {{name}} is replaced by the run's value for name, which must be one of the instruction's variables; any other text, other braces included, is sent as written.
notesWhy this version exists — the one thing a comparison of two texts cannot tell you.
AiModel
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
providerThe provider that serves this model, by the platform's name for it.
external_idThe provider's own identifier for the model — what a run sends it. It can move to a newer snapshot of the model while id, the name agents store, stays the same.
display_nameThe model's name as a person reads it, for a picker.
capabilitiesWhat the model can do. TEXT_GENERATION to run a text agent at all; STRUCTURED_OUTPUT to run an agent whose output_format is JSON; EFFORT to accept an agent's effort; IMAGE_GENERATION to run an IMAGE agent; VISION and TOOL_CALLING are listed for later use.
max_input_tokensThe largest prompt the model accepts, in tokens.
max_output_tokensThe largest max_tokens an agent may set and still run on this model.
stateAVAILABLE models run. DEPRECATED and DISABLED ones do not, and an agent cannot be pointed at one — the platform takes a model out of service with this field, without a release.
tierA rough place on the speed-to-capability scale: FAST, BALANCED or POWERFUL.
platform_pricedWhether the platform has a price for what this model does — for an IMAGE_GENERATION model, a price for pictures in the unit its provider bills them by (per picture, or by tokens) — so a run on the platform's key can be charged. When it is false, a run on the platform's key is refused with MODEL_NOT_PRICED, and the model runs only on the account's own connection to its provider.
AiSystemAgent
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe agent's name as a person reads it.
descriptionWhat the agent is for, in a sentence or two.
instruction_textThe agent's prompt template, with {{variable}} references. A copy of the agent starts from this text as version 1 of its own instruction.
instruction_versionWhich revision of instruction_text this is; it rises whenever the platform changes the text.
variablesThe variable names instruction_text references — the values a run of this agent is given.
preferred_model_idThe model a run uses when it does not name one.
allowed_model_idsThe only models a run may name; empty means any available model.
allowed_toolsTools the model may call. Always empty: tool calling is not available yet.
max_tokensThe most tokens one run may write.
effortHow hard the model is asked to think: LOW to MAX. Absent means the model's own default.
output_formatTEXT, JSON constrained by output_schema, or IMAGE — a picture of image_width by image_height.
output_schemaThe JSON Schema a JSON agent's answer follows. Present only when output_format is JSON.
image_widthThe width of the picture an IMAGE template asks for, in pixels. Present only on an IMAGE template.
image_heightThe height of the picture an IMAGE template asks for, in pixels. Present only on an IMAGE template.
connection_modeWhich connections a run may be paid through: ANY, BYOK_ONLY or MANAGED_ONLY.
max_attemptsHow many times a run is tried when the provider fails in a way worth retrying.
timeoutHow long one call to the provider may take, as a duration in seconds.
is_enabledWhether the platform offers this agent. One that is switched off cannot be copied.
AiSystemAgentUpdate
AnalyticsMetric
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe metric's name as a person reads it, for a widget's title or a picker.
descriptionWhat the number means and — just as importantly — what it leaves out, in a sentence or two a widget can show as help text.
unitWhat the number is measured in. COUNT is the only unit today; it is an enum because response times and rates are the next metrics and they are not counts.
kindEXACT for a counter, ESTIMATED for a number computed from a sketch. Everything ESTIMATED answers approximate: true on :query, and is accurate to about 1.6 %.
supported_intervalsThe steps :query can return a series in: MINUTE, HOUR, DAY. Empty means the metric is a single number and its answer carries no points at all.
supported_periodsThe windows :query accepts: TODAY, LAST_7_DAYS, LAST_30_DAYS, CUSTOM. Empty means the metric measures its own window ending now and takes no period.
default_intervalThe step :query returns when the caller names no interval — except for TODAY, which steps by HOUR so that today is a shape rather than one bar. Absent on a metric with no series.
rolling_windowFor a live metric, the window it always measures, as a duration in seconds (300s). Absent on every metric that takes a period instead.
AnalyticsMetricUpdate
BlogAuthor
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the author is shown on the site. It is one of the two fields a view cannot override, so an author is hidden everywhere or nowhere.
bioThe short biography rendered under the byline and on the author's own page.
avatar_media_idThe media resource used as the author's portrait.
audienceWho the author's own page is for, with the values of a post's audience. It hides the author's page, their place in the author list and their byline from other readers; the posts they wrote stay as visible as they are, shown without the byline.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogAuthorCreate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the author is shown on the site. It is one of the two fields a view cannot override, so an author is hidden everywhere or nowhere.
bioThe short biography rendered under the byline and on the author's own page.
avatar_media_idThe media resource used as the author's portrait.
audienceWho the author's own page is for, with the values of a post's audience. It hides the author's page, their place in the author list and their byline from other readers; the posts they wrote stay as visible as they are, shown without the byline.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogAuthorUpdate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the author is shown on the site. It is one of the two fields a view cannot override, so an author is hidden everywhere or nowhere.
bioThe short biography rendered under the byline and on the author's own page.
avatar_media_idThe media resource used as the author's portrait.
audienceWho the author's own page is for, with the values of a post's audience. It hides the author's page, their place in the author list and their byline from other readers; the posts they wrote stay as visible as they are, shown without the byline.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogAuthorView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
blog_author_idThe resource this overlay belongs to. Fixed by the URL — an overlay cannot change master.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
bioThis view's biography for the author.
slugThis view's URL segment for the author's page.
BlogAuthorViewCreate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
bioThis view's biography for the author.
slugThis view's URL segment for the author's page.
BlogAuthorViewUpdate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
bioThis view's biography for the author.
slugThis view's URL segment for the author's page.
BlogCategory
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
parent_idThe category this one hangs under; empty at the root. Settable on create and immutable afterwards — moving a category is :move, which recomputes the whole subtree.
pathThe category's position in the tree: the ids of its ancestors and its own, in order. Sorting by it is what renders a whole tree in one page.
url_pathThe category's full URL path on the live site — its own slug behind the slugs of its ancestors.
levelHow deep the category sits, counting the root as 0. Server-maintained, like the rest of the tree bookkeeping.
sort_orderThe category's position among its siblings. Set by :move, never by a write.
descriptionThe blurb rendered on the category's own page.
is_activeWhether the category is shown. Hiding one hides its whole subtree on the site.
visible_view_idsThe views this category appears in. Empty means every view, not none.
audienceWho the category is for, with the values of a post's audience. It narrows the whole subtree: a subcategory, and every post in the category or below it, reaches only readers this category is for too — the strictest audience on the way up wins. A category not everybody may read is left out of the sitemap, the menus of anonymous visitors and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogCategoryCreate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the category is shown. Hiding one hides its whole subtree on the site.
parent_idThe category this one hangs under; empty at the root. Settable on create and immutable afterwards — moving a category is :move, which recomputes the whole subtree.
descriptionThe blurb rendered on the category's own page.
visible_view_idsThe views this category appears in. Empty means every view, not none.
audienceWho the category is for, with the values of a post's audience. It narrows the whole subtree: a subcategory, and every post in the category or below it, reaches only readers this category is for too — the strictest audience on the way up wins. A category not everybody may read is left out of the sitemap, the menus of anonymous visitors and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogCategoryUpdate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
descriptionThe blurb rendered on the category's own page.
is_activeWhether the category is shown. Hiding one hides its whole subtree on the site.
visible_view_idsThe views this category appears in. Empty means every view, not none.
audienceWho the category is for, with the values of a post's audience. It narrows the whole subtree: a subcategory, and every post in the category or below it, reaches only readers this category is for too — the strictest audience on the way up wins. A category not everybody may read is left out of the sitemap, the menus of anonymous visitors and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogCategoryView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
blog_category_idThe resource this overlay belongs to. Fixed by the URL — an overlay cannot change master.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
descriptionThis view's blurb for the category.
slugThis view's URL segment for the category, so a translated section gets a translated URL.
BlogCategoryViewCreate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
descriptionThis view's blurb for the category.
slugThis view's URL segment for the category, so a translated section gets a translated URL.
BlogCategoryViewUpdate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
descriptionThis view's blurb for the category.
slugThis view's URL segment for the category, so a translated section gets a translated URL.
BlogPost
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
titleThe post's headline, and the label the admin lists it under.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the post is published. Together with publish_time it decides what the live blog shows: an inactive post is never rendered, however old its publish time.
author_idThe blog_authors resource shown as the byline.
excerptThe short teaser used in listings and cards. Plain text, not the first paragraph of content.
contentThe post body as rich-text HTML, with entity:// links resolved per view when the page is rendered.
featured_image_media_idThe media resource used as the post's lead image, in listings and as the social-card picture.
publish_timeWhen the post is dated on the site. A time in the future keeps it out of the live blog until then, which is how a post is scheduled.
meta_titleThe <title> of the rendered post. Falls back to title when empty.
meta_descriptionThe meta description of the rendered post.
meta_keywordsThe meta keywords of the rendered post.
visible_view_idsThe views this post appears in. Empty means every view, not none.
audienceWho the post is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A reader sees the post only if it is for them and so is every category it is in, with each category's ancestors: the strictest wins. A post not everybody may read is left out of the sitemap, the feeds, the site search, the public API and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
category_idsThe categories this post belongs to. Filled in on a read of one post and on a write; a List leaves it out, because membership is a join and a page of posts would be a page of joins.
tag_idsThe tags on this post, with the same read rule as category_ids.
BlogPostCreate
titleThe post's headline, and the label the admin lists it under.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the post is published. Together with publish_time it decides what the live blog shows: an inactive post is never rendered, however old its publish time.
author_idThe blog_authors resource shown as the byline.
excerptThe short teaser used in listings and cards. Plain text, not the first paragraph of content.
contentThe post body as rich-text HTML, with entity:// links resolved per view when the page is rendered.
featured_image_media_idThe media resource used as the post's lead image, in listings and as the social-card picture.
publish_timeWhen the post is dated on the site. A time in the future keeps it out of the live blog until then, which is how a post is scheduled.
meta_titleThe <title> of the rendered post. Falls back to title when empty.
meta_descriptionThe meta description of the rendered post.
meta_keywordsThe meta keywords of the rendered post.
visible_view_idsThe views this post appears in. Empty means every view, not none.
audienceWho the post is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A reader sees the post only if it is for them and so is every category it is in, with each category's ancestors: the strictest wins. A post not everybody may read is left out of the sitemap, the feeds, the site search, the public API and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
category_idsThe categories this post belongs to. Filled in on a read of one post and on a write; a List leaves it out, because membership is a join and a page of posts would be a page of joins.
tag_idsThe tags on this post, with the same read rule as category_ids.
BlogPostUpdate
titleThe post's headline, and the label the admin lists it under.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
is_activeWhether the post is published. Together with publish_time it decides what the live blog shows: an inactive post is never rendered, however old its publish time.
author_idThe blog_authors resource shown as the byline.
excerptThe short teaser used in listings and cards. Plain text, not the first paragraph of content.
contentThe post body as rich-text HTML, with entity:// links resolved per view when the page is rendered.
featured_image_media_idThe media resource used as the post's lead image, in listings and as the social-card picture.
publish_timeWhen the post is dated on the site. A time in the future keeps it out of the live blog until then, which is how a post is scheduled.
meta_titleThe <title> of the rendered post. Falls back to title when empty.
meta_descriptionThe meta description of the rendered post.
meta_keywordsThe meta keywords of the rendered post.
visible_view_idsThe views this post appears in. Empty means every view, not none.
audienceWho the post is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A reader sees the post only if it is for them and so is every category it is in, with each category's ancestors: the strictest wins. A post not everybody may read is left out of the sitemap, the feeds, the site search, the public API and every cached copy of the blog.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
category_idsThe categories this post belongs to. Filled in on a read of one post and on a write; a List leaves it out, because membership is a join and a page of posts would be a page of joins.
tag_idsThe tags on this post, with the same read rule as category_ids.
BlogPostView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
blog_post_idThe resource this overlay belongs to. Fixed by the URL — an overlay cannot change master.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
titleThis view's headline for the post.
slugThis view's URL segment for the post.
excerptThis view's teaser for the post.
contentThis view's rich-text body for the post.
meta_titleThis view's <title> for the post.
meta_descriptionThis view's meta description for the post.
meta_keywordsThis view's meta keywords for the post.
featured_image_media_idThis view's lead image for the post, for a picture carrying text that has to be translated too.
BlogPostViewCreate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
titleThis view's headline for the post.
slugThis view's URL segment for the post.
excerptThis view's teaser for the post.
contentThis view's rich-text body for the post.
meta_titleThis view's <title> for the post.
meta_descriptionThis view's meta description for the post.
meta_keywordsThis view's meta keywords for the post.
featured_image_media_idThis view's lead image for the post, for a picture carrying text that has to be translated too.
BlogPostViewUpdate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
titleThis view's headline for the post.
slugThis view's URL segment for the post.
excerptThis view's teaser for the post.
contentThis view's rich-text body for the post.
meta_titleThis view's <title> for the post.
meta_descriptionThis view's meta description for the post.
meta_keywordsThis view's meta keywords for the post.
featured_image_media_idThis view's lead image for the post, for a picture carrying text that has to be translated too.
BlogTag
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
audienceWho the tag's own page is for, with the values of a post's audience. It hides the tag's archive and the tag itself on shared surfaces — the tag list, a post's tag chips — from other readers; it never hides a post that carries the tag.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogTagCreate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
audienceWho the tag's own page is for, with the values of a post's audience. It hides the tag's archive and the tag itself on shared surfaces — the tag list, a post's tag chips — from other readers; it never hides a post that carries the tag.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogTagUpdate
display_nameThe name this is shown under, on the site and in the admin.
slugThe URL segment this is addressed by on the live site. Unique among its siblings, and a view may override it so a translated page gets a translated URL.
audienceWho the tag's own page is for, with the values of a post's audience. It hides the tag's archive and the tag itself on shared surfaces — the tag list, a post's tag chips — from other readers; it never hides a post that carries the tag.
customer_group_idsThe customer_groups of the website a GROUPS audience is for — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
BlogTagView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
blog_tag_idThe resource this overlay belongs to. Fixed by the URL — an overlay cannot change master.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
slugThis view's URL segment for the tag.
BlogTagViewCreate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
slugThis view's URL segment for the tag.
BlogTagViewUpdate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty value with the field absent from this list means "use the master", not "show nothing".
display_nameThis view's name for the resource.
slugThis view's URL segment for the tag.
CmsBlock
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
titleThe block's label in the admin. Never rendered on the site — the block is its content.
identifierThe handle a page, a theme or a smart link pulls this block in by. Unique per website, and the one field worth keeping stable.
is_activeWhether the block renders. An inactive block is left out wherever it is referenced.
contentThe fragment itself, as rich-text HTML.
CmsBlockCreate
titleThe block's label in the admin. Never rendered on the site — the block is its content.
identifierThe handle a page, a theme or a smart link pulls this block in by. Unique per website, and the one field worth keeping stable.
is_activeWhether the block renders. An inactive block is left out wherever it is referenced.
contentThe fragment itself, as rich-text HTML.
CmsBlockUpdate
titleThe block's label in the admin. Never rendered on the site — the block is its content.
identifierThe handle a page, a theme or a smart link pulls this block in by. Unique per website, and the one field worth keeping stable.
is_activeWhether the block renders. An inactive block is left out wherever it is referenced.
contentThe fragment itself, as rich-text HTML.
CmsBlockView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
cms_block_idThe block this overlay belongs to. Fixed by the URL.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides — here, at most content. A field not listed falls back to the block.
contentThis view's rich-text body for the block.
CmsBlockViewCreate
overriddenThe names of the fields this view actually overrides — here, at most content. A field not listed falls back to the block.
contentThis view's rich-text body for the block.
CmsBlockViewUpdate
overriddenThe names of the fields this view actually overrides — here, at most content. A field not listed falls back to the block.
contentThis view's rich-text body for the block.
CmsPageGroupVersion
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
cms_page_idThe page this is a version of. Fixed by the URL.
customer_group_idThe customer group this version is for — a group of the same website, one version per group on a page. Required on create and fixed afterwards.
overriddenThe names of the page fields this version replaces, out of title, content, meta_title, meta_description, meta_keywords, background_media_id and background_position. A field not listed here is the page's own.
titleThe group's title for the page. Not blank while title is overridden.
contentThe group's rich-text body for the page.
meta_titleThe group's <title> for the page.
meta_descriptionThe group's meta description for the page.
meta_keywordsThe group's meta keywords for the page.
background_media_idThe group's hero image for the page.
background_positionThe group's anchor for the hero image.
CmsPageGroupVersionCreate
customer_group_idThe customer group this version is for — a group of the same website, one version per group on a page. Required on create and fixed afterwards.
overriddenThe names of the page fields this version replaces, out of title, content, meta_title, meta_description, meta_keywords, background_media_id and background_position. A field not listed here is the page's own.
titleThe group's title for the page. Not blank while title is overridden.
contentThe group's rich-text body for the page.
meta_titleThe group's <title> for the page.
meta_descriptionThe group's meta description for the page.
meta_keywordsThe group's meta keywords for the page.
background_media_idThe group's hero image for the page.
background_positionThe group's anchor for the hero image.
CmsPageGroupVersionUpdate
overriddenThe names of the page fields this version replaces, out of title, content, meta_title, meta_description, meta_keywords, background_media_id and background_position. A field not listed here is the page's own.
titleThe group's title for the page. Not blank while title is overridden.
contentThe group's rich-text body for the page.
meta_titleThe group's <title> for the page.
meta_descriptionThe group's meta description for the page.
meta_keywordsThe group's meta keywords for the page.
background_media_idThe group's hero image for the page.
background_positionThe group's anchor for the hero image.
CmsPage
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
titleThe page's heading, and the label the admin lists it under.
url_keyThe page's slug — the last segment of its URL on the live site. Unique per view.
is_activeWhether the page is published. An inactive page stays in the admin and 404s on the site.
meta_titleThe <title> of the rendered page. Falls back to title when empty.
meta_descriptionThe <meta name="description"> of the rendered page, and what a search engine usually shows under the link.
meta_keywordsThe <meta name="keywords"> of the rendered page. Kept for sites that still fill it in.
contentThe page body as rich-text HTML. Links to other resources may be written as entity:// URLs, which the renderer resolves to the right URL for the view it is rendering.
background_media_idThe media resource used as the page's hero image. Empty means the theme decides.
background_positionWhere the hero image is anchored when it is cropped to the banner — a CSS background-position value such as center top.
visible_view_idsThe views this page appears in. Empty means every view, not none — a page is visible everywhere until it is restricted.
audienceWho the page is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A page that is not PUBLIC is left out of the sitemap, the site search, the public API and every cached copy of the site, and is rendered only for a visitor it is for.
customer_group_idsThe customer_groups of the website a GROUPS page is shown to — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
view_idDeprecated. Pages used to be duplicated per view; a page is now one master resource with an overlay per view, so this is empty on everything written since. Use views and visible_view_ids.
canonical_idDeprecated companion of view_id: which master a duplicated legacy page belonged to.
CmsPageCreate
titleThe page's heading, and the label the admin lists it under.
url_keyThe page's slug — the last segment of its URL on the live site. Unique per view.
is_activeWhether the page is published. An inactive page stays in the admin and 404s on the site.
meta_titleThe <title> of the rendered page. Falls back to title when empty.
meta_descriptionThe <meta name="description"> of the rendered page, and what a search engine usually shows under the link.
meta_keywordsThe <meta name="keywords"> of the rendered page. Kept for sites that still fill it in.
contentThe page body as rich-text HTML. Links to other resources may be written as entity:// URLs, which the renderer resolves to the right URL for the view it is rendering.
background_media_idThe media resource used as the page's hero image. Empty means the theme decides.
background_positionWhere the hero image is anchored when it is cropped to the banner — a CSS background-position value such as center top.
visible_view_idsThe views this page appears in. Empty means every view, not none — a page is visible everywhere until it is restricted.
audienceWho the page is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A page that is not PUBLIC is left out of the sitemap, the site search, the public API and every cached copy of the site, and is rendered only for a visitor it is for.
customer_group_idsThe customer_groups of the website a GROUPS page is shown to — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
CmsPageUpdate
titleThe page's heading, and the label the admin lists it under.
url_keyThe page's slug — the last segment of its URL on the live site. Unique per view.
is_activeWhether the page is published. An inactive page stays in the admin and 404s on the site.
meta_titleThe <title> of the rendered page. Falls back to title when empty.
meta_descriptionThe <meta name="description"> of the rendered page, and what a search engine usually shows under the link.
meta_keywordsThe <meta name="keywords"> of the rendered page. Kept for sites that still fill it in.
contentThe page body as rich-text HTML. Links to other resources may be written as entity:// URLs, which the renderer resolves to the right URL for the view it is rendering.
background_media_idThe media resource used as the page's hero image. Empty means the theme decides.
background_positionWhere the hero image is anchored when it is cropped to the banner — a CSS background-position value such as center top.
visible_view_idsThe views this page appears in. Empty means every view, not none — a page is visible everywhere until it is restricted.
audienceWho the page is for. PUBLIC — everybody, the default. AUTHENTICATED — the website's signed-in customers. GROUPS — the customers in at least one of customer_group_ids. A page that is not PUBLIC is left out of the sitemap, the site search, the public API and every cached copy of the site, and is rendered only for a visitor it is for.
customer_group_idsThe customer_groups of the website a GROUPS page is shown to — at least one, at most 100. Empty for any other audience: setting the audience to anything else empties it, and a deleted group drops out of it on its own.
CmsPageView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
cms_page_idThe page this overlay belongs to. Fixed by the URL — an overlay cannot change master.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty string in title with title absent from this list is "use the master", not "show nothing".
titleThis view's title for the page.
url_keyThis view's slug for the page, so a translated page can have a translated URL.
contentThis view's rich-text body for the page.
meta_titleThis view's <title> for the page.
meta_descriptionThis view's meta description for the page.
meta_keywordsThis view's meta keywords for the page.
background_media_idThis view's hero image for the page.
background_positionThis view's anchor for the hero image.
CmsPageViewCreate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty string in title with title absent from this list is "use the master", not "show nothing".
titleThis view's title for the page.
url_keyThis view's slug for the page, so a translated page can have a translated URL.
contentThis view's rich-text body for the page.
meta_titleThis view's <title> for the page.
meta_descriptionThis view's meta description for the page.
meta_keywordsThis view's meta keywords for the page.
background_media_idThis view's hero image for the page.
background_positionThis view's anchor for the hero image.
CmsPageViewUpdate
overriddenThe names of the fields this view actually overrides. A field counts as overridden only while it is listed here — an empty string in title with title absent from this list is "use the master", not "show nothing".
titleThis view's title for the page.
url_keyThis view's slug for the page, so a translated page can have a translated URL.
contentThis view's rich-text body for the page.
meta_titleThis view's <title> for the page.
meta_descriptionThis view's meta description for the page.
meta_keywordsThis view's meta keywords for the page.
background_media_idThis view's hero image for the page.
background_positionThis view's anchor for the hero image.
CustomerAttributeGroup
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe section's heading, shown wherever labels has none for the locale. Not blank, at most 255 characters.
labelsThe heading in other languages: an object from a locale (de, pt-BR) to the heading in it, each at most 255 characters. Replaced whole when sent.
sort_orderWhere the section stands among the website's sections: they are shown in ascending sort_order. A new section comes last; :move is the only way to change it.
CustomerAttributeGroupCreate
display_nameThe section's heading, shown wherever labels has none for the locale. Not blank, at most 255 characters.
labelsThe heading in other languages: an object from a locale (de, pt-BR) to the heading in it, each at most 255 characters. Replaced whole when sent.
CustomerAttributeGroupUpdate
display_nameThe section's heading, shown wherever labels has none for the locale. Not blank, at most 255 characters.
labelsThe heading in other languages: an object from a locale (de, pt-BR) to the heading in it, each at most 255 characters. Replaced whole when sent.
CustomerAttribute
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
keyThe name a customer's value is stored under in their attributes, and the name a registration form sends it as: a lowercase letter, then up to 63 lowercase letters, digits and underscores. Unique on the website, and none of a customer's own field names (email, display_name, tags, ...). Required on create and fixed afterwards.
display_nameThe field's label, shown wherever labels has none for the locale. Not blank, at most 255 characters.
labelsThe label in other languages: an object from a locale (de, pt-BR) to the label in it, each at most 255 characters. A locale it leaves out shows display_name. Replaced whole when sent.
descriptionThe hint shown under the field on a form. At most 2000 characters.
typeWhat the field holds, and so which control a form draws: TEXT, TEXTAREA, NUMBER, BOOLEAN, DATE (a YYYY-MM-DD string), SELECT (one of options) or MULTISELECT (any of them). Required on create and fixed afterwards.
optionsThe choices of a SELECT or MULTISELECT field, in the order a form lists them: each {value, display_name, labels}, where value is what a customer's attributes stores and is unique within the field. At least one and at most 100 for those two types, none for the others. Replaced whole when sent.
is_requiredWhether a form refuses to save the customer without a value for it. false when omitted.
show_in_registrationWhether the website's registration form asks for it. false when omitted — the field is then filled in the admin only.
is_activeWhether the field is in use. Switching it off takes it off every form and stops new values being accepted, while the values customers already hold stay readable — the way to retire a field without losing them. true when omitted.
min_lengthThe fewest characters a TEXT or TEXTAREA value may have. Not allowed on other types.
max_lengthThe most characters a TEXT or TEXTAREA value may have — at most 1024 for TEXT and 8192 for TEXTAREA, which is also the limit when it is omitted. Not allowed on other types.
min_valueThe smallest value a NUMBER field accepts. Not allowed on other types.
max_valueThe largest value a NUMBER field accepts. Not allowed on other types.
group_idThe customer_attribute_groups section the admin's customer form shows the field in — an id of a group of the website. Without one the field is in the default section; deleting its group puts it back there.
sort_orderWhere the field stands among the website's fields: lists and forms show them in ascending sort_order. A new field comes last; :move is the only way to change it.
CustomerAttributeCreate
display_nameThe field's label, shown wherever labels has none for the locale. Not blank, at most 255 characters.
keyThe name a customer's value is stored under in their attributes, and the name a registration form sends it as: a lowercase letter, then up to 63 lowercase letters, digits and underscores. Unique on the website, and none of a customer's own field names (email, display_name, tags, ...). Required on create and fixed afterwards.
labelsThe label in other languages: an object from a locale (de, pt-BR) to the label in it, each at most 255 characters. A locale it leaves out shows display_name. Replaced whole when sent.
descriptionThe hint shown under the field on a form. At most 2000 characters.
typeWhat the field holds, and so which control a form draws: TEXT, TEXTAREA, NUMBER, BOOLEAN, DATE (a YYYY-MM-DD string), SELECT (one of options) or MULTISELECT (any of them). Required on create and fixed afterwards.
optionsThe choices of a SELECT or MULTISELECT field, in the order a form lists them: each {value, display_name, labels}, where value is what a customer's attributes stores and is unique within the field. At least one and at most 100 for those two types, none for the others. Replaced whole when sent.
is_requiredWhether a form refuses to save the customer without a value for it. false when omitted.
show_in_registrationWhether the website's registration form asks for it. false when omitted — the field is then filled in the admin only.
is_activeWhether the field is in use. Switching it off takes it off every form and stops new values being accepted, while the values customers already hold stay readable — the way to retire a field without losing them. true when omitted.
min_lengthThe fewest characters a TEXT or TEXTAREA value may have. Not allowed on other types.
max_lengthThe most characters a TEXT or TEXTAREA value may have — at most 1024 for TEXT and 8192 for TEXTAREA, which is also the limit when it is omitted. Not allowed on other types.
min_valueThe smallest value a NUMBER field accepts. Not allowed on other types.
max_valueThe largest value a NUMBER field accepts. Not allowed on other types.
group_idThe customer_attribute_groups section the admin's customer form shows the field in — an id of a group of the website. Without one the field is in the default section; deleting its group puts it back there.
CustomerAttributeUpdate
display_nameThe field's label, shown wherever labels has none for the locale. Not blank, at most 255 characters.
labelsThe label in other languages: an object from a locale (de, pt-BR) to the label in it, each at most 255 characters. A locale it leaves out shows display_name. Replaced whole when sent.
descriptionThe hint shown under the field on a form. At most 2000 characters.
optionsThe choices of a SELECT or MULTISELECT field, in the order a form lists them: each {value, display_name, labels}, where value is what a customer's attributes stores and is unique within the field. At least one and at most 100 for those two types, none for the others. Replaced whole when sent.
is_requiredWhether a form refuses to save the customer without a value for it. false when omitted.
show_in_registrationWhether the website's registration form asks for it. false when omitted — the field is then filled in the admin only.
is_activeWhether the field is in use. Switching it off takes it off every form and stops new values being accepted, while the values customers already hold stay readable — the way to retire a field without losing them. true when omitted.
min_lengthThe fewest characters a TEXT or TEXTAREA value may have. Not allowed on other types.
max_lengthThe most characters a TEXT or TEXTAREA value may have — at most 1024 for TEXT and 8192 for TEXTAREA, which is also the limit when it is omitted. Not allowed on other types.
min_valueThe smallest value a NUMBER field accepts. Not allowed on other types.
max_valueThe largest value a NUMBER field accepts. Not allowed on other types.
group_idThe customer_attribute_groups section the admin's customer form shows the field in — an id of a group of the website. Without one the field is in the default section; deleting its group puts it back there.
CustomerGroup
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe group's name, unique on the website — how the tenant tells groups apart wherever one is picked. Not blank, at most 255 characters.
descriptionWhat the group is for, for the people who manage it. At most 2000 characters.
typeHow the group gets its members: MANUAL — the customers put in it by hand, DYNAMIC — the customers its rule matches. MANUAL when omitted; fixed at creation.
ruleWho is in a DYNAMIC group: a filter over a customer's email, tags and create_time, written like the filter of the customers List — the group holds exactly the customers that List returns for it, and group_ids follows a new rule shortly after it is saved. A rule that does not parse or names another field is refused. Without a rule the group has no members. A MANUAL group has none. At most 2000 characters.
priorityWhich group wins when a customer is in several that each have their own version of a page: the higher number. 0 when omitted.
CustomerGroupCreate
display_nameThe group's name, unique on the website — how the tenant tells groups apart wherever one is picked. Not blank, at most 255 characters.
descriptionWhat the group is for, for the people who manage it. At most 2000 characters.
typeHow the group gets its members: MANUAL — the customers put in it by hand, DYNAMIC — the customers its rule matches. MANUAL when omitted; fixed at creation.
ruleWho is in a DYNAMIC group: a filter over a customer's email, tags and create_time, written like the filter of the customers List — the group holds exactly the customers that List returns for it, and group_ids follows a new rule shortly after it is saved. A rule that does not parse or names another field is refused. Without a rule the group has no members. A MANUAL group has none. At most 2000 characters.
priorityWhich group wins when a customer is in several that each have their own version of a page: the higher number. 0 when omitted.
CustomerGroupUpdate
display_nameThe group's name, unique on the website — how the tenant tells groups apart wherever one is picked. Not blank, at most 255 characters.
descriptionWhat the group is for, for the people who manage it. At most 2000 characters.
ruleWho is in a DYNAMIC group: a filter over a customer's email, tags and create_time, written like the filter of the customers List — the group holds exactly the customers that List returns for it, and group_ids follows a new rule shortly after it is saved. A rule that does not parse or names another field is refused. Without a rule the group has no members. A MANUAL group has none. At most 2000 characters.
priorityWhich group wins when a customer is in several that each have their own version of a page: the higher number. 0 when omitted.
Customer
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
emailThe address the customer signs in to the website with. Unique on the website, compared and stored lowercase with surrounding spaces dropped. Required on create and fixed afterwards.
display_nameThe name the customer is greeted by on the website and listed under in the admin. At most 255 characters.
tagsFree-form labels to segment customers by, each 1 to 64 characters; a repeated one is kept once. filter=tags:"vip" lists the customers carrying a tag.
manual_group_idsThe groups this customer was put in by hand — ids of customer_groups of the website whose type is MANUAL. A deleted group drops out of it on its own.
group_idsEvery group the customer is in: the ones in manual_group_ids and the DYNAMIC ones whose rule they match, derived again whenever the customer is written and whenever such a rule changes. This is the membership the website decides by, and it is maintained by the server.
is_activeWhether the customer may sign in. A new customer is active; switching it off keeps the account but stops its sessions from being renewed.
attributesThe customer's values of the fields the website defines in customer_attributes: an object from a field's key to its value — a string for TEXT, TEXTAREA, SELECT and DATE (YYYY-MM-DD), a number for NUMBER, true or false for BOOLEAN, an array of option values for MULTISELECT. Replaced whole when sent: a field it leaves out, or sends as null, an empty string or an empty array, has no value, and a field with is_required must have one — on create too, where an absent object counts as an empty one. A key the website has no field for, or a value its field does not accept, is refused on attributes.<key>. The value of a field switched off with is_active is kept as it is: sent back unchanged it is accepted, changed it is refused. Deleting a field removes its value from every customer. Omitted when empty.
CustomerCreate
emailThe address the customer signs in to the website with. Unique on the website, compared and stored lowercase with surrounding spaces dropped. Required on create and fixed afterwards.
display_nameThe name the customer is greeted by on the website and listed under in the admin. At most 255 characters.
tagsFree-form labels to segment customers by, each 1 to 64 characters; a repeated one is kept once. filter=tags:"vip" lists the customers carrying a tag.
manual_group_idsThe groups this customer was put in by hand — ids of customer_groups of the website whose type is MANUAL. A deleted group drops out of it on its own.
is_activeWhether the customer may sign in. A new customer is active; switching it off keeps the account but stops its sessions from being renewed.
attributesThe customer's values of the fields the website defines in customer_attributes: an object from a field's key to its value — a string for TEXT, TEXTAREA, SELECT and DATE (YYYY-MM-DD), a number for NUMBER, true or false for BOOLEAN, an array of option values for MULTISELECT. Replaced whole when sent: a field it leaves out, or sends as null, an empty string or an empty array, has no value, and a field with is_required must have one — on create too, where an absent object counts as an empty one. A key the website has no field for, or a value its field does not accept, is refused on attributes.<key>. The value of a field switched off with is_active is kept as it is: sent back unchanged it is accepted, changed it is refused. Deleting a field removes its value from every customer. Omitted when empty.
passwordThe customer's password: at least 8 characters with a letter and a digit. Required on create; on update it sets a new one and signs the customer out of every session. Write-only — never returned.
CustomerUpdate
display_nameThe name the customer is greeted by on the website and listed under in the admin. At most 255 characters.
tagsFree-form labels to segment customers by, each 1 to 64 characters; a repeated one is kept once. filter=tags:"vip" lists the customers carrying a tag.
manual_group_idsThe groups this customer was put in by hand — ids of customer_groups of the website whose type is MANUAL. A deleted group drops out of it on its own.
is_activeWhether the customer may sign in. A new customer is active; switching it off keeps the account but stops its sessions from being renewed.
attributesThe customer's values of the fields the website defines in customer_attributes: an object from a field's key to its value — a string for TEXT, TEXTAREA, SELECT and DATE (YYYY-MM-DD), a number for NUMBER, true or false for BOOLEAN, an array of option values for MULTISELECT. Replaced whole when sent: a field it leaves out, or sends as null, an empty string or an empty array, has no value, and a field with is_required must have one — on create too, where an absent object counts as an empty one. A key the website has no field for, or a value its field does not accept, is refused on attributes.<key>. The value of a field switched off with is_active is kept as it is: sent back unchanged it is accepted, changed it is refused. Deleting a field removes its value from every customer. Omitted when empty.
passwordThe customer's password: at least 8 characters with a letter and a digit. Required on create; on update it sets a new one and signs the customer out of every session. Write-only — never returned.
Dashboard
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
widgetsThe tiles on this dashboard, as a list of {widget_id, type, x, y, width, height, settings}. widget_id is yours to choose and must be unique here; type is a dashboard_widget_types id; the geometry is in a 12-column grid whose rows go on for as long as you need. Sent whole: an Update replaces the layout rather than merging tile by tile.
layout_versionThe shape the stored layout is in. The platform raises it when it migrates a dashboard saved by an older release; a client reads it and never sends it.
is_defaultTrue while nobody has ever saved a dashboard for this website and what you are reading is the platform's default layout. It comes with no etag and no timestamps, because there is nothing to be a version of yet — so the first Update sends no If-Match and every later one does.
DashboardCreate
widgetsThe tiles on this dashboard, as a list of {widget_id, type, x, y, width, height, settings}. widget_id is yours to choose and must be unique here; type is a dashboard_widget_types id; the geometry is in a 12-column grid whose rows go on for as long as you need. Sent whole: an Update replaces the layout rather than merging tile by tile.
DashboardUpdate
widgetsThe tiles on this dashboard, as a list of {widget_id, type, x, y, width, height, settings}. widget_id is yours to choose and must be unique here; type is a dashboard_widget_types id; the geometry is in a 12-column grid whose rows go on for as long as you need. Sent whole: an Update replaces the layout rather than merging tile by tile.
DashboardWidgetType
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe tile's name as a person reads it, for the «add widget» drawer and the tile's own header.
descriptionWhat the tile shows and — where it matters — what its number leaves out, in a sentence or two the drawer and the tile can show as help text.
categoryWhich section of the «add widget» drawer this tile belongs to: ANALYTICS, CONTENT or PLATFORM.
visualizationHow the tile is drawn: KPI (one number with its trend), LINE_CHART, BAR_CHART, or CUSTOM — which means the admin has a renderer of its own for this id.
metric_idFor an analytics tile, the analytics_metrics id it draws — the row whose :query answers its number. Absent on every other tile.
default_size{width, height} in grid cells — the size the tile is added at when somebody picks it out of the drawer.
min_sizeThe smallest {width, height} this tile still reads at. A saved layout below it is INVALID_ARGUMENT, and a resize handle stops here.
max_sizeThe largest {width, height} this tile is worth. It is a range together with min_size, not a list of allowed sizes — a tile that has exactly one size says so by making the two equal.
singleton_per_dashboardTrue for a tile that makes sense at most once on a page — a checklist, a summary of the whole site. A second one is refused on Update rather than drawn twice.
setting_descriptorsWhat this tile can be configured with: {key, display_name, type, default, allowed_values} per setting. It is what the widget's settings drawer is built from and what a saved widget.settings is validated against — a key that is not here, or a value outside allowed_values, is refused.
DashboardWidgetTypeUpdate
EditorialAiPolicy
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
writer_agent_idThe ai_agents entry of this website's account that writes the article — a copy of the platform's mooverapp-article-writer. Without it the AI_GENERATED mode is not ready. Its output contract is checked on every write and again when a run starts.
reviewer_agent_idThe ai_agents entry that scores the finished article — a copy of mooverapp-article-reviewer. Without a reviewer no run reaches PASSED, and auto_publish cannot be switched on.
translator_agent_idThe ai_agents entry that translates the article into the website's other languages — a copy of mooverapp-article-translator. Absent, no translation is made and require_translations is not checked.
topic_agent_idThe ai_agents entry that proposes topics for the backlog — a copy of mooverapp-topic-strategist. Needed for a TOPICS run and for the automatic refill topic_backlog_min switches on.
image_prompt_agent_idThe ai_agents entry that turns the article into a brief for the image model — a copy of the platform's mooverapp-image-prompt-generator. Set together with image_agent_id, or neither.
image_agent_idThe ai_agents entry that draws the cover — a copy of mooverapp-featured-image, an IMAGE agent on an image model. Set together with image_prompt_agent_id, or neither.
site_briefWhat the website is about, in a paragraph the writer and the topic strategist read before every article. At most 4,000 characters.
voiceThe tone the articles are written in — calm and practical, playful, formal. At most 4,000 characters.
audienceWho the articles are for, so the writer pitches vocabulary and depth accordingly. At most 4,000 characters.
article_word_countHow long an article should be, in words of its body. Between 300 and 3000; defaults to 1000. An article far outside the target is flagged by the checks.
banned_phrasesPhrases an article must not contain — a case-insensitive occurrence of any of them is a BLOCKER in the verdict. At most 100, none blank, each at most 200 characters.
review_min_scoreThe reviewer's score, from 0 to 100, an article needs to pass. Defaults to 80. Below it the verdict is NEEDS_REVIEW and a person decides.
max_generations_per_dayHow many runs the desk may start by itself per UTC day, between 1 and 1000; defaults to 20. Runs a person starts do not count. A fuse against a loop, not a budget — the AI balance is the account's.
auto_publishWhether an article whose verdict is PASSED, and which nobody has edited, goes live on its slot's date with no person involved. Off by default; requires a reviewer. Read at the date, so switching it off takes effect at once.
translate_view_idsWhich of this website's views take a translation. Empty — every active view whose locale differs from the site's language. A view in the site's language, or switched off, is never a target. Two views on one locale get one translation and two overlays.
require_translationsWhether PASSED waits for every translation. On by default: a translation that failed or came back in another shape makes the verdict NEEDS_REVIEW. Off, it is listed as a MINOR issue and the article may still go out. Not checked without a translator.
topic_backlog_minThe backlog floor that starts a TOPICS run by itself: when CANDIDATE plus PROPOSED topics fall below it, the desk asks the strategist for a batch — at most once a day, and counted against max_generations_per_day. Between 0 and 100; 0 (the default) switches the refill off. Needs topic_agent_id.
topic_batch_sizeHow many topics one TOPICS run asks for, between 1 and 30; defaults to 10. A run's own topic_count overrides it.
topic_approvalWhat a proposed topic becomes: REQUIRED (the default) — PROPOSED, waiting for :accept before the planner may schedule it; AUTO — CANDIDATE at once, in the backlog like a topic a person wrote.
image_styleThe site's visual style, appended to every image brief — a photographic style, a palette, a mood. At most 2,000 characters.
require_imageWhether PASSED waits for the cover. Off by default: an article whose cover failed is listed with a MINOR issue and may still go out. On, it is NEEDS_REVIEW. Needs the two image agents.
EditorialAiPolicyCreate
writer_agent_idThe ai_agents entry of this website's account that writes the article — a copy of the platform's mooverapp-article-writer. Without it the AI_GENERATED mode is not ready. Its output contract is checked on every write and again when a run starts.
reviewer_agent_idThe ai_agents entry that scores the finished article — a copy of mooverapp-article-reviewer. Without a reviewer no run reaches PASSED, and auto_publish cannot be switched on.
translator_agent_idThe ai_agents entry that translates the article into the website's other languages — a copy of mooverapp-article-translator. Absent, no translation is made and require_translations is not checked.
topic_agent_idThe ai_agents entry that proposes topics for the backlog — a copy of mooverapp-topic-strategist. Needed for a TOPICS run and for the automatic refill topic_backlog_min switches on.
image_prompt_agent_idThe ai_agents entry that turns the article into a brief for the image model — a copy of the platform's mooverapp-image-prompt-generator. Set together with image_agent_id, or neither.
image_agent_idThe ai_agents entry that draws the cover — a copy of mooverapp-featured-image, an IMAGE agent on an image model. Set together with image_prompt_agent_id, or neither.
site_briefWhat the website is about, in a paragraph the writer and the topic strategist read before every article. At most 4,000 characters.
voiceThe tone the articles are written in — calm and practical, playful, formal. At most 4,000 characters.
audienceWho the articles are for, so the writer pitches vocabulary and depth accordingly. At most 4,000 characters.
article_word_countHow long an article should be, in words of its body. Between 300 and 3000; defaults to 1000. An article far outside the target is flagged by the checks.
banned_phrasesPhrases an article must not contain — a case-insensitive occurrence of any of them is a BLOCKER in the verdict. At most 100, none blank, each at most 200 characters.
review_min_scoreThe reviewer's score, from 0 to 100, an article needs to pass. Defaults to 80. Below it the verdict is NEEDS_REVIEW and a person decides.
max_generations_per_dayHow many runs the desk may start by itself per UTC day, between 1 and 1000; defaults to 20. Runs a person starts do not count. A fuse against a loop, not a budget — the AI balance is the account's.
auto_publishWhether an article whose verdict is PASSED, and which nobody has edited, goes live on its slot's date with no person involved. Off by default; requires a reviewer. Read at the date, so switching it off takes effect at once.
translate_view_idsWhich of this website's views take a translation. Empty — every active view whose locale differs from the site's language. A view in the site's language, or switched off, is never a target. Two views on one locale get one translation and two overlays.
require_translationsWhether PASSED waits for every translation. On by default: a translation that failed or came back in another shape makes the verdict NEEDS_REVIEW. Off, it is listed as a MINOR issue and the article may still go out. Not checked without a translator.
topic_backlog_minThe backlog floor that starts a TOPICS run by itself: when CANDIDATE plus PROPOSED topics fall below it, the desk asks the strategist for a batch — at most once a day, and counted against max_generations_per_day. Between 0 and 100; 0 (the default) switches the refill off. Needs topic_agent_id.
topic_batch_sizeHow many topics one TOPICS run asks for, between 1 and 30; defaults to 10. A run's own topic_count overrides it.
topic_approvalWhat a proposed topic becomes: REQUIRED (the default) — PROPOSED, waiting for :accept before the planner may schedule it; AUTO — CANDIDATE at once, in the backlog like a topic a person wrote.
image_styleThe site's visual style, appended to every image brief — a photographic style, a palette, a mood. At most 2,000 characters.
require_imageWhether PASSED waits for the cover. Off by default: an article whose cover failed is listed with a MINOR issue and may still go out. On, it is NEEDS_REVIEW. Needs the two image agents.
EditorialAiPolicyUpdate
writer_agent_idThe ai_agents entry of this website's account that writes the article — a copy of the platform's mooverapp-article-writer. Without it the AI_GENERATED mode is not ready. Its output contract is checked on every write and again when a run starts.
reviewer_agent_idThe ai_agents entry that scores the finished article — a copy of mooverapp-article-reviewer. Without a reviewer no run reaches PASSED, and auto_publish cannot be switched on.
translator_agent_idThe ai_agents entry that translates the article into the website's other languages — a copy of mooverapp-article-translator. Absent, no translation is made and require_translations is not checked.
topic_agent_idThe ai_agents entry that proposes topics for the backlog — a copy of mooverapp-topic-strategist. Needed for a TOPICS run and for the automatic refill topic_backlog_min switches on.
image_prompt_agent_idThe ai_agents entry that turns the article into a brief for the image model — a copy of the platform's mooverapp-image-prompt-generator. Set together with image_agent_id, or neither.
image_agent_idThe ai_agents entry that draws the cover — a copy of mooverapp-featured-image, an IMAGE agent on an image model. Set together with image_prompt_agent_id, or neither.
site_briefWhat the website is about, in a paragraph the writer and the topic strategist read before every article. At most 4,000 characters.
voiceThe tone the articles are written in — calm and practical, playful, formal. At most 4,000 characters.
audienceWho the articles are for, so the writer pitches vocabulary and depth accordingly. At most 4,000 characters.
article_word_countHow long an article should be, in words of its body. Between 300 and 3000; defaults to 1000. An article far outside the target is flagged by the checks.
banned_phrasesPhrases an article must not contain — a case-insensitive occurrence of any of them is a BLOCKER in the verdict. At most 100, none blank, each at most 200 characters.
review_min_scoreThe reviewer's score, from 0 to 100, an article needs to pass. Defaults to 80. Below it the verdict is NEEDS_REVIEW and a person decides.
max_generations_per_dayHow many runs the desk may start by itself per UTC day, between 1 and 1000; defaults to 20. Runs a person starts do not count. A fuse against a loop, not a budget — the AI balance is the account's.
auto_publishWhether an article whose verdict is PASSED, and which nobody has edited, goes live on its slot's date with no person involved. Off by default; requires a reviewer. Read at the date, so switching it off takes effect at once.
translate_view_idsWhich of this website's views take a translation. Empty — every active view whose locale differs from the site's language. A view in the site's language, or switched off, is never a target. Two views on one locale get one translation and two overlays.
require_translationsWhether PASSED waits for every translation. On by default: a translation that failed or came back in another shape makes the verdict NEEDS_REVIEW. Off, it is listed as a MINOR issue and the article may still go out. Not checked without a translator.
topic_backlog_minThe backlog floor that starts a TOPICS run by itself: when CANDIDATE plus PROPOSED topics fall below it, the desk asks the strategist for a batch — at most once a day, and counted against max_generations_per_day. Between 0 and 100; 0 (the default) switches the refill off. Needs topic_agent_id.
topic_batch_sizeHow many topics one TOPICS run asks for, between 1 and 30; defaults to 10. A run's own topic_count overrides it.
topic_approvalWhat a proposed topic becomes: REQUIRED (the default) — PROPOSED, waiting for :accept before the planner may schedule it; AUTO — CANDIDATE at once, in the backlog like a topic a person wrote.
image_styleThe site's visual style, appended to every image brief — a photographic style, a palette, a mood. At most 2,000 characters.
require_imageWhether PASSED waits for the cover. Off by default: an article whose cover failed is listed with a MINOR issue and may still go out. On, it is NEEDS_REVIEW. Needs the two image agents.
EditorialGeneration
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
kindWhat the run produces: ARTICLE — one slot's post, with its translations and cover where the policy names the agents; TOPICS — a batch of proposed topics for the backlog. Fixed after create.
slot_idThe editorial_slots entry the run writes for. Required for an ARTICLE run and refused for a TOPICS run; the slot's content mode must be AI_GENERATED. Fixed after create.
partsWhich parts an ARTICLE run produces: TEXT, TRANSLATIONS, IMAGE. Empty — every part the policy enables, and the translations and the cover only for an article whose text verdict is PASSED. Named explicitly, the parts are produced whatever the verdict. On a drafted slot this is regeneration: the fields a person edited are kept and named on the step, and TEXT may be left out once a run has written the slot's article. Fixed after create.
view_idsThe views a TRANSLATIONS part covers, each one a view the policy would translate into; empty — all of them. Fixed after create.
topic_countHow many topics a TOPICS run asks for, between 1 and 30; defaults to the policy's topic_batch_size. Fixed after create.
image_model_idThe ai_models entry the cover is drawn on for this run, in place of the image agent's preferred_model_id. Only on an ARTICLE run that draws the cover — parts naming IMAGE, or empty on a policy with both image agents; the model must be one the image agent can run on, and is refused with the reason otherwise. Kept by :retry. Fixed after create.
image_notesA person's instructions for the cover of this run, at most 2000 characters. The image brief writer receives them as its notes variable, where its instruction declares one, and the image agent receives them appended to its prompt as they are. Only on a run that draws the cover, like image_model_id. Kept by :retry. Fixed after create.
triggerWho started the run: SCHEDULE — the desk, when the slot came within its writing time or the backlog fell under its floor; MANUAL — a person, through Create. Only SCHEDULE runs count against the policy's daily limit.
pipeline_versionWhich sequence of steps the run follows, fixed when it was created: article-v1 for an article, topics-v1 for topics. A run of a version the platform no longer knows ends FAILED.
stateQUEUED, RUNNING, then SUCCEEDED, FAILED or CANCELLED. The verdict is a separate question: a SUCCEEDED run may say the article needs a person.
stepsEvery step of the pipeline with its state — PENDING, RUNNING, WAITING, SUCCEEDED, FAILED, SKIPPED, CANCELLED — the ai_executions entry behind an agent step, the locale and view_ids of a translation step, why a waiting step waits and until when, its automatic retries, its error, and the skipped_fields a step left to the person who had edited them.
verdictWhat the run's checks, its reviewer and its parts made of the article: result (PASSED or NEEDS_REVIEW), the reviewer's score, and every issue with its code, severity, message, the step it came from and, for a translation, its locale. Present once the checks ran; final when the run is.
articleThe article as the writer produced it and the desk rendered it — the structured document the post's HTML was printed from and the translator received. The run's revision of the text, kept whatever happens to the post.
resultWhere the run was applied. An ARTICLE run: the target_id of the post it wrote, the view_ids it localised, and the media_id of the cover it put in the media library. A TOPICS run: created_topic_ids and duplicates_skipped.
costWhat the run's executions were charged to the AI balance, summed, as Money. Absent while none was charged — a run entirely on the account's own key.
policy_snapshotThe editorial AI policy as it was when the run was created. Editing the policy does not change a run in flight; auto_publish alone is read at the date.
errorWhy a FAILED run stopped, in the same shape as an API error: code, status, message and a PRECONDITION_FAILURE whose type names the reason.
end_timeWhen the run reached a final state (RFC 3339, UTC).
EditorialGenerationCreate
kindWhat the run produces: ARTICLE — one slot's post, with its translations and cover where the policy names the agents; TOPICS — a batch of proposed topics for the backlog. Fixed after create.
slot_idThe editorial_slots entry the run writes for. Required for an ARTICLE run and refused for a TOPICS run; the slot's content mode must be AI_GENERATED. Fixed after create.
partsWhich parts an ARTICLE run produces: TEXT, TRANSLATIONS, IMAGE. Empty — every part the policy enables, and the translations and the cover only for an article whose text verdict is PASSED. Named explicitly, the parts are produced whatever the verdict. On a drafted slot this is regeneration: the fields a person edited are kept and named on the step, and TEXT may be left out once a run has written the slot's article. Fixed after create.
view_idsThe views a TRANSLATIONS part covers, each one a view the policy would translate into; empty — all of them. Fixed after create.
topic_countHow many topics a TOPICS run asks for, between 1 and 30; defaults to the policy's topic_batch_size. Fixed after create.
image_model_idThe ai_models entry the cover is drawn on for this run, in place of the image agent's preferred_model_id. Only on an ARTICLE run that draws the cover — parts naming IMAGE, or empty on a policy with both image agents; the model must be one the image agent can run on, and is refused with the reason otherwise. Kept by :retry. Fixed after create.
image_notesA person's instructions for the cover of this run, at most 2000 characters. The image brief writer receives them as its notes variable, where its instruction declares one, and the image agent receives them appended to its prompt as they are. Only on a run that draws the cover, like image_model_id. Kept by :retry. Fixed after create.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used returns the run that key created instead of starting another.
EditorialGenerationUpdate
kindWhat the run produces: ARTICLE — one slot's post, with its translations and cover where the policy names the agents; TOPICS — a batch of proposed topics for the backlog. Fixed after create.
request_idAn idempotency key you choose, at most 64 characters. Creating with a key already used returns the run that key created instead of starting another.
EditorialPlan
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
enabledWhether the desk is running. While it is false the calendar is not filled, no draft is prepared and nothing wakes up — the plan is kept, not executed.
time_zoneThe IANA zone the schedule's wall-clock times are read in, so "Monday 10:00" stays 10:00 across a daylight-saving change instead of drifting an hour twice a year.
scheduleWhen posts go out, as a list of {"weekday", "time_of_day"} rules. weekday is one of MONDAY…SUNDAY and time_of_day is a local HH:MM. An empty list plans nothing.
planning_horizon_daysHow far ahead the calendar is filled, in days. The window rolls forward on its own, so a plan left alone always has about this much scheduled. Defaults to 30.
draft_lead_daysHow long before its date a slot turns into a draft, in days — the writing time the desk gives itself. Defaults to 3.
target_typeWhat kind of content a slot produces. blog_post is the only kind this platform makes today, and the default; a slot may name a different one of its own.
content_modeWho fills a slot when its date comes near. EMPTY_DRAFT — the default — creates the draft and leaves the writing to a person; other modes are offered by the platform's producers, and a mode this website is not set up for is refused. A slot may override it for one date.
default_category_idsThe blog_categories a fresh draft is filed under when its topic names none of its own.
default_tag_idsThe blog_tags a fresh draft carries when its topic names none of its own.
default_author_idsThe blog_authors a fresh draft is credited to when its topic names no author of its own: one of them, chosen at random for each slot and kept if that slot is drafted again. List one author to credit every such draft to them.
notification_emailsWho the desk writes to about its work, up to 20 addresses. They are stored trimmed and in lower case, without repeats. Left empty, the letters go to the owner of the account.
notification_eventsWhat the desk writes about: TOPICS_PROPOSED — new topics were suggested, ARTICLE_DRAFTED — a draft is ready, ARTICLE_PUBLISHED — an article went live, FAILURE — preparing or publishing an article failed, or the desk is held back. Never set, it is all four. An empty list turns the letters off.
next_tick_timeWhen the desk next looks at this website's calendar. It is the plan's liveness signal: a value in the past on an enabled plan means the schedule stalled and needs waking.
EditorialPlanCreate
enabledWhether the desk is running. While it is false the calendar is not filled, no draft is prepared and nothing wakes up — the plan is kept, not executed.
time_zoneThe IANA zone the schedule's wall-clock times are read in, so "Monday 10:00" stays 10:00 across a daylight-saving change instead of drifting an hour twice a year.
scheduleWhen posts go out, as a list of {"weekday", "time_of_day"} rules. weekday is one of MONDAY…SUNDAY and time_of_day is a local HH:MM. An empty list plans nothing.
planning_horizon_daysHow far ahead the calendar is filled, in days. The window rolls forward on its own, so a plan left alone always has about this much scheduled. Defaults to 30.
draft_lead_daysHow long before its date a slot turns into a draft, in days — the writing time the desk gives itself. Defaults to 3.
target_typeWhat kind of content a slot produces. blog_post is the only kind this platform makes today, and the default; a slot may name a different one of its own.
content_modeWho fills a slot when its date comes near. EMPTY_DRAFT — the default — creates the draft and leaves the writing to a person; other modes are offered by the platform's producers, and a mode this website is not set up for is refused. A slot may override it for one date.
default_category_idsThe blog_categories a fresh draft is filed under when its topic names none of its own.
default_tag_idsThe blog_tags a fresh draft carries when its topic names none of its own.
default_author_idsThe blog_authors a fresh draft is credited to when its topic names no author of its own: one of them, chosen at random for each slot and kept if that slot is drafted again. List one author to credit every such draft to them.
notification_emailsWho the desk writes to about its work, up to 20 addresses. They are stored trimmed and in lower case, without repeats. Left empty, the letters go to the owner of the account.
notification_eventsWhat the desk writes about: TOPICS_PROPOSED — new topics were suggested, ARTICLE_DRAFTED — a draft is ready, ARTICLE_PUBLISHED — an article went live, FAILURE — preparing or publishing an article failed, or the desk is held back. Never set, it is all four. An empty list turns the letters off.
EditorialPlanUpdate
enabledWhether the desk is running. While it is false the calendar is not filled, no draft is prepared and nothing wakes up — the plan is kept, not executed.
time_zoneThe IANA zone the schedule's wall-clock times are read in, so "Monday 10:00" stays 10:00 across a daylight-saving change instead of drifting an hour twice a year.
scheduleWhen posts go out, as a list of {"weekday", "time_of_day"} rules. weekday is one of MONDAY…SUNDAY and time_of_day is a local HH:MM. An empty list plans nothing.
planning_horizon_daysHow far ahead the calendar is filled, in days. The window rolls forward on its own, so a plan left alone always has about this much scheduled. Defaults to 30.
draft_lead_daysHow long before its date a slot turns into a draft, in days — the writing time the desk gives itself. Defaults to 3.
target_typeWhat kind of content a slot produces. blog_post is the only kind this platform makes today, and the default; a slot may name a different one of its own.
content_modeWho fills a slot when its date comes near. EMPTY_DRAFT — the default — creates the draft and leaves the writing to a person; other modes are offered by the platform's producers, and a mode this website is not set up for is refused. A slot may override it for one date.
default_category_idsThe blog_categories a fresh draft is filed under when its topic names none of its own.
default_tag_idsThe blog_tags a fresh draft carries when its topic names none of its own.
default_author_idsThe blog_authors a fresh draft is credited to when its topic names no author of its own: one of them, chosen at random for each slot and kept if that slot is drafted again. List one author to credit every such draft to them.
notification_emailsWho the desk writes to about its work, up to 20 addresses. They are stored trimmed and in lower case, without repeats. Left empty, the letters go to the owner of the account.
notification_eventsWhat the desk writes about: TOPICS_PROPOSED — new topics were suggested, ARTICLE_DRAFTED — a draft is ready, ARTICLE_PUBLISHED — an article went live, FAILURE — preparing or publishing an article failed, or the desk is held back. Never set, it is all four. An empty list turns the letters off.
EditorialSlot
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
scheduled_timeWhen this piece goes out. Unique across the website — one slot per moment — and the order the calendar is read in. Moving a slot is a write of this field, and it takes the slot out of the desk's hands.
topic_idThe editorial_topics resource filling this slot. Empty on a slot someone put on the calendar with a title and no backlog entry.
titleThe headline this slot stands for, copied from its topic when the slot was made. It is a snapshot, so a month of calendar draws without reading every topic — and so a topic renamed later does not rewrite a slot that already produced a draft.
target_typeWhat this slot produces. Defaults to the plan's and cannot be changed afterwards: a slot that switched kind mid-flight would leave its draft behind with nothing pointing at it.
target_idThe blog_posts resource this slot created. It is also what makes preparing a draft safe to repeat — a slot that already names its post never gets a second one.
statusWhere the slot stands: PLANNED before its draft exists, GENERATING while a producer is writing it, DRAFTED once it does, PUBLISHED once that post is live, SKIPPED if the date was dropped, FAILED if preparing the draft did not work. FAILED is retried where the retry is free, and left to you where it is not.
originAUTO while the slot is the desk's to manage, MANUAL once a person created or edited it — after which the desk leaves it alone for good. This is the whole of "a person outranks the schedule".
last_errorWhy the last attempt to prepare this slot's draft did not work. Cleared as soon as one succeeds, so it always describes the present.
content_modeWho fills this one slot, overriding the plan's content_mode for this date alone — "I am writing this Friday myself". Absent, the plan decides. It can be set while the slot is still PLANNED or FAILED, not once its draft exists.
generation_idThe latest editorial_generations run producing this slot's content, when a producer other than a person is writing it. Absent on a slot nobody generated.
review_verdictWhat the producer's own check made of the content: PASSED, or NEEDS_REVIEW when a person should read it before it goes out. A snapshot of the run's verdict, kept here so a month of calendar draws its badges without reading every run.
EditorialSlotCreate
scheduled_timeWhen this piece goes out. Unique across the website — one slot per moment — and the order the calendar is read in. Moving a slot is a write of this field, and it takes the slot out of the desk's hands.
topic_idThe editorial_topics resource filling this slot. Empty on a slot someone put on the calendar with a title and no backlog entry.
titleThe headline this slot stands for, copied from its topic when the slot was made. It is a snapshot, so a month of calendar draws without reading every topic — and so a topic renamed later does not rewrite a slot that already produced a draft.
target_typeWhat this slot produces. Defaults to the plan's and cannot be changed afterwards: a slot that switched kind mid-flight would leave its draft behind with nothing pointing at it.
content_modeWho fills this one slot, overriding the plan's content_mode for this date alone — "I am writing this Friday myself". Absent, the plan decides. It can be set while the slot is still PLANNED or FAILED, not once its draft exists.
EditorialSlotUpdate
scheduled_timeWhen this piece goes out. Unique across the website — one slot per moment — and the order the calendar is read in. Moving a slot is a write of this field, and it takes the slot out of the desk's hands.
topic_idThe editorial_topics resource filling this slot. Empty on a slot someone put on the calendar with a title and no backlog entry.
titleThe headline this slot stands for, copied from its topic when the slot was made. It is a snapshot, so a month of calendar draws without reading every topic — and so a topic renamed later does not rewrite a slot that already produced a draft.
content_modeWho fills this one slot, overriding the plan's content_mode for this date alone — "I am writing this Friday myself". Absent, the plan decides. It can be set while the slot is still PLANNED or FAILED, not once its draft exists.
EditorialTopic
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
titleWhat the article is about, in a line. It becomes the headline of the draft the topic turns into, and the label the calendar shows for its slot.
briefThe editor's note on what the article should say. It is copied into the draft's teaser, so whoever writes the post opens it and finds the assignment already there.
keywordsThe search terms this article is meant to answer — a note to the writer, not something the platform acts on.
category_idsThe blog_categories this topic's draft is filed under. Set, it replaces the plan's defaults outright rather than adding to them.
tag_idsThe blog_tags this topic's draft carries, with the same rule as category_ids: set, it replaces the plan's defaults.
author_idThe blog_authors resource this topic's draft is credited to, instead of the plan's default.
priorityWhich topic is taken next: higher goes first, and equals are taken oldest first. Sort by it inside a status filter — that is the pair an index backs.
statusWhere the topic stands: PROPOSED while an idea the desk's AI suggested waits for a person, CANDIDATE while it waits in the backlog, PLANNED once a slot holds it, USED once that slot's post is live, REJECTED if it was turned down. Moved by :accept, :reject, :restore and by the desk itself, never by writing this field.
slot_idThe editorial_slots resource holding this topic while it is PLANNED or USED. Empty while it is still in the backlog.
originWho put the topic on the list: MANUAL for one a person entered, SUGGESTED for one a TOPICS run of editorial_generations proposed.
generation_idThe editorial_generations run that proposed this topic. Absent on a topic a person entered. Which topics a run proposed is that run's own result.
EditorialTopicCreate
titleWhat the article is about, in a line. It becomes the headline of the draft the topic turns into, and the label the calendar shows for its slot.
briefThe editor's note on what the article should say. It is copied into the draft's teaser, so whoever writes the post opens it and finds the assignment already there.
keywordsThe search terms this article is meant to answer — a note to the writer, not something the platform acts on.
category_idsThe blog_categories this topic's draft is filed under. Set, it replaces the plan's defaults outright rather than adding to them.
tag_idsThe blog_tags this topic's draft carries, with the same rule as category_ids: set, it replaces the plan's defaults.
author_idThe blog_authors resource this topic's draft is credited to, instead of the plan's default.
priorityWhich topic is taken next: higher goes first, and equals are taken oldest first. Sort by it inside a status filter — that is the pair an index backs.
EditorialTopicUpdate
titleWhat the article is about, in a line. It becomes the headline of the draft the topic turns into, and the label the calendar shows for its slot.
briefThe editor's note on what the article should say. It is copied into the draft's teaser, so whoever writes the post opens it and finds the assignment already there.
keywordsThe search terms this article is meant to answer — a note to the writer, not something the platform acts on.
category_idsThe blog_categories this topic's draft is filed under. Set, it replaces the plan's defaults outright rather than adding to them.
tag_idsThe blog_tags this topic's draft carries, with the same rule as category_ids: set, it replaces the plan's defaults.
author_idThe blog_authors resource this topic's draft is credited to, instead of the plan's default.
priorityWhich topic is taken next: higher goes first, and equals are taken oldest first. Sort by it inside a status filter — that is the pair an index backs.
EmailTemplate
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
kindWhich email the template is for: feedback — the message a website's contact form sends to its notification addresses; customer_welcome — what a visitor receives after registering an account on the website; customer_password_reset — the link a customer follows to choose a new password; editorial_topics_proposed, editorial_article_drafted, editorial_article_published and editorial_failure — what the editorial desk sends the notification addresses of its plan when it has proposed topics, a draft is ready, an article has gone live, or something went wrong. The kind decides which placeholders the text may use. Required on Create and fixed afterwards.
display_nameThe template's name in the admin. A label for the people who edit it — the email's recipient never sees it.
subjectThe email's subject line, with {{placeholders}} as in body. It stays one line: a line break a placeholder's value brings in is sent as a space.
bodyThe email's text: plain text, where an empty line starts a new paragraph and {{placeholder}} is replaced by its value when the email is sent. There is no HTML to write — the platform sets the text in its own layout. A placeholder the kind does not have is replaced by nothing. A feedback template may use {{name}}, {{email}} and {{phone}} — what the visitor entered, empty when the form does not ask for it — {{message}}, what they wrote, {{page_title}}, the title of the contact page in the language of its view, and {{website_name}}. Both customer kinds may use {{display_name}} — the customer's name, or their email address when they gave none — {{email}}, the address they sign in with, and {{website_name}}; a customer_welcome template also {{account_url}}, the address of their account page, and a customer_password_reset template {{reset_url}}, the one-time link to the page where they choose a new password. A reset text that leaves {{reset_url}} out is not sent: the platform's own English email goes instead. Every editorial kind may use {{website_name}}. An editorial_topics_proposed template also {{topic_count}}, {{topics}} — the titles of the new topics, one per line — {{duplicates_skipped}}, {{topic_status}} (PROPOSED or CANDIDATE) and {{topics_url}}; an editorial_article_drafted template {{title}}, {{scheduled_time}} (YYYY-MM-DD HH:MM in the plan's time zone), {{verdict}}, {{score}}, {{issues}} — one per line — and {{cost}}, these four empty for a draft the AI did not write, and {{edit_url}}, {{generation_url}} and {{calendar_url}}; an editorial_article_published template {{title}}, {{public_url}}, the article's address on the website, {{edit_url}} and {{calendar_url}}; an editorial_failure template {{title}} and {{scheduled_time}}, empty when no single article is concerned, {{stage}} — the step that went wrong — {{reason}}, its code, {{message}}, {{issues}} and {{url}}, the run's page or the calendar. The editorial links lead into the admin, and are empty when the platform has no address of it configured.
is_defaultWhether this is the template the platform created for its kind — the one an email of that kind is sent from when the website has chosen no other. There is one per kind, only the platform sets it, and it cannot be deleted.
EmailTemplateCreate
display_nameThe template's name in the admin. A label for the people who edit it — the email's recipient never sees it.
subjectThe email's subject line, with {{placeholders}} as in body. It stays one line: a line break a placeholder's value brings in is sent as a space.
bodyThe email's text: plain text, where an empty line starts a new paragraph and {{placeholder}} is replaced by its value when the email is sent. There is no HTML to write — the platform sets the text in its own layout. A placeholder the kind does not have is replaced by nothing. A feedback template may use {{name}}, {{email}} and {{phone}} — what the visitor entered, empty when the form does not ask for it — {{message}}, what they wrote, {{page_title}}, the title of the contact page in the language of its view, and {{website_name}}. Both customer kinds may use {{display_name}} — the customer's name, or their email address when they gave none — {{email}}, the address they sign in with, and {{website_name}}; a customer_welcome template also {{account_url}}, the address of their account page, and a customer_password_reset template {{reset_url}}, the one-time link to the page where they choose a new password. A reset text that leaves {{reset_url}} out is not sent: the platform's own English email goes instead. Every editorial kind may use {{website_name}}. An editorial_topics_proposed template also {{topic_count}}, {{topics}} — the titles of the new topics, one per line — {{duplicates_skipped}}, {{topic_status}} (PROPOSED or CANDIDATE) and {{topics_url}}; an editorial_article_drafted template {{title}}, {{scheduled_time}} (YYYY-MM-DD HH:MM in the plan's time zone), {{verdict}}, {{score}}, {{issues}} — one per line — and {{cost}}, these four empty for a draft the AI did not write, and {{edit_url}}, {{generation_url}} and {{calendar_url}}; an editorial_article_published template {{title}}, {{public_url}}, the article's address on the website, {{edit_url}} and {{calendar_url}}; an editorial_failure template {{title}} and {{scheduled_time}}, empty when no single article is concerned, {{stage}} — the step that went wrong — {{reason}}, its code, {{message}}, {{issues}} and {{url}}, the run's page or the calendar. The editorial links lead into the admin, and are empty when the platform has no address of it configured.
kindWhich email the template is for: feedback — the message a website's contact form sends to its notification addresses; customer_welcome — what a visitor receives after registering an account on the website; customer_password_reset — the link a customer follows to choose a new password; editorial_topics_proposed, editorial_article_drafted, editorial_article_published and editorial_failure — what the editorial desk sends the notification addresses of its plan when it has proposed topics, a draft is ready, an article has gone live, or something went wrong. The kind decides which placeholders the text may use. Required on Create and fixed afterwards.
EmailTemplateUpdate
display_nameThe template's name in the admin. A label for the people who edit it — the email's recipient never sees it.
subjectThe email's subject line, with {{placeholders}} as in body. It stays one line: a line break a placeholder's value brings in is sent as a space.
bodyThe email's text: plain text, where an empty line starts a new paragraph and {{placeholder}} is replaced by its value when the email is sent. There is no HTML to write — the platform sets the text in its own layout. A placeholder the kind does not have is replaced by nothing. A feedback template may use {{name}}, {{email}} and {{phone}} — what the visitor entered, empty when the form does not ask for it — {{message}}, what they wrote, {{page_title}}, the title of the contact page in the language of its view, and {{website_name}}. Both customer kinds may use {{display_name}} — the customer's name, or their email address when they gave none — {{email}}, the address they sign in with, and {{website_name}}; a customer_welcome template also {{account_url}}, the address of their account page, and a customer_password_reset template {{reset_url}}, the one-time link to the page where they choose a new password. A reset text that leaves {{reset_url}} out is not sent: the platform's own English email goes instead. Every editorial kind may use {{website_name}}. An editorial_topics_proposed template also {{topic_count}}, {{topics}} — the titles of the new topics, one per line — {{duplicates_skipped}}, {{topic_status}} (PROPOSED or CANDIDATE) and {{topics_url}}; an editorial_article_drafted template {{title}}, {{scheduled_time}} (YYYY-MM-DD HH:MM in the plan's time zone), {{verdict}}, {{score}}, {{issues}} — one per line — and {{cost}}, these four empty for a draft the AI did not write, and {{edit_url}}, {{generation_url}} and {{calendar_url}}; an editorial_article_published template {{title}}, {{public_url}}, the article's address on the website, {{edit_url}} and {{calendar_url}}; an editorial_failure template {{title}} and {{scheduled_time}}, empty when no single article is concerned, {{stage}} — the step that went wrong — {{reason}}, its code, {{message}}, {{issues}} and {{url}}, the run's page or the calendar. The editorial links lead into the admin, and are empty when the platform has no address of it configured.
EmailTemplateView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id. The overlay is addressed by its view, not by this.
email_template_idThe template this overlay belongs to. Fixed by the URL.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe fields this view actually overrides — subject, body, or both. A field not listed falls back along the view's fallback chain to the template itself, whatever value is stored for it here.
subjectThis view's subject line, with the template's placeholders.
bodyThis view's text, written like the template's body.
EmailTemplateViewCreate
overriddenThe fields this view actually overrides — subject, body, or both. A field not listed falls back along the view's fallback chain to the template itself, whatever value is stored for it here.
subjectThis view's subject line, with the template's placeholders.
bodyThis view's text, written like the template's body.
EmailTemplateViewUpdate
overriddenThe fields this view actually overrides — subject, body, or both. A field not listed falls back along the view's fallback chain to the template itself, whatever value is stored for it here.
subjectThis view's subject line, with the template's placeholders.
bodyThis view's text, written like the template's body.
MediaFolder
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe folder's name, as the media library shows it.
parent_idThe folder this one sits in; empty at the root. Settable on create and immutable afterwards — moving a folder is :move.
pathThe folder's position in the tree, as the ids of its ancestors and its own. Sorting by it renders the whole tree in one page, which is why it is the default order.
sort_orderThe folder's position among its siblings. Set by :move, never by a write.
levelHow deep the folder sits, counting the root as 0. Server-maintained with the rest of the tree bookkeeping.
MediaFolderCreate
display_nameThe folder's name, as the media library shows it.
parent_idThe folder this one sits in; empty at the root. Settable on create and immutable afterwards — moving a folder is :move.
MediaFolderUpdate
display_nameThe folder's name, as the media library shows it.
Media
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
filenameThe name the file is stored under, made unique on upload. This is the one that appears in the URL.
original_filenameThe name the file arrived with, kept so a person can recognise their own upload.
mime_typeThe stored file's media type, detected on upload. filter=mime_type:"image/" is how you ask for pictures by family.
storage_pathWhere the bytes live in the platform's object store. Internal bookkeeping — fetch the file through its media URL, not through this.
file_sizeSize of the stored original, in bytes. A transformed variant is smaller and is not counted here.
is_imageWhether the file is an image, and therefore whether the w/h/crop/q/fmt transforms apply to it.
widthWidth of the stored original in pixels. Meaningful only when is_image is true.
heightHeight of the stored original in pixels. Meaningful only when is_image is true.
alt_textThe alternative text rendered with the picture. It is what a screen reader announces, so it belongs on every image that carries meaning.
titleA human label for the file in the media library.
folder_idThe media_folders resource this file sits in. filter=folder_id = null is the library's root.
MediaCreate
alt_textThe alternative text rendered with the picture. It is what a screen reader announces, so it belongs on every image that carries meaning.
titleA human label for the file in the media library.
folder_idThe media_folders resource this file sits in. filter=folder_id = null is the library's root.
MediaUpdate
alt_textThe alternative text rendered with the picture. It is what a screen reader announces, so it belongs on every image that carries meaning.
titleA human label for the file in the media library.
folder_idThe media_folders resource this file sits in. filter=folder_id = null is the library's root.
MenuItem
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
menu_idThe menu this item belongs to. Fixed by the URL.
titleThe text of the link, as the menu renders it.
typeWhat the item points at, which decides which of the fields below is read: TEXT (a heading with no link), URL, CMS_PAGE, RAW_HTML, BLOG, BLOG_CATEGORY, BLOG_AUTHOR, BLOG_POST, BLOG_TAG or FEEDBACK_FORM.
urlThe address a URL item points at. Anything else — a page, a category, a post — is linked by its id below, so the URL follows the resource when its slug or its view changes.
cms_page_idThe page a CMS_PAGE item points at.
blog_category_idThe category a BLOG_CATEGORY item points at.
blog_author_idThe author a BLOG_AUTHOR item points at.
blog_post_idThe post a BLOG_POST item points at.
blog_tag_idThe tag a BLOG_TAG item points at.
parent_idThe item this one nests under; empty at the top level. Settable on create and immutable afterwards — re-nesting is :move.
pathThe item's position in the menu tree, as the ids of its ancestors and its own. Server-generated: sending it is an error rather than a no-op.
sort_orderThe item's position among its siblings, and the order the menu renders in. Changed with :move; sending it is an error.
levelHow deep the item sits, counting the top level as 0. Server-generated; sending it is an error.
htmlThe markup a RAW_HTML item renders instead of a link — a language switcher, a badge, a call button.
targetThe link target, when the item should not open in place: _blank for a new tab.
view_idA view this item belongs to on its own. Usually empty — a shared item is translated through its views overlay instead.
enabledWhether the item is rendered in the menu.
show_subcategoriesFor a BLOG_CATEGORY item: whether the category's children are rendered as a submenu. Absent counts as on.
MenuItemCreate
titleThe text of the link, as the menu renders it.
typeWhat the item points at, which decides which of the fields below is read: TEXT (a heading with no link), URL, CMS_PAGE, RAW_HTML, BLOG, BLOG_CATEGORY, BLOG_AUTHOR, BLOG_POST, BLOG_TAG or FEEDBACK_FORM.
urlThe address a URL item points at. Anything else — a page, a category, a post — is linked by its id below, so the URL follows the resource when its slug or its view changes.
cms_page_idThe page a CMS_PAGE item points at.
blog_category_idThe category a BLOG_CATEGORY item points at.
blog_author_idThe author a BLOG_AUTHOR item points at.
blog_post_idThe post a BLOG_POST item points at.
blog_tag_idThe tag a BLOG_TAG item points at.
parent_idThe item this one nests under; empty at the top level. Settable on create and immutable afterwards — re-nesting is :move.
pathThe item's position in the menu tree, as the ids of its ancestors and its own. Server-generated: sending it is an error rather than a no-op.
sort_orderThe item's position among its siblings, and the order the menu renders in. Changed with :move; sending it is an error.
levelHow deep the item sits, counting the top level as 0. Server-generated; sending it is an error.
htmlThe markup a RAW_HTML item renders instead of a link — a language switcher, a badge, a call button.
targetThe link target, when the item should not open in place: _blank for a new tab.
view_idA view this item belongs to on its own. Usually empty — a shared item is translated through its views overlay instead.
enabledWhether the item is rendered in the menu.
show_subcategoriesFor a BLOG_CATEGORY item: whether the category's children are rendered as a submenu. Absent counts as on.
MenuItemUpdate
titleThe text of the link, as the menu renders it.
typeWhat the item points at, which decides which of the fields below is read: TEXT (a heading with no link), URL, CMS_PAGE, RAW_HTML, BLOG, BLOG_CATEGORY, BLOG_AUTHOR, BLOG_POST, BLOG_TAG or FEEDBACK_FORM.
urlThe address a URL item points at. Anything else — a page, a category, a post — is linked by its id below, so the URL follows the resource when its slug or its view changes.
cms_page_idThe page a CMS_PAGE item points at.
blog_category_idThe category a BLOG_CATEGORY item points at.
blog_author_idThe author a BLOG_AUTHOR item points at.
blog_post_idThe post a BLOG_POST item points at.
blog_tag_idThe tag a BLOG_TAG item points at.
htmlThe markup a RAW_HTML item renders instead of a link — a language switcher, a badge, a call button.
targetThe link target, when the item should not open in place: _blank for a new tab.
view_idA view this item belongs to on its own. Usually empty — a shared item is translated through its views overlay instead.
enabledWhether the item is rendered in the menu.
show_subcategoriesFor a BLOG_CATEGORY item: whether the category's children are rendered as a submenu. Absent counts as on.
MenuItemView
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
uidThe overlay's own storage id, kept for clients that stored it before the overlay had a resource name.
menu_item_idThe menu item this overlay belongs to. Fixed by the URL.
view_idThe view this overlay speaks for. Fixed by the URL.
overriddenThe names of the fields this view actually overrides. A field not listed here falls back to the item.
titleThis view's text for the link.
urlThis view's address for a URL item.
htmlThis view's markup for a RAW_HTML item.
enabledWhether this view renders the item at all — the one way to hide a single link in one language.
MenuItemViewCreate
overriddenThe names of the fields this view actually overrides. A field not listed here falls back to the item.
titleThis view's text for the link.
urlThis view's address for a URL item.
htmlThis view's markup for a RAW_HTML item.
enabledWhether this view renders the item at all — the one way to hide a single link in one language.
MenuItemViewUpdate
overriddenThe names of the fields this view actually overrides. A field not listed here falls back to the item.
titleThis view's text for the link.
urlThis view's address for a URL item.
htmlThis view's markup for a RAW_HTML item.
enabledWhether this view renders the item at all — the one way to hide a single link in one language.
Menu
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe menu's label in the admin. It is not rendered on the site — a menu is its items.
codeThe handle a theme refers to this menu by — which is how a theme picks its main menu without knowing an id.
view_idA view this menu belongs to on its own, for a menu that exists in one view only. Usually empty: a shared menu is translated through its items' overlays instead.
is_activeWhether the menu is rendered.
MenuCreate
display_nameThe menu's label in the admin. It is not rendered on the site — a menu is its items.
codeThe handle a theme refers to this menu by — which is how a theme picks its main menu without knowing an id.
view_idA view this menu belongs to on its own, for a menu that exists in one view only. Usually empty: a shared menu is translated through its items' overlays instead.
is_activeWhether the menu is rendered.
MenuUpdate
display_nameThe menu's label in the admin. It is not rendered on the site — a menu is its items.
codeThe handle a theme refers to this menu by — which is how a theme picks its main menu without knowing an id.
view_idA view this menu belongs to on its own, for a menu that exists in one view only. Usually empty: a shared menu is translated through its items' overlays instead.
is_activeWhether the menu is rendered.
Project
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
account_idThe account this project belongs to. The URL already fixes it, so a write cannot move a project between accounts.
display_nameThe project's label, unique inside its account.
is_activeWhether the project is in use. Nothing filters on it for you — it is the tenant's own flag for retiring a project without deleting it.
icon_colorThe colour, #rrggbb, that the admin tints this project's badge with when it lists several projects side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
ProjectCreate
display_nameThe project's label, unique inside its account.
is_activeWhether the project is in use. Nothing filters on it for you — it is the tenant's own flag for retiring a project without deleting it.
icon_colorThe colour, #rrggbb, that the admin tints this project's badge with when it lists several projects side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
ProjectUpdate
display_nameThe project's label, unique inside its account.
is_activeWhether the project is in use. Nothing filters on it for you — it is the tenant's own flag for retiring a project without deleting it.
icon_colorThe colour, #rrggbb, that the admin tints this project's badge with when it lists several projects side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
Theme
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
display_nameThe theme's label in the admin.
codeThe theme's handle, unique on the website.
stylesThe CSS custom properties the site renders with, as a flat object keyed by variable name. A variable this API has never heard of survives a round trip untouched, so a client may set one the renderer gained after this document was generated.
main_menu_idThe menus resource rendered as the site's main navigation.
footer_block_idThe cms_blocks resource rendered in the footer.
logo_media_idThe media resource used as the site's logo.
favicon_media_idThe media resource used as the site's favicon.
custom_cssA stylesheet appended after the theme's own, for the rules the variables cannot express.
ThemeCreate
display_nameThe theme's label in the admin.
codeThe theme's handle, unique on the website.
stylesThe CSS custom properties the site renders with, as a flat object keyed by variable name. A variable this API has never heard of survives a round trip untouched, so a client may set one the renderer gained after this document was generated.
main_menu_idThe menus resource rendered as the site's main navigation.
footer_block_idThe cms_blocks resource rendered in the footer.
logo_media_idThe media resource used as the site's logo.
favicon_media_idThe media resource used as the site's favicon.
custom_cssA stylesheet appended after the theme's own, for the rules the variables cannot express.
ThemeUpdate
display_nameThe theme's label in the admin.
codeThe theme's handle, unique on the website.
stylesThe CSS custom properties the site renders with, as a flat object keyed by variable name. A variable this API has never heard of survives a round trip untouched, so a client may set one the renderer gained after this document was generated.
main_menu_idThe menus resource rendered as the site's main navigation.
footer_block_idThe cms_blocks resource rendered in the footer.
logo_media_idThe media resource used as the site's logo.
favicon_media_idThe media resource used as the site's favicon.
custom_cssA stylesheet appended after the theme's own, for the rules the variables cannot express.
Profile
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
emailThe address the account signs in with. Changing it changes the sign-in identity.
firstnameThe user's given name, as the admin greets them.
lastnameThe user's family name, shown beside the given one.
interface_localeThe language the admin interface is shown to this user in. It has nothing to do with the languages the websites are published in — those are views.
is_activeWhether the account is usable. It is not settable here — closing an account is profile:delete_account.
ProfileCreate
emailThe address the account signs in with. Changing it changes the sign-in identity.
firstnameThe user's given name, as the admin greets them.
lastnameThe user's family name, shown beside the given one.
interface_localeThe language the admin interface is shown to this user in. It has nothing to do with the languages the websites are published in — those are views.
passwordA new password. Write-only: it is applied and never echoed back, and setting it needs current_password in the same body.
current_passwordThe password in force right now, proving the session belongs to whoever is changing it. Write-only, and only meaningful alongside password.
ProfileUpdate
emailThe address the account signs in with. Changing it changes the sign-in identity.
firstnameThe user's given name, as the admin greets them.
lastnameThe user's family name, shown beside the given one.
interface_localeThe language the admin interface is shown to this user in. It has nothing to do with the languages the websites are published in — those are views.
passwordA new password. Write-only: it is applied and never echoed back, and setting it needs current_password in the same body.
current_passwordThe password in force right now, proving the session belongs to whoever is changing it. Write-only, and only meaningful alongside password.
View
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
codeThe view's handle, unique on the website. Content overlays and view-scoped settings are addressed by the view, so this is the name a person uses for it.
display_nameThe label the visitor-facing language switcher shows — the language's own name ("Deutsch"), not a translation of it.
is_activeWhether the view is served. Switching it off takes one language off the site without deleting anything written for it.
localeThe language this view renders in, as a BCP 47 tag. It picks the interface translations and the date and number formats.
path_prefixThe first URL segment that routes to this view (/de/...). Empty means this view answers at the bare root — at most one view per website may.
sort_orderThe view's position in the language switcher.
fallback_view_idThe view to fall back to when this one has nothing of its own to show for a page.
ViewCreate
codeThe view's handle, unique on the website. Content overlays and view-scoped settings are addressed by the view, so this is the name a person uses for it.
is_activeWhether the view is served. Switching it off takes one language off the site without deleting anything written for it.
display_nameThe label the visitor-facing language switcher shows — the language's own name ("Deutsch"), not a translation of it.
localeThe language this view renders in, as a BCP 47 tag. It picks the interface translations and the date and number formats.
path_prefixThe first URL segment that routes to this view (/de/...). Empty means this view answers at the bare root — at most one view per website may.
sort_orderThe view's position in the language switcher.
fallback_view_idThe view to fall back to when this one has nothing of its own to show for a page.
ViewUpdate
codeThe view's handle, unique on the website. Content overlays and view-scoped settings are addressed by the view, so this is the name a person uses for it.
display_nameThe label the visitor-facing language switcher shows — the language's own name ("Deutsch"), not a translation of it.
is_activeWhether the view is served. Switching it off takes one language off the site without deleting anything written for it.
localeThe language this view renders in, as a BCP 47 tag. It picks the interface translations and the date and number formats.
path_prefixThe first URL segment that routes to this view (/de/...). Empty means this view answers at the bare root — at most one view per website may.
sort_orderThe view's position in the language switcher.
fallback_view_idThe view to fall back to when this one has nothing of its own to show for a page.
SettingDescriptor
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
pathThe dotted path this entry describes — the id a setting is written under.
view_overridableWhether this path may be given a different value per view. ?filter=view_overridable = true is the list a per-view settings screen should offer.
SettingDescriptorUpdate
ViewSetting
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
pathThe setting's dotted path, which is also its id. Only a path whose setting_descriptors entry says view_overridable may be written here.
view_idThe view this override belongs to. Fixed by the URL.
valueThe value this view uses instead of the website-wide one. Any JSON, whichever shape the setting is defined to hold.
ViewSettingCreate
valueThe value this view uses instead of the website-wide one. Any JSON, whichever shape the setting is defined to hold.
ViewSettingUpdate
valueThe value this view uses instead of the website-wide one. Any JSON, whichever shape the setting is defined to hold.
Website
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
parentThe resource name of the project this website belongs to, accounts/{account}/projects/{project} — the link upward that the website's own one-segment name no longer carries.
project_idThe last segment of parent. Settable on create, immutable afterwards: a website does not move between projects.
codeThe website's short slug, and the label the platform hostname is built from. Immutable — changing it would move a live site's URL.
display_nameThe website's label in the admin. Free text, and unrelated to the hostname — that is code.
is_activeWhether the website is live. The list on this surface returns only active websites — an inactive one is still reachable by name, it is just not browsable.
provisioning_statusHow far provisioning has got: PENDING, READY or FAILED. It is here so a list can show a site that is still coming up — to wait for one, poll the Operation that Create named (§17).
typeThe kind of site this was provisioned as, which chose its seeded content. Set at signup and not changed afterwards.
icon_colorThe colour, #rrggbb, that the admin tints this website's badge with when it lists several sites side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
WebsiteCreate
display_nameThe website's label in the admin. Free text, and unrelated to the hostname — that is code.
is_activeWhether the website is live. The list on this surface returns only active websites — an inactive one is still reachable by name, it is just not browsable.
project_idThe last segment of parent. Settable on create, immutable afterwards: a website does not move between projects.
codeThe website's short slug, and the label the platform hostname is built from. Immutable — changing it would move a live site's URL.
icon_colorThe colour, #rrggbb, that the admin tints this website's badge with when it lists several sites side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
WebsiteUpdate
display_nameThe website's label in the admin. Free text, and unrelated to the hostname — that is code.
is_activeWhether the website is live. The list on this surface returns only active websites — an inactive one is still reachable by name, it is just not browsable.
icon_colorThe colour, #rrggbb, that the admin tints this website's badge with when it lists several sites side by side. Leave it unset and the admin derives a stable colour from the id — set it only to override that choice, and send null to go back to the derived one.
Setting
nameThe resource name (§5) — the identity of this resource, and the path that addresses it: websites/{website}/cms_pages/{cms_page}. It is the handle to store, not a human label.
idThe last segment of name on its own, for a client that needs to build a child URL. Unique inside its parent, never across the platform.
create_timeWhen the resource was created (RFC 3339, UTC).
update_timeWhen the resource last changed (RFC 3339, UTC).
etagVersion of the persisted state. Send it back in If-Match on Update or Delete and the write is rejected with ABORTED if anyone else changed the resource meanwhile (§14).
pathThe setting's dotted path, which is also its id — general.info.site_name, appearance.theme.default_theme. Which paths exist is decided by the platform, so a write cannot invent one and cannot move one.
view_idEmpty on this collection: these are the website-wide values. A value overridden for one view is a resource of websites/{website}/views/{view}/settings, and carries that view there.
valueThe setting's value — any JSON: a string, a number, a boolean, an object or an array, whichever the setting is defined to hold.