Help · API reference
Projects
Projects, builds, deployments, domains and media.
Get a projectGET /api/v1/projects/{project}
Returns the project with its deploy targets, domains, open drafts, recent builds and deployments, what the live site serves, and whether publishing is blocked. view=summary answers only the project's identity and open drafts, which is much cheaper.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
What comes back
One of:
idstring, requiredslugstring, requirednamestring, requiredstatusstring, requiredstatestring, requiredlive_branchstring, requiredpublish_policystring, requiredassistant_autonomy"review" | "publish", required: What an assistant’s publish means here (D12).assistant_reads_formsboolean, required: May an assistant read visitors’ form submissions here (D19).assistant_writes_blocksboolean, required: Does a connector client’s sign-in ask for theblocksgrant here (AI-001).assistant_guidelinesstring | null, required: What every assistant reads before its first change here (P6).preview_access"link" | "password", required: Whether preview links ask for a passphrase.stack_versionstring | null, requiredtemplatestring | null, requiredcreated_atstring, required: ISO 8601 timestamp.rolestring, requiredas_operatortrue: Present when the caller is here as the platform’s operator, not as a member of the team.moved_tostring: Where the project went, when it moved to another deployment; everything here is then read-only.deletion_grace_daysnumber, requireddeleted_atstring: Present only while a deletion is pending.purge_afterone of: string | null: Present only while a deletion is pending.One of:
string. ISO 8601 timestamp.
null
managed_urlstring, requiredgitobject, requiredclone_urlstring, requiredlocatorstring, required
open_draftsarray of object, requiredA list of:
idstring, requiredkind"session" | "branch", requiredtitlestring, requiredstatusstring, requiredbranchstring, requiredoriginstring, requiredcreated_bystring | null, requiredcreated_atstring, required: ISO 8601 timestamp.updated_atstring, required: ISO 8601 timestamp.head_commitstring, requiredbase_commitstring, requiredpreview_urlstring | null, required: The line’s stable preview address; null until somebody asks for one.preview_visibility"members" | "public", requiredpreview_public_untilone of: string | null, requiredone of: string | null
expires_atone of: string | null, required: When the line is tidied away: an idle session, or an assistant’s line whose token died. Null for a branch.one of: string | null
publish_atone of: string | null, requiredone of: string | null
merged_intostring | null, required: Where a merged line went:live(published) or the id of the line it was folded into. Null while open.
first_stepsobject: The caller’s own first steps here; sent only while the project is new.assistant_connectedboolean, requiredassistant_dismissedboolean, required
publish_blockedstring | null, required: Why a publish is refused right now, or null.formsone of: object | null, required: What the live site’s forms do with an entry; null when they could not be read.One of:
savingnumber, requirednotifyingnumber, requiredquietarray of object, requiredA list of:
slugstring, requiredtitlestring | null, required
null
stackone of: object | null, required: Where the project stands against this Studio’s Webentor release; null when it could not tell.One of:
behindboolean, requiredstatus"current" | "behind" | "not-on-release" | "custom" | "newer" | "none", requiredfromstring | null, requiredtostring | null, requiredpackagesarray of string, requiredcustomarray of stringadvisoriesarray of objectA list of:
idstring, requiredlevel"security" | "data", requiredsummarystring, requiredfixedstring: The first release with the fix.offeredboolean: Whether this Studio’s release carries the fix.
newestobjectversionstring, requiredcheckedAtstring, required
contractobjectprojectstring | null, requiredstudiostring | null, requiredfitsboolean | null, required
relockboolean, requiredblockedBystringtreeobject: What the latest production build installed, when it is off the release.releasestring, requiredproblemsarray of string, requiredbuildIdstring, required
null
live_commitstring | null, requiredservedone of: object | null, required: What the live site serves; null before anything is published.One of:
target_idstring, requiredbuild_idstring, requiredcommitstring | null, requiredup_to_dateboolean, required
null
targetsarray of object, requiredA list of:
idstring, requiredproviderstring, requirednamestring, requiredis_defaultboolean, requiredconfigobject, required: The target’s non-secret settings.has_credentialboolean, requiredlive_build_idstring | null, requiredcreated_atstring, required: ISO 8601 timestamp.
divergencearray of object, requiredA list of:
target_idstring, requiredtarget_namestring, requiredproviderstring, requiredserving_build_idstring | null, requiredup_to_dateboolean, required
domainsarray of object, requiredA list of:
idstring, requiredaccount_idstring, requiredproject_idstring, requiredhostnamestring, requiredverification_status"pending" | "verified" | "failed", requiredverification_tokenstring, required: The value of the TXT record that proves the domain is yours.tls_status"pending" | "active" | "failed", requiredis_primaryboolean, requiredcreated_atstring, required: ISO 8601 timestamp.verified_atone of: string | null, requiredone of: string | null
last_checked_atone of: string | null, required: The last DNS check, pass or fail; null until the first.one of: string | null
recent_buildsarray of object, requiredA list of:
idstring, requiredstatusstring, requiredtriggerstring, requiredcommitstring | null, requireddraft_idstring | null, requiredpreview_urlstring | null, requiredpreview_open_urlstring | null, required: The build opened as the caller (signs a member in).bytesnumber | null, requiredduration_msnumber | null, requirederrorstring | null, requiredfailureone of: object | null, requiredone of: object | null
warningstring | null, requiredsuperseded_bystring | null, requiredqueued_atstring, required: ISO 8601 timestamp.started_atone of: string | null, requiredone of: string | null
finished_atone of: string | null, requiredone of: string | null
recent_deploymentsarray of object, requiredA list of:
idstring, requiredtypestring, requiredstatusstring, requiredurlstring | null, requiredis_rollbackboolean, requiredbuild_idstring, requiredtarget_idstring | null, required: The destination; null once it is removed. A publish writes a row per destination.commitstring | null, requiredduration_msnumber | null, requiredcreated_atstring, required: ISO 8601 timestamp.warningsarray of string, required: On a success: what the destination left undone.site_changedone of: "yes" | "unknown" | null, required: On a failure: whether visitors may already see some of it.one of: "yes" | "unknown" | null
idstring, requiredslugstring, requirednamestring, requiredstatusstring, requiredstatestring, requiredlive_branchstring, requiredpublish_policystring, requiredassistant_autonomy"review" | "publish", required: What an assistant’s publish means here (D12).assistant_reads_formsboolean, required: May an assistant read visitors’ form submissions here (D19).assistant_writes_blocksboolean, required: Does a connector client’s sign-in ask for theblocksgrant here (AI-001).assistant_guidelinesstring | null, required: What every assistant reads before its first change here (P6).preview_access"link" | "password", required: Whether preview links ask for a passphrase.stack_versionstring | null, requiredtemplatestring | null, requiredcreated_atstring, required: ISO 8601 timestamp.rolestring, requiredas_operatortrue: Present when the caller is here as the platform’s operator, not as a member of the team.moved_tostring: Where the project went, when it moved to another deployment; everything here is then read-only.deletion_grace_daysnumber, requireddeleted_atstring: Present only while a deletion is pending.purge_afterone of: string | null: Present only while a deletion is pending.One of:
string. ISO 8601 timestamp.
null
managed_urlstring, requiredgitobject, requiredclone_urlstring, requiredlocatorstring, required
open_draftsarray of object, requiredA list of:
idstring, requiredkind"session" | "branch", requiredtitlestring, requiredstatusstring, requiredbranchstring, requiredoriginstring, requiredcreated_bystring | null, requiredcreated_atstring, required: ISO 8601 timestamp.updated_atstring, required: ISO 8601 timestamp.head_commitstring, requiredbase_commitstring, requiredpreview_urlstring | null, required: The line’s stable preview address; null until somebody asks for one.preview_visibility"members" | "public", requiredpreview_public_untilone of: string | null, requiredone of: string | null
expires_atone of: string | null, required: When the line is tidied away: an idle session, or an assistant’s line whose token died. Null for a branch.one of: string | null
publish_atone of: string | null, requiredone of: string | null
merged_intostring | null, required: Where a merged line went:live(published) or the id of the line it was folded into. Null while open.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - default Any other failure, as RFC 9457 problem details.
Update a projectPATCH /api/v1/projects/{project}
Changes project settings: name, publish_policy, build variables (build_env) and the assistant settings. Needs the project-settings permission; changing publish_policy also needs the project-policy permission, and the assistant settings are an owner's. build_env may not use reserved variable names. New assistant_guidelines are also committed to the repository.
A stepped-up session is required for: changing what an assistant may do alone (assistant_autonomy, assistant_reads_forms, assistant_writes_blocks); loosening publish_policy to direct. No access token carries step-up.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
namestring, 1 to 80 characterspublish_policy"direct" | "review_required": Who may publish: anyone allowed to (direct), or only an approved draft (review_required).assistant_autonomy"review" | "publish": What an assistant’s publish means here: a request a person approves, or a publish. An owner’s, stepped up.assistant_reads_formsboolean: May an assistant read visitors’ form submissions. An owner’s, stepped up.assistant_writes_blocksboolean: Does an assistant’s sign-in ask for theblocksgrant here. An owner’s, stepped up.assistant_guidelinesone of: string | null: What every assistant reads before its first change here.nullclears it.One of:
string
null
build_envobject
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a projectDELETE /api/v1/projects/{project}
Schedules the project for deletion: its sites go offline, an export bundle is queued, and the project is erased after the grace period unless restored. Needs the project-delete permission. confirm must be the project's slug; a project being moved is refused, and so is a moved copy whose domains still lead here unless still_served is true.
A signed-in person who has stepped up (confirmed again with a passkey, a recovery code or an emailed code): a live session alone is refused, and no access token is accepted.
Who may call it: A signed-in person who has stepped up; no access token
Parameters
project(path, string)
Body (application/json)
confirmstring, required: The project’s slug, typed to confirm.still_servedboolean: Delete a moved copy although its domains still lead here.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Get a project activityGET /api/v1/projects/{project}/activity
Returns the project's activity feed, newest first. Filter with draft, actor, category and security=1; page with limit (up to 500) and before, passing the next value back. format=ndjson streams every matching row. Needs the project-activity permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)actor(query, string, optional)before(query, string, optional)category(query, string, optional)draft(query, string, optional)format(query, string, optional)limit(query, integer, optional), at most 500, default 100security(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Get project analyticsGET /api/v1/projects/{project}/analytics
Returns the project's visitor analytics overview for range days (7, 30 or 90; 30 when absent or not one of those). Needs the repo-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)range(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Delete project analyticsDELETE /api/v1/projects/{project}/analytics
Erases every analytics row collected for the project; collection itself stays on or off as it was. Needs the project-settings permission. The answer gives the number of rows erased.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Update analytics settingsPOST /api/v1/projects/{project}/analytics/settings
Turns analytics collection on or off for the project (enabled); the change applies from the next page view. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
enabledboolean, required
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Create a project branchePOST /api/v1/projects/{project}/branches
Creates a shared branch line from the live site, or from another line named in from, and answers 201 with it. Needs the draft-create permission. A reserved name, a name that would read as the main line, or one an existing branch already has, is refused.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
namestring, required, 1 to 60 charactersfromstring: The line to start from, by id;liveor omitted, the live site.
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Get a project build envGET /api/v1/projects/{project}/build-env
Returns the project's build variables as stored, as a data object of names to values. They are not secrets; the build can print them. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
List project buildsGET /api/v1/projects/{project}/builds
Lists the project's most recent builds, up to limit (30 by default, at most 200), with no further paging. Addresses of builds on another person's private session are left out. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)limit(query, integer, optional), at most 200, default 30
200 Success.
What comes back
dataarray of object, requiredA list of:
idstring, requiredstatusstring, requiredtriggerstring, requiredcommitstring | null, requireddraft_idstring | null, requiredpreview_urlstring | null, requiredpreview_open_urlstring | null, required: The build opened as the caller (signs a member in).bytesnumber | null, requiredduration_msnumber | null, requirederrorstring | null, requiredfailureone of: object | null, requiredOne of:
kind"syntax" | "dependency" | "resources" | "unknown", requiredfirst_errorstring | null, required
null
warningstring | null, requiredsuperseded_bystring | null, requiredqueued_atstring, required: ISO 8601 timestamp.started_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
finished_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project buildPOST /api/v1/projects/{project}/builds
Queues a build of ref (the live branch by default) and answers 202 with build_id and status. Needs the project-settings permission. trigger defaults to manual, and a manual build never reaches the live site; only production rebuilds and deploys the live branch, and is refused for a site never published. To put a draft live, use POST /api/v1/projects/{project}/drafts/{draft}/publish.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
refstring, at most 200 characterstrigger"manual" | "editor_bundle" | "production", default "manual"
202 Success.
What comes back
build_idstring, requiredstatusstring, required
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Create a build preview linkPOST /api/v1/projects/{project}/builds/{build}/preview-link
Returns a preview address for a finished build (url), minting one if the build has none yet (minted). Needs the draft-read permission. Only a published version, or a build of a line the caller can see, qualifies; a manual build is refused, and so is a build whose files were not kept.
A read token may make this request too: it changes nothing a person can see.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)build(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 409 Conflict. (
codeisconflict.) - default Any other failure, as RFC 9457 problem details.
Get a project buildGET /api/v1/projects/{project}/builds/{id}
Returns one build with its status, trigger, commit, timings and any failure, plus its place in the queue while it waits (queue). Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)id(path, string)
200 Success.
What comes back
idstring, requiredstatusstring, requiredtriggerstring, requiredcommitstring | null, requireddraft_idstring | null, requiredpreview_urlstring | null, requiredpreview_open_urlstring | null, required: The build opened as the caller (signs a member in).bytesnumber | null, requiredduration_msnumber | null, requirederrorstring | null, requiredfailureone of: object | null, requiredOne of:
kind"syntax" | "dependency" | "resources" | "unknown", requiredfirst_errorstring | null, required
null
warningstring | null, requiredsuperseded_bystring | null, requiredqueued_atstring, required: ISO 8601 timestamp.started_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
finished_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
queueone of: object | null, required: Where a waiting build stands; null once it runs.One of:
positionnumber, requiredaheadarray of object, requiredA list of:
kind"publish" | "preview" | "editor" | "other", requiredrunningboolean, requiredelapsed_msnumber, required
null
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Get build logsGET /api/v1/projects/{project}/builds/{id}/logs
Returns the build's log as plain text. When there is no log, because the build has not run yet or its log was tidied away, the answer is still 200 with a sentence saying so. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)id(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List project collaboratorsGET /api/v1/projects/{project}/collaborators
Lists the people with a per-project grant on this project, beyond the team's own members, with their email, name, role and how they got access. Unpaged. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Delete a project collaboratorDELETE /api/v1/projects/{project}/collaborators/{userId}
Takes a person's per-project grant away, so they lose access to this project, and closes their open editor connections on it. Team membership is not touched. Needs the team-members permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)userId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List published content in a collectionGET /api/v1/projects/{project}/content/live/{collection}
Lists the entries of a collection as the live site has them: the live branch, or during a rollback the commit actually deployed (x-webentor-live-source says which). Answers a bare array with no paging. Needs the repo-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)collection(path, string)
200 Success.
What comes back
A list of:
slugstring, requiredfieldsobject, required: The entry’s scalar fields (title, description, order, …);_invalid: truefor a file that does not parse.countsobject, required: How many blocks a page has; empty for an entry that does not parse.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Get a published content entryGET /api/v1/projects/{project}/content/live/{collection}/{slug}
Returns one entry's document as the live site has it: from the live branch, or during a rollback from the commit actually deployed, as x-webentor-live-source says. Needs the repo-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)collection(path, string)slug(path, string): May contain unencoded/: this is a path, not a single segment. Encoded slashes will not match.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List project deploy targetsGET /api/v1/projects/{project}/deploy-targets
Lists the project's deploy targets, without their credentials, and the providers this deployment offers under available. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
What comes back
dataarray of object, requiredA list of:
idstring, requiredproviderstring, requirednamestring, requiredis_defaultboolean, requiredconfigobject, required: The target’s non-secret settings.has_credentialboolean, requiredlive_build_idstring | null, requiredcreated_atstring, required: ISO 8601 timestamp.
availablearray of object, required: The providers a new target may use here.A list of:
idstring, requiredlabelstring, requiredneeds_credentialboolean, requiredatomicboolean, requiredunverifiedboolean, required: Built and conformance-tested, never run against a real account of this vendor.credential_fieldsarray of object, requiredA list of:
namestring, requiredlabelstring, requiredtypestring, requiredrequiredboolean, requiredhelpstringoptionsarray of objectdefaultstring | number | boolean
config_fieldsarray of object, requiredA list of:
namestring, requiredlabelstring, requiredtypestring, requiredrequiredboolean, requiredhelpstringoptionsarray of objectdefaultstring | number | boolean
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project deploy targetPOST /api/v1/projects/{project}/deploy-targets
Adds a deploy target for one of the installed providers and answers 201 with it; the credential is stored encrypted and never returned. Needs the project-settings permission. config must pass the provider's validation, a credential the provider requires must be present, name must be unused on the project, and the provider's own read-only check of settings and credential must pass.
A signed-in person who has stepped up (confirmed again with a passkey, a recovery code or an emailed code): a live session alone is refused, and no access token is accepted.
Who may call it: A signed-in person who has stepped up; no access token
Parameters
project(path, string)
Body (application/json)
providerstring, required: One of this deployment’s providers, asGET …/deploy-targetslists them underavailable.namestring, required, 1 to 60 charactersconfigobject, default {}: The provider’s settings, as itsconfig_fieldsdescribe them.credentialobject: The provider’s credential fields. Stored encrypted, never returned.is_defaultboolean
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Update a project deploy targetPATCH /api/v1/projects/{project}/deploy-targets/{id}
Changes a deploy target's name, settings or credential. config is merged onto the stored settings, with null removing a key, and must still pass the provider's validation; credential: null clears the stored credential, and the name must stay unique. Needs the project-settings permission.
A signed-in person who has stepped up (confirmed again with a passkey, a recovery code or an emailed code): a live session alone is refused, and no access token is accepted.
Who may call it: A signed-in person who has stepped up; no access token
Parameters
project(path, string)id(path, string)
Body (application/json)
namestring, 1 to 60 charactersconfigobject: Settings to change, merged onto the stored ones;nullremoves a key.credentialone of: object | null: A new credential (rotate), ornullto clear the stored one.One of:
object
null
is_defaultboolean
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a project deploy targetDELETE /api/v1/projects/{project}/deploy-targets/{id}
Removes a deploy target. The provider is first asked to disconnect, which never takes the site down: whatever is already deployed there stays online. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)id(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Create a deploy target checkPOST /api/v1/projects/{project}/deploy-targets/{id}/check
Runs the provider's read-only check against the target's stored settings and credential, without deploying anything. A failed check is an answer, not an error: ok: false with an error sentence. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)id(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List project deploymentsGET /api/v1/projects/{project}/deployments
Lists the project's recent deployments, up to limit (30 by default, at most 200), with no further paging. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)limit(query, integer, optional), at most 200, default 30
200 Success.
What comes back
dataarray of object, requiredA list of:
idstring, requiredaccount_idstring, requiredproject_idstring, requiredbuild_idstring, requireddeploy_target_idstring | null, required: The destination; null once it is removed.type"preview" | "production", requiredstatus"pending" | "running" | "succeeded" | "failed" | "superseded", required:superseded: skipped, because the target already served a newer commit.urlstring | null, requiredis_rollbackboolean, requirederrorstring | null, requiredmetaobject, requireddeployed_bystring | null, requiredcreated_atstring, required: ISO 8601 timestamp.deployed_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
commit_shastring | null, requiredbuild_msnumber | null, required: How long the build took; null when it was not measured.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project deploymentPOST /api/v1/projects/{project}/deployments
Deploys a finished build again, to every production target or to target_ids, and answers 202 with the queued deployments. Needs the deploy-production permission. The build must have succeeded with stored files, must not be an editor bundle, and must be the current live version; to serve an older one, use rollback.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
build_idstring (uuid), required, matches ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$: A build that succeeded, of this project.target_idsarray of string (uuid), 1 to 20 items: The targets to deploy to; omitted, every production target.
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Resolve divergence from the mirrorPOST /api/v1/projects/{project}/divergence/resolve
Ends the state a rollback leaves behind. keep_rollback: true makes the rollback permanent; false discards the revert draft and republishes the newest version. Needs the deploy-production permission (owners, admins and reviewers under review_required). The project must be diverged, and a revert draft that was already published can only be kept.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
draft_idstring (uuid), required, matches ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$: The revert draft the divergence opened.keep_rollbackboolean, required: Keep what the live site serves now (true), or publish the draft (false).
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
List project domainsGET /api/v1/projects/{project}/domains
Lists the custom domains connected to the project, each with its hostname, whether it is primary and its verification status, as one unpaged data list. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
What comes back
dataarray of object, requiredA list of:
idstring, requiredaccount_idstring, requiredproject_idstring, requiredhostnamestring, requiredverification_status"pending" | "verified" | "failed", requiredverification_tokenstring, required: The value of the TXT record that proves the domain is yours.tls_status"pending" | "active" | "failed", requiredis_primaryboolean, requiredcreated_atstring, required: ISO 8601 timestamp.verified_atone of: string | null, requiredOne of:
string. ISO 8601 timestamp.
null
last_checked_atone of: string | null, required: The last DNS check, pass or fail; null until the first.One of:
string. ISO 8601 timestamp.
null
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project domainPOST /api/v1/projects/{project}/domains
Connects a custom domain and answers 201 with the DNS records to create: a TXT record that proves control and a CNAME that points visitors at the site. Needs the project-settings permission. The hostname must be valid and not reserved, and a hostname verified on another project is refused.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
hostnamestring, required, 1 to 253 characters: The host name, e.g.www.example.com; accents are allowed.is_primaryboolean
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a project domainDELETE /api/v1/projects/{project}/domains/{domainId}
Disconnects a custom domain from the project; the site stops answering on that hostname right away, and the removal is recorded. Answers 204. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)domainId(path, string)
204 No content.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Verify a domainPOST /api/v1/projects/{project}/domains/{domainId}/verify
Checks the domain's DNS records now and answers whether it is verified, with a reason when it is not. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)domainId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Download an export archiveGET /api/v1/projects/{project}/downloads/{key}
Downloads the ZIP of a build's site that the zip provider stored, where key is exports/<project>/site-<build>.zip. Any other key is a 404; project export bundles are downloaded from the exports route instead. Needs the project-export permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)key(path, string): May contain unencoded/: this is a path, not a single segment. Encoded slashes will not match.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Export a projectPOST /api/v1/projects/{project}/export
Queues an export bundle of the project (full git history, the built site and media) and answers 202 with export_id and a download_url. Form entries, analytics and build variables are included only for roles allowed to read them. Needs the project-export permission.
A read token may make this request too: it changes nothing a person can see.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)Idempotency-Key(header, string, optional): Optional. A key the caller chooses, at most 160 characters, kept per team. A repeat of the same request (method, path and body) under the same key is answered with the first result and the headerIdempotent-Replay: true, and the work is not done twice. The same key with a different request answers 409; so does a repeat sent while the first is still running, withRetry-After: 5.
202 Success. Headers: Idempotent-Replay.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - default Any other failure, as RFC 9457 problem details.
List project exportsGET /api/v1/projects/{project}/exports
Lists the project's recent export bundles and their status, up to limit (10 by default, at most 50), with how long bundles are kept (kept). Needs the project-export permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)limit(query, integer, optional), at most 50, default 10
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Get a project exportGET /api/v1/projects/{project}/exports/{exportId}
Downloads an export bundle as a ZIP. While it is being packed the answer is 202; a failed export answers 422 with the reason, and a removed one 410. A bundle holding data the caller's role may not read is refused. Needs the project-export permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)exportId(path, string)
200 Success.
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 410 No longer available. It existed and has been removed for good; asking again will not bring it back. (
codeisgone.) - 422 Could not be completed. The work was asked for and could not be done;
detailsays why. (codeisunprocessable.) - default Any other failure, as RFC 9457 problem details.
Create a form entry importPOST /api/v1/projects/{project}/form-entries/import
Imports form entries from a ZIP with a forms/ folder, as an export writes it, sent as the raw body with content type application/zip. The answer counts what was imported, skipped and erased, and the files. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/zip)
string (binary). A ZIP holding a forms/ folder as an export writes it (forms/<form>.csv and forms/files/…), at most limits.max_blob_bytes of /.well-known/webentor-studio. Entries already here are skipped, so sending an archive twice adds nothing.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 413 Payload too large. (
codeispayload_too_large.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
List project formsGET /api/v1/projects/{project}/forms
Lists the project's forms that have entries, with each form's entry count and the time of the newest one. Needs the content-write permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
List form entriesGET /api/v1/projects/{project}/forms/{formId}/entries
Lists a form's entries, newest first, with the form's field labels (fields). Page with limit (50 by default, at most 500) and before, the id of the last entry you have or a time. Needs the content-write permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)formId(path, string)before(query, string, optional)limit(query, integer, optional), at most 500, default 50
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a form entryDELETE /api/v1/projects/{project}/forms/{formId}/entries/{id}
Deletes one visitor's form entry and the files uploaded with it, and records the deletion in the audit log. This cannot be undone. Answers 204. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)formId(path, string)id(path, string)
204 No content.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Get an entry fileGET /api/v1/projects/{project}/forms/{formId}/entries/{id}/files/{n}
Downloads the nth file (counting from 0, as the entry's files list numbers them) uploaded with a form entry, always as an attachment. Needs the content-write permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)formId(path, string)id(path, string)n(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Export a formGET /api/v1/projects/{project}/forms/{formId}/export
Downloads a form's entries as CSV. Past the export cap the file holds the newest entries, and the x-webentor-entries header says how many of the total it carries. Needs the content-write permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)formId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Get project historyGET /api/v1/projects/{project}/history
Returns the last 100 commits of ref (the live branch by default), newest first, as ref and an unpaged data list. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)ref(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
List project importsGET /api/v1/projects/{project}/imports
Lists the project's site imports, newest first, up to limit (10 by default, at most 50), under imports. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)limit(query, integer, optional), at most 50, default 10
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project importPOST /api/v1/projects/{project}/imports
Queues an import of an existing site from url into a draft and answers 202 with the import's record; poll it for progress. Needs the draft-create permission. url must be a public http:// or https:// address, and only one import runs per project at a time.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
urlstring, required, 4 to 2000 characters: The site to import from: anhttp://orhttps://address.max_pagesinteger, 1 to 200: Fetch at most this many pages.on_conflict"replace" | "skip", default "replace": What to do with an entry that already exists.
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Get a project importGET /api/v1/projects/{project}/imports/{importId}
Returns one site import with its status and counts, the draft it wrote into (draft_id), and a per-page report. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)importId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List project mediaGET /api/v1/projects/{project}/media
Lists the media library of the live branch, or of a draft named in draft. Filter with search and mime; page with limit (50 by default, at most 200) and cursor, passing nextCursor back. On the live branch, unpublished counts files the live site does not serve yet. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)cursor(query, string, optional)draft(query, string (uuid), optional)limit(query, integer, optional), at most 200, default 50search(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Upload project mediaPOST /api/v1/projects/{project}/media
Uploads a file (multipart field file, optional path) and answers 201 with the asset and commit; nothing is built. Needs the media-write permission. With draft_id it lands on that draft, which must be open; without it, it goes to the live branch, which is refused under review_required and needs the deploy-production permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (multipart/form-data)
filestring (binary), required: The file. One over this Studio’s upload limit is refused with 413payload_too_large.draft_idstring (uuid): The draft to add it to. Required when the project’spublish_policyisreview_required; without it the file goes onto the live branch, which needsdeploy:production, and out with the next publish.pathstring: The file name to store it under; the uploaded file’s own name when omitted.
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a media assetDELETE /api/v1/projects/{project}/media/{assetId}
Deletes a media asset from a draft named in draft, or from the live branch, which needs the deploy-production permission. Needs the media-write permission. A file still used on pages is refused with 409 unless force=true.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)assetId(path, string)draft(query, string (uuid), optional)force(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Download a media assetGET /api/v1/projects/{project}/media/{assetId}/raw
Returns a media asset's bytes with its content type, read from the live branch or from a draft named in draft. The answer may be cached privately. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)assetId(path, string)draft(query, string (uuid), optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Set project mirrorPUT /api/v1/projects/{project}/mirror
Connects a git remote to mirror the project to and queues a push of the full history; later changes are pushed too. The token is stored encrypted and never returned. Answers 201. Needs the project-settings permission. url must be a public HTTPS address with no credentials in it.
A signed-in person who has stepped up (confirmed again with a passkey, a recovery code or an emailed code): a live session alone is refused, and no access token is accepted.
Who may call it: A signed-in person who has stepped up; no access token
Parameters
project(path, string)
Body (application/json)
urlstring (uri), required, at most 2000 characters: An HTTPS remote, e.g. https://github.com/you/site.git, with no credentials in it.usernamestring, 1 to 120 characters: Cosmetic on most hosts; defaults tox-access-token, GitHub’s convention.tokenstring, required, 1 to 4000 characters: A personal access or deploy token. Stored encrypted, never returned.
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete project mirrorDELETE /api/v1/projects/{project}/mirror
Disconnects the repository mirror and deletes its stored token. Everything already pushed to the remote stays there. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Synchronise a mirrorPOST /api/v1/projects/{project}/mirror/sync
Queues a push to the connected mirror now and answers 202. A project with no mirror answers 404. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Set project preview accessPUT /api/v1/projects/{project}/preview-access
Sets how previews are protected: anyone with the link (link) or a passphrase (password). Needs the project-settings permission. password is required with access: password. Changing it takes effect on the next request.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
access"link" | "password", requiredpasswordstring, 8 to 200 characters: The passphrase previews ask for; required withaccess: password.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Publish a projectPOST /api/v1/projects/{project}/publish
Publishes a site for the first time: queues a production build of the live branch head and answers 202 with build_id and commit. Needs the deploy-production permission, and under review_required an owner, admin or reviewer. A site already published is refused; after that, publish drafts.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - default Any other failure, as RFC 9457 problem details.
Get project publish manifestGET /api/v1/projects/{project}/publish-manifest
Returns where the project publishes compared with what the repository's webentor.cloud.json says, and what writing it would change. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create project publish manifestPOST /api/v1/projects/{project}/publish-manifest
Writes the project's current publish settings into webentor.cloud.json on the live branch as a commit, with no credentials in it. The answer gives the commit, what was withheld, and whether the file was unchanged. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
List project redirectsGET /api/v1/projects/{project}/redirects
Lists the project's redirect rules as one unpaged data list, with the most a project may have (limit) and a description of the accepted rule syntax. Needs the draft-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
What comes back
dataarray of object, requiredA list of:
idstring, requiredaccount_idstring, requiredproject_idstring, requiredfrom_pathstring, requiredto_pathstring, requiredstatus_codenumber, requiredcreated_bystring | null, requiredcreated_atstring, required: ISO 8601 timestamp.
limitnumber, required: The most redirects a project may have.syntaxstring, required: What a source and a target may be, in words.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project redirectPOST /api/v1/projects/{project}/redirects
Adds redirects as one rule, a redirects list, or pasted text with one rule per line; a rule for a path that already has one replaces it. Answers 201. Needs the project-settings permission. Rules that would complete a redirect loop, or take the project past its redirect limit, are refused.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
One of:
fromstring, required, 1 to 1024 characterstostring, required, 1 to 1024 charactersstatusinteger, -9007199254740991 to 9007199254740991: 301 by default.
redirectsarray of object, required, 1 to 500 itemsA list of:
fromstring, required, 1 to 1024 characterstostring, required, 1 to 1024 charactersstatusinteger, -9007199254740991 to 9007199254740991: 301 by default.
textstring, required, 1 to 200000 characters
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) Or: Limit reached. A plan limit, not a transient failure; retrying unchanged will not help. - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a project redirectDELETE /api/v1/projects/{project}/redirects/{redirectId}
Removes one redirect rule from the project; the site stops applying it at once, and the removal is recorded. Answers 204. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)redirectId(path, string)
204 No content.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Get project repositoryGET /api/v1/projects/{project}/repository
Returns the project's repository: clone URL, size, backend, whether its hooks are current, the mirror, and its branches marked live, draft or other. view=mirror answers only the mirror. Needs the repo-read permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Roll back a projectPOST /api/v1/projects/{project}/rollback
Serves an earlier published build (build_id) again and answers 202. A revert draft is opened, and publishing is paused until the divergence is resolved. Needs the deploy-production permission (owners, admins and reviewers under review_required). The build must be a published version with its files kept, not an editor bundle.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
build_idstring (uuid), required, matches ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$: An earlier build that was live, to serve again.
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Get a project upgradeGET /api/v1/projects/{project}/upgrade
Returns the upgrade plan for the project's stack: the version it is on (from) and can move to (to), the package pins that would change, release notes and advisories, whether it is current, and how the chassis files compare with the template. Changes nothing. Needs the repo-write permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project upgradePOST /api/v1/projects/{project}/upgrade
Opens an upgrade draft and queues its build, answering 201; it answers 200 when the project is already current or the upgrade is refused. Needs the repo-write permission. Each chassis path must be a chassis file that differs from the template, and customised ones must also be named in confirm.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)Idempotency-Key(header, string, optional): Optional. A key the caller chooses, at most 160 characters, kept per team. A repeat of the same request (method, path and body) under the same key is answered with the first result and the headerIdempotent-Replay: true, and the work is not done twice. The same key with a different request answers 409; so does a repeat sent while the first is still running, withRetry-After: 5.
Body (application/json)
chassisarray of string, at most 12 items: Chassis files to take from the release as well as the pins, by path: editor.config.ts, src/webentor.ts, src/virtual-modules.d.ts, src/content.config.ts, tsconfig.json, pnpm-workspace.yaml, scripts/assert-build.mjs, scripts/format-content.mjs, scripts/format-content.d.mts, .claude/hooks/guard-bash.mjs, .claude/hooks/validate-content.mjs, astro.config.ts.confirmarray of string, at most 12 items: The customised files amongchassis, named a second time to say their changes may be replaced.
200 Success. Headers: Idempotent-Replay.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 409 Conflict. (
codeisconflict.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
List project webhooksGET /api/v1/projects/{project}/webhooks
Lists the project’s webhook endpoints: address, events, whether each is on, and since when one has been failing. Never a signing secret. Needs the project-settings permission. The events and their payloads are at GET /api/v1/webhook-events and on /docs/webhooks.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a project webhookPOST /api/v1/projects/{project}/webhooks
Adds an endpoint that is sent the project’s events, signed in the Standard Webhooks scheme. Answers 201 with the signing secret, shown this once; an assistant token gets a link where a person reveals it instead. Needs the project-settings permission. The address must be https and public; an unknown event name is refused.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)
Body (application/json)
urlstring (uri), required, at most 2000 characters: Where deliveries are sent: an https:// address reachable from the public internet.eventsarray of "project.created" | "draft.created" | "draft.submitted" | "draft.approved" | "draft.changes_requested" | "review.comment_added" | "draft.scheduled" | "draft.merged" | "draft.discarded" | "draft.published" | "draft.schedule_failed" | "code.published" | "import.finished" | "build.succeeded" | "build.failed" | "deploy.held" | "deployment.production" | "deployment.failed" | "deployment.rolled_back" | "domain.verified" | "domain.failed" | "export.finished" | "project.deletion_scheduled", at most 64 items, default []: The events this endpoint receives. Empty means every event, including ones added later.
201 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Update a project webhookPATCH /api/v1/projects/{project}/webhooks/{webhookId}
Changes an endpoint’s address or events, or switches it off and on with active. Switching it on forgets the failures that switched it off; what it missed is not sent unless you redeliver it from the log. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)
Body (application/json)
urlstring (uri), at most 2000 characters: A new address, checked as a new endpoint’s is.eventsarray of "project.created" | "draft.created" | "draft.submitted" | "draft.approved" | "draft.changes_requested" | "review.comment_added" | "draft.scheduled" | "draft.merged" | "draft.discarded" | "draft.published" | "draft.schedule_failed" | "code.published" | "import.finished" | "build.succeeded" | "build.failed" | "deploy.held" | "deployment.production" | "deployment.failed" | "deployment.rolled_back" | "domain.verified" | "domain.failed" | "export.finished" | "project.deletion_scheduled", at most 64 items: The events this endpoint receives. Empty means every event, including ones added later.activeboolean:falseswitches the endpoint off;trueswitches it on again and forgets its earlier failures.
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 422 Validation failed. The body carries an
issuesarray describing each rejected field. (codeisvalidation_failed.) - default Any other failure, as RFC 9457 problem details.
Delete a project webhookDELETE /api/v1/projects/{project}/webhooks/{webhookId}
Removes an endpoint, with its delivery log; nothing more is sent to it, including retries that were waiting. Answers 204, and the removal is recorded. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)
204 No content.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
List webhook deliveriesGET /api/v1/projects/{project}/webhooks/{webhookId}/deliveries
The endpoint’s delivery log, newest first: each event sent, its status, attempts, the code the endpoint answered and why it failed. Narrow it with status; page back with before, a delivery id. Kept for 30 days. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)before(query, string (uuid), optional)limit(query, integer, optional), at most 100, default 20status(query, string, optional)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
Create a delivery redeliverPOST /api/v1/projects/{project}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver
Sends a delivery’s event to its endpoint once more, with the same message id, within a few seconds. Answers 202 with the new delivery. Refused while the endpoint is switched off, and for a test event. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)deliveryId(path, string)
202 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - 409 Conflict. (
codeisconflict.) - default Any other failure, as RFC 9457 problem details.
Create a webhook rotate secretPOST /api/v1/projects/{project}/webhooks/{webhookId}/rotate-secret
Gives an endpoint a new signing secret and answers it once. The old secret keeps signing beside the new one for a day, so the receiving end can switch without missing a delivery. Needs the project-settings permission; an assistant token gets a reveal link instead.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - 404 Not found. Also returned when the resource exists but the caller may not see it, so that the two cannot be told apart. (
codeisnot_found.) - default Any other failure, as RFC 9457 problem details.
Create a webhook testPOST /api/v1/projects/{project}/webhooks/{webhookId}/test
Sends a webhook.test event to this endpoint now and answers with the delivery: the status code it answered, or why nothing arrived. Works on an endpoint that is switched off, and does not count towards switching one off. Needs the project-settings permission.
Who may call it: A signed-in session, or an access token (write to change anything)
Parameters
project(path, string)webhookId(path, string)
200 Success.
Errors it can answer
- 401 Authentication required. (
codeisunauthenticated.) - 403 Not allowed. (
codeisforbidden.) - default Any other failure, as RFC 9457 problem details.
List webhook eventsGET /api/v1/webhook-events
Every event a webhook endpoint can be sent, in catalogue order, each with its label, a description, the day it first appeared and the JSON Schema of its payload. Public and cacheable: it names no team. The same list is on /docs/webhooks.
Who may call it: Anybody
200 Success.
Errors it can answer
- default Any other failure, as RFC 9457 problem details.