WavefrontDevelopers

REST API

REST API reference

Every operation of the /v1 API, generated from its OpenAPI document when this page was built. Paths are relative to https://wavefront.adwave.com. Load the OpenAPI document into your API client or code generator for the full request and response schemas.

Workspaces

Workspaces you can reach, with their settings, overview and activity.

GET /v1/workspaces

List workspaces you can access

An API key sees only its own workspace (role null).

Scope: any (API key or session)

Responses

StatusDescription
200Workspaces
401unauthorized

GET /v1/workspaces/{ws}/overview

Counts, review queues, your work, recent activity and spend

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Overview
404not_found

GET /v1/workspaces/{ws}/counts

Queue sizes for navigation badges

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Counts
404not_found

GET /v1/workspaces/{ws}/activity

Workspace activity, newest first (audit events for owners only)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
cursorquerystring
limitqueryinteger

Responses

StatusDescription
200Activity
400invalid_request
404not_found

GET /v1/workspaces/{ws}

Workspace name, your role, context source and effective spend and concurrency caps

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Workspace
401unauthorized
404not_found

Members

The people in a workspace, their roles and pending invitations.

GET /v1/workspaces/{ws}/people

Members with names and roles; owners also see pending invitations. API keys get email: null

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200People
404not_found

Context

The workspace documents every generation reads: brief, voice, rules and references.

GET /v1/workspaces/{ws}/context

Current context manifest with per-document summaries

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Manifest
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found

PUT /v1/workspaces/{ws}/context

Push context (multipart: manifest JSON + file:<path> parts for changed files, and an optional base_version field: 409 conflict if another write landed since)

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body (multipart/form-data)

None.

Responses

StatusDescription
200Push result
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
422Unprocessable (see the code)

GET /v1/workspaces/{ws}/context/file

Read one context document as text or sanitized HTML

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
path requiredquerystring
formatquery"text" | "html"
versionqueryintegerAn earlier context version; omit for the latest

Responses

StatusDescription
200Document text or HTML
400invalid_request
404not_found

PUT /v1/workspaces/{ws}/context/file

Create or replace one document as a new context version. workspace.yaml and calendar.json files are validated (400). 422 context_too_large; 409 context_read_only for Git-managed workspaces

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
path requiredstring
body requiredstring

Responses

StatusDescription
200Context version
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
422Unprocessable (see the code)

DELETE /v1/workspaces/{ws}/context/file

Remove one document as a new context version (workspace.yaml can't be removed)

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
path requiredquerystring

Responses

StatusDescription
200Context version
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/context/versions

Recent context versions

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Versions
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/context/restore

Re-push a prior context snapshot as a new latest version. base_version (optional) is the version the caller last saw: 409 conflict if another write landed since

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
version requiredinteger
base_versioninteger

Responses

StatusDescription
200Push result
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/context/thread

Context chat thread

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Thread
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/context/chat

Propose and merge context file updates (no wallet charge)

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
message requiredstring
idempotency_key requiredstring

Responses

StatusDescription
200Chat turn
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

Writing rules

Phrases drafts must never use, should avoid or may use, checked on every draft.

GET /v1/workspaces/{ws}/writing-rules

The workspace's copy rules as Settings → Writing rules shows them: never, avoid and allow lists, advanced regexes (owners), and the built-in catalog in numbers

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Writing rules
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found

PUT /v1/workspaces/{ws}/writing-rules

Write the never, avoid and allow lists (and, for owners, advanced regexes) into the copy_checks file as a new context version; other sections are kept

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
never requiredarray of object
avoid requiredarray of object
allow requiredarray of string
advancedarray of object
base_versioninteger

Responses

StatusDescription
200Push result
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Strategies

Content strategies and their plans: pillars, keywords, calendar and cadence.

GET /v1/workspaces/{ws}/strategies

The workspace's strategies, primary first

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
archivedquery"1"Include archived strategies

Responses

StatusDescription
200Strategies
401unauthorized
404not_found

POST /v1/workspaces/{ws}/strategies

Start a strategy from the primary one's brief and voice; `message` starts the strategist at once. If it can't start, the strategy still exists and studio_error says why. A name already in use is 409 slug_exists

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
name requiredstring
descriptionstring
messagestring

Responses

StatusDescription
200Idempotent replay
201Strategy
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/strategies/{sid}

One strategy with plan counts and state

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200Strategy
404not_found

PATCH /v1/workspaces/{ws}/strategies/{sid}

Rename, describe, pause (autopilot skips it) or archive a strategy

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Request body

NameTypeDescription
namestring
descriptionstring
status"active" | "paused" | "archived"

Responses

StatusDescription
200Strategy
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/strategies/{sid}/plan

The plan draft and its plan_version

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200The plan draft
404not_found

PATCH /v1/workspaces/{ws}/strategies/{sid}/plan

Edit the plan directly, without a strategist turn. Item operations (keywords_add/remove, calendar_upsert/remove, pillars_*, sources_*) change only what they name; brief, voice and calendar.cadence merge field by field; the whole-list fields replace their list. A post with a draft is only dropped by calendar_remove (orphaned_drafts lists them). base_plan_version makes a stale edit a 409 with details.plan_version

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Request body

NameTypeDescription
patch requiredobject
notestring
base_plan_versioninteger

Responses

StatusDescription
200What changed and the studio view
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/studio/plan

The plan draft and its plan_version

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200The plan draft
404not_found

PATCH /v1/workspaces/{ws}/studio/plan

Edit the plan directly, without a strategist turn. Item operations (keywords_add/remove, calendar_upsert/remove, pillars_*, sources_*) change only what they name; brief, voice and calendar.cadence merge field by field; the whole-list fields replace their list. A post with a draft is only dropped by calendar_remove (orphaned_drafts lists them). base_plan_version makes a stale edit a 409 with details.plan_version

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
patch requiredobject
notestring
base_plan_versioninteger

Responses

StatusDescription
200What changed and the studio view
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Studio

The strategist conversation that drafts and edits a strategy's plan.

GET /v1/workspaces/{ws}/studio

The strategist conversation and plan draft

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Studio view
404not_found

POST /v1/workspaces/{ws}/studio/messages

Send the strategist a message; the turn runs in the background (poll GET). Busy: 409 conflict with details.message_id

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
message requiredstring

Responses

StatusDescription
200Idempotent replay
202Studio view plus message_id (the reply to poll)
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

POST /v1/workspaces/{ws}/studio/messages/{mid}/retry

Run a failed reply again; returns the studio view and the new message_id

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
mid requiredpathstring

Responses

StatusDescription
202Studio view
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

POST /v1/workspaces/{ws}/studio/messages/{mid}/undo

Undo the latest plan change

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
mid requiredpathstring

Responses

StatusDescription
200Studio view
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/studio/reset

Start a fresh conversation; the plan stays

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Studio view
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/studio/save

Save the plan as workspace documents (a new context version)

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Context version, paths and the studio view
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/strategies/{sid}/studio

The strategist conversation and plan draft

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200Studio view
404not_found

POST /v1/workspaces/{ws}/strategies/{sid}/studio/messages

Send the strategist a message; the turn runs in the background (poll GET). Busy: 409 conflict with details.message_id

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
message requiredstring

Responses

StatusDescription
200Idempotent replay
202Studio view plus message_id (the reply to poll)
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

POST /v1/workspaces/{ws}/strategies/{sid}/studio/messages/{mid}/retry

Run a failed reply again; returns the studio view and the new message_id

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug
mid requiredpathstring

Responses

StatusDescription
202Studio view
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

POST /v1/workspaces/{ws}/strategies/{sid}/studio/messages/{mid}/undo

Undo the latest plan change

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug
mid requiredpathstring

Responses

StatusDescription
200Studio view
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/strategies/{sid}/studio/reset

Start a fresh conversation; the plan stays

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200Studio view
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/strategies/{sid}/studio/save

Save the plan as workspace documents (a new context version)

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200Context version, paths and the studio view
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Backlog

A strategy's idea backlog, which autopilot draws on to fill the calendar.

GET /v1/workspaces/{ws}/backlog

The idea backlog: counts, the next ideas autopilot takes today, and a page of ideas (status=open|used|skipped, limit up to 500, offset)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
statusquery"open" | "used" | "skipped"
limitqueryinteger
offsetqueryinteger

Responses

StatusDescription
200Backlog
400invalid_request
404not_found

POST /v1/workspaces/{ws}/backlog/ideas

Append ideas to the backlog (created on first use). A bad idea, or an id already there, is left out and listed in warnings; 400 when none are valid

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
ideas requiredarray of object

Responses

StatusDescription
201Added
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/backlog/import

Load a backlog from JSON ({defaults?, ideas}). mode merge (default) updates ideas with the same id and appends new ones; replace makes the backlog exactly the import. Bad ideas are left out and listed in warnings

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
mode"merge" | "replace"Default merge.
version1
defaultsobject
ideas requiredarray of object

Responses

StatusDescription
200Imported
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/backlog/preview

What autopilot would schedule from the backlog over the next days (default 30, up to 90) and the mix that gives, without writing anything: items with why, shares per dimension against targets, spacing conflicts, unfilled slots and the policy as applied. plan=draft tries the unsaved plan's mix; rebalance=1 previews a rebalance. Without a cadence, one post a day is assumed

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
daysqueryinteger
planquery"saved" | "draft"
rebalancequery"0" | "1"

Responses

StatusDescription
200Preview
400invalid_request
404not_found

POST /v1/workspaces/{ws}/backlog/rebalance

Re-plan this strategy's autopilot items in the fill window that have no draft yet with the editorial mix: they leave the calendar, their ideas reopen (released), and the slots are filled again (added, with why). Items with any draft stay; nothing is cancelled. 409 invalid_state without a cadence

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200What was released and filled
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/strategies/{sid}/backlog

The idea backlog: counts, the next ideas autopilot takes today, and a page of ideas (status=open|used|skipped, limit up to 500, offset)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug
statusquery"open" | "used" | "skipped"
limitqueryinteger
offsetqueryinteger

Responses

StatusDescription
200Backlog
400invalid_request
404not_found

POST /v1/workspaces/{ws}/strategies/{sid}/backlog/ideas

Append ideas to the backlog (created on first use). A bad idea, or an id already there, is left out and listed in warnings; 400 when none are valid

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Request body

NameTypeDescription
ideas requiredarray of object

Responses

StatusDescription
201Added
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/strategies/{sid}/backlog/import

Load a backlog from JSON ({defaults?, ideas}). mode merge (default) updates ideas with the same id and appends new ones; replace makes the backlog exactly the import. Bad ideas are left out and listed in warnings

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Request body

NameTypeDescription
mode"merge" | "replace"Default merge.
version1
defaultsobject
ideas requiredarray of object

Responses

StatusDescription
200Imported
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/strategies/{sid}/backlog/preview

What autopilot would schedule from the backlog over the next days (default 30, up to 90) and the mix that gives, without writing anything: items with why, shares per dimension against targets, spacing conflicts, unfilled slots and the policy as applied. plan=draft tries the unsaved plan's mix; rebalance=1 previews a rebalance. Without a cadence, one post a day is assumed

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug
daysqueryinteger
planquery"saved" | "draft"
rebalancequery"0" | "1"

Responses

StatusDescription
200Preview
400invalid_request
404not_found

POST /v1/workspaces/{ws}/strategies/{sid}/backlog/rebalance

Re-plan this strategy's autopilot items in the fill window that have no draft yet with the editorial mix: they leave the calendar, their ideas reopen (released), and the slots are filled again (added, with why). Items with any draft stay; nothing is cancelled. 409 invalid_state without a cadence

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
sid requiredpathstringStrategy id or slug

Responses

StatusDescription
200What was released and filled
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/backlog/fill

Fill open calendar slots from every active strategy's backlog now, as the 30-minute autopilot run does. 409 invalid_state without a cadence

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200What was filled
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Calendar

The saved content calendar, drafting its posts, and personal iCalendar feeds.

GET /v1/workspaces/{ws}/calendar

Every strategy's saved calendar with each post's draft status (?strategy= filters; an unknown strategy is a 404)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
strategyquerystringStrategy id or slug

Responses

StatusDescription
200Calendar
404not_found

POST /v1/workspaces/{ws}/calendar/draft

Draft calendar posts now: item ids, or everything due through a date. Wallet, spend and concurrency limits stop the run early (`stopped`), they are not errors

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
item_idsarray of string
strategystring
throughstring
limitintegerDefault 5.

Responses

StatusDescription
200Nothing started
202Started
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Generations

Asynchronous generation of articles, images, copy and strategies, and the kinds on offer.

GET /v1/kinds

Generator kinds and their input JSON Schemas

Scope: any (API key or session)

Responses

StatusDescription
200Kinds
401unauthorized

GET /v1/workspaces/{ws}/generations

List generations (newest first)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
statusquerystringWorkflow status, or several comma-separated (e.g. queued,running,needs_input). One of: queued, running, needs_input, ready_for_review, incomplete_budget, failed, cancelled, expired; an unknown one is a 400
review_statusquery"pending" | "changes_requested" | "approved" | "superseded"
kindquerystring
viewquery"awaiting_review" | "mine" | "assigned"A review queue for the caller
qquerystringSearch titles and briefs
latestquery"1"One row per piece of content (its newest generation)
strategyquerystringStrategy id or slug (404 if unknown): generations whose input.plan.strategy is that strategy, i.e. drafted from its calendar. One-off generations belong to no strategy
assignmentquerystringCalendar assignment id
publishingquery"scheduled" | "published" | "not_scheduled"Where the content stands at its destinations: scheduled (soonest first), published (newest first) or not_scheduled
cursorquerystringnext_cursor from the previous page (opaque)
limitqueryinteger

Responses

StatusDescription
200Page of generations
400invalid_request
401unauthorized
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/generations

Create a generation

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
kind requiredstring
inputobjectDefault {}.

Responses

StatusDescription
200Idempotent replay of the original result (replayed true)
202Accepted: the generation is queued (replayed false)
400invalid_request
401unauthorized
402insufficient_funds (the wallet or credit balance is too low) or plan_required (the workspace needs a plan or add-on for this; details.feature). Both carry details.billing_url
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
422Unprocessable (see the code)
429Rate, spend or concurrency limit (details.retry_after)

GET /v1/workspaces/{ws}/generations/{id}

Generation with events, versions and the content item's version history

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Generation
404not_found

POST /v1/workspaces/{ws}/generations/{id}/inputs

Answer a needs_input generation

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
answers requiredobject

Responses

StatusDescription
202Resuming
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/generations/{id}/cancel

Cancel a queued, running or waiting generation

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Cancelled
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Versions

The versions a generation produces: manifests, files, exports and revisions.

GET /v1/workspaces/{ws}/versions/{vid}

Version manifest, review summary and 15-minute file URLs

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
vid requiredpathstring
textquery"1"

Responses

StatusDescription
200Version
404not_found

GET /v1/workspaces/{ws}/versions/{vid}/export

Export an article version as clean HTML, Markdown with front matter, portable JSON or a zip. Approved versions for any reader; a draft needs the edit permission (owner or editor session, or a key with generations:write), else 409 not_approved. Images are absolute media URLs; a draft's are 15-minute signed links (x-wavefront-images-expire-at)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
vid requiredpathstring
formatquery"html" | "md" | "json" | "zip"Default html
jsonldquery"1"html: append the JSON-LD script
body_onlyquery"1"html, md: leave out the H1 and hero
front_matterquerystringmd and zip: `none`, or comma-separated `field` or `field:key` (key renames it). Fields: title, h1, slug, seo_title, meta_description, canonical_url, excerpt, date, author, author_url, categories, tags, hero_image, hero_alt, version_id, subtitle, keywords, sources, content_type
downloadquery"1"Send as an attachment

Responses

StatusDescription
200The export (zip: article.html, article.md, article.json, images/)
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/versions/{vid}/revisions

Request a revision (creates the next version)

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
vid requiredpathstring
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
feedback requiredstring

Responses

StatusDescription
200Idempotent replay (replayed true)
202Revision started
400invalid_request
402insufficient_funds (the wallet or credit balance is too low) or plan_required (the workspace needs a plan or add-on for this; details.feature). Both carry details.billing_url
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

POST /v1/workspaces/{ws}/versions/{vid}/apply

Apply an approved strategy version to the workspace context

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
vid requiredpathstring

Responses

StatusDescription
200Context version created
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/contents/{contentId}/versions

Every version of a piece of content, across its revisions

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
contentId requiredpathstring

Responses

StatusDescription
200Versions
404not_found

Reviews & comments

Review requests, approval decisions and the comment thread on a piece of content.

PATCH /v1/workspaces/{ws}/generations/{id}

Ask an owner or editor to review, or clear the request. The reviewer gets an email (at most one per generation per 10 minutes)

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
assignee_id requiredstring | null

Responses

StatusDescription
200Generation
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found

GET /v1/workspaces/{ws}/generations/{id}/comments

The review thread for this content item, across revisions

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Comments
404not_found

POST /v1/workspaces/{ws}/generations/{id}/comments

Comment (any member; keys need generations:write)

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring
Idempotency-KeyheaderstringRetry safely for 7 days: the same key and body replays the original result (200); a different body is 409 idempotency_conflict

Request body

NameTypeDescription
body requiredstring
version_idstring

Responses

StatusDescription
200Idempotent replay
201Comment
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

DELETE /v1/workspaces/{ws}/generations/{id}/comments/{cid}

Delete a comment (its author, or an owner)

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring
cid requiredpathstring

Responses

StatusDescription
204Deleted
403forbidden, or a missing API key scope (details.missing)
404not_found

Publishing

Publishing approved versions to destinations, and withdrawing them.

POST /v1/workspaces/{ws}/versions/{vid}/publish

Publish an approved version to a destination

Scope: publish

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
vid requiredpathstring

Request body

NameTypeDescription
destination_id requiredstring
mode"publish" | "draft" | "schedule"
publish_atstring (date-time)
send_newsletterboolean
image_version_idstring

Responses

StatusDescription
202Publication queued
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/publications

Publications, newest first

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
statusquery"queued" | "sending" | "building" | "verifying" | "published" | "draft_created" | "scheduled" | "failed" | …
statequery"queued" | "sending" | "building" | "verifying" | "published" | "draft_created" | "scheduled" | "failed" | …Generic state; matches legacy statuses too, so published includes staged
destination_idquerystring
content_idquerystringEvery publication of one content item across its versions
cursorquerystringnext_cursor from the previous page
limitqueryinteger

Responses

StatusDescription
200Page of publications
400invalid_request
404not_found

GET /v1/workspaces/{ws}/publications/{id}

Publication status and receipt

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Publication
404not_found

Schedules

Publishing an approved version at a set time or on its calendar date.

GET /v1/workspaces/{ws}/schedules

Schedules by publish time: active ones, or all with state=all

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
statequery"active" | "all"
content_idquerystring
fromquerystring (date-time)publish_at at or after
toquerystring (date-time)publish_at before
limitqueryinteger

Responses

StatusDescription
200Schedules
400invalid_request
404not_found

POST /v1/workspaces/{ws}/schedules

Schedule an approved version to publish at publish_at, or on its calendar date (on_calendar_date, at time in the workspace's time zone). Native where the destination schedules posts itself; otherwise Wavefront starts it within 5 minutes of the time. 409 schedule_exists when the content already has one there

Scope: publish

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
version_id requiredstring
destination_id requiredstring
mode"publish" | "draft"
publish_atstring (date-time)
on_calendar_dateboolean
timestring

Responses

StatusDescription
201Scheduled
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/schedules/{id}

A schedule, its publication and its events

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Schedule
404not_found

PATCH /v1/workspaces/{ws}/schedules/{id}

Move a schedule to a new time; a post the destination holds gets the new time there (an update)

Scope: publish

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
publish_atstring (date-time)
on_calendar_dateboolean
timestring
version_idstring

Responses

StatusDescription
200Rescheduled
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/schedules/{id}/cancel

Cancel a schedule before its time. A post the destination holds is deleted there (or made a draft where it can't delete); 409 manual_withdraw_required when it can do neither

Scope: publish

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Cancelled
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Destinations

Where content is published (CMSs, sites, webhooks), with their settings and encrypted secrets.

GET /v1/workspaces/{ws}/destinations/types

Destination types this deployment can set up: label, icon, capabilities, config and secret JSON Schemas, field help, OAuth and mapping steps

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Types
404not_found

GET /v1/workspaces/{ws}/destinations

List publishing destinations with each adapter's capabilities (secrets never returned)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Destinations
404not_found

Imports

Importing documents into context from Google Drive, Notion and Confluence.

GET /v1/workspaces/{ws}/imports

Document import providers (Google Drive, Notion, Confluence) with whether this server has each set up and the workspace's connection, plus every import. Never the tokens; the account name only for sessions

Scope: context:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Providers and imports
404not_found

PATCH /v1/workspaces/{ws}/imports/{id}

Turn the daily resync on or off

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
resync required"off" | "daily"

Responses

StatusDescription
200Import
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

DELETE /v1/workspaces/{ws}/imports/{id}

Stop tracking an import. Its documents stay

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
204Removed
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/imports/{id}/sync

Read the import's sources again now. state is updated (one new context version; restore the one before to undo), unchanged or busy. Documents are removed only when the source confirms they are gone

Scope: context:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Resync result
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
422Unprocessable (see the code)
429Rate, spend or concurrency limit (details.retry_after)
502Error

Catalog

The site's catalog feed of products, listings or other entities that drafts can link to.

POST /v1/workspaces/{ws}/catalog/refresh

Refetch the site catalog feed now instead of waiting for catalog.refresh_hours. Returns url, fetched_at, cached, previous_fetched_at, entities per type, added, removed, skipped and problems. A copy younger than a minute is returned as is (cached: true), so repeated calls don't refetch. 409 invalid_state without a catalog; a feed that can't be read leaves the cache unchanged (503 misconfigured)

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200The refreshed copy
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
503Error

Search data

Search Console, Analytics and Bing connections and the search performance they report.

GET /v1/workspaces/{ws}/google

The Search Console and Analytics connection: status, picked properties, last sync. Never the token; the Google email only for sessions

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Connection
404not_found

POST /v1/workspaces/{ws}/google/sync

Fetch fresh data now (data synced in the last 10 minutes is returned as is). The cron syncs daily

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Sync state
403forbidden, or a missing API key scope (details.missing)
409conflict (see the code)
502Error

GET /v1/workspaces/{ws}/bing

The Bing Webmaster Tools connection: status, picked site, last sync. Never the API key

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Connection
404not_found

POST /v1/workspaces/{ws}/bing/sync

Fetch fresh Bing data now (at most one try per 10 minutes: fresh, or too_soon after a failed try). The cron syncs daily

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Sync state
403forbidden, or a missing API key scope (details.missing)
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)
502Error

GET /v1/workspaces/{ws}/search-performance

The last syncs: Search Console totals, queries and pages, Analytics totals, landing pages and channels, each with the prior 28 days; Bing totals, queries and pages over the latest 4 weeks against the 4 before; and opportunities from both engines

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
limitqueryintegerRows per list (default 50)

Responses

StatusDescription
200Search performance
404not_found

GET /v1/workspaces/{ws}/search-performance/page

One page's Search Console, Analytics and Bing numbers, its top Google queries, and a Search Console URL Inspection link

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
url requiredquerystring (uri)

Responses

StatusDescription
200Page performance
400invalid_request
404not_found

Site metrics

Site authority and visibility metrics over time.

GET /v1/workspaces/{ws}/site-metrics

Site authority and visibility metrics with history: each provider's state (on, off with what turns it on for owners, or error), and each metric with its definition, latest, previous and baseline values, changes and points for the workspace's registrable domain. ?metrics= (comma-separated ids), ?from= and ?to= (YYYY-MM-DD) narrow the points

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
metricsquerystringComma-separated metric ids (tranco.rank,gsc.clicks)
fromquerystring (date)First day of points
toquerystring (date)Last day of points

Responses

StatusDescription
200Site metrics
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/site-metrics/refresh

Queue a check of every free provider, and keyed ones that are due (never twice in their month). Answers 202 with state queued and the current site_metrics; GET …/site-metrics shows checking: true until the check is done. Once every 10 minutes (429 rate_limited with retry_after); 409 conflict while a check runs

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
202Queued
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

Suggestions

Strategy suggestions found in the site's search data, to approve or dismiss.

GET /v1/workspaces/{ws}/suggestions

Strategy suggestions from the site's search data, open ones best first: type, title, why (evidence with its numbers and window), impact, the typed actions approval runs, status, and the result. counts by status and last_run_at

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
statusquerystringComma-separated: proposed, approved, dismissed, done, failed, expired
limitqueryinteger
offsetqueryinteger

Responses

StatusDescription
200Suggestions
400invalid_request
404not_found

GET /v1/workspaces/{ws}/suggestions/settings

Suggestion messages (weekly digest, immediate message for a large decay, email) and per-type auto-apply

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Settings
404not_found

POST /v1/workspaces/{ws}/suggestions/detect

Run the detectors on the stored search data now (they also run after every Google and Bing sync). Within 10 minutes of the last run, returns 200 with state fresh and the open suggestions

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200What the run found
403forbidden, or a missing API key scope (details.missing)
404not_found

GET /v1/workspaces/{ws}/suggestions/{id}

One suggestion

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Suggestion
404not_found

PATCH /v1/workspaces/{ws}/suggestions/{id}

Edit a proposed suggestion's actions: the feedback text, the share, the ideas, which posts add links. Each action keeps its type and target; actions can be removed, not added

Scope: generations:write (or an owner or editor session); what a key approves never auto-approves

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
actions requiredarray of object

Responses

StatusDescription
200Suggestion
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/suggestions/{id}/approve

Approve (optionally with edited actions): Wavefront runs each action through the app's own functions (backlog ideas, revisions, links, plan keywords) and records the result; status becomes done or failed. An action that can't run (a revision already in progress, no budget, a limit) is recorded in result with its error code, and the response is still 200. Ideas and revisions carry the approver's provenance: a person's in the web app, a key's otherwise (never auto-approved). A failed one can be approved again. 409 when already decided

Scope: generations:write (or an owner or editor session); what a key approves never auto-approves

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
notestring | null
actionsarray of object
edited_atstring | null

Responses

StatusDescription
200Suggestion with result
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/suggestions/{id}/dismiss

Dismiss a proposed (or failed) suggestion. The same finding isn't suggested again for 90 days

Scope: generations:write (or an owner or editor session); what a key approves never auto-approves

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
notestring | null

Responses

StatusDescription
200Suggestion
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

Webhooks

Event subscriptions that POST signed events to your URL when things happen in a workspace.

GET /v1/workspaces/{ws}/webhooks

Event subscriptions and the event types they can ask for. Never the signing secrets

Scope: webhooks (or an owner session)

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Subscriptions
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/webhooks

Add a webhook: an https URL and the events to send. The response holds the whsec_ signing secret; it is not shown again

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Request body

NameTypeDescription
url requiredstring
events requiredarray of "generation.ready_for_review" | "generation.review_requested" | "generation.needs_input" | "generation.failed" | "version.approved" | "version.changes_requested" | "publication.published" | "publication.failed" | …
descriptionstring | null

Responses

StatusDescription
201Subscription and secret
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

GET /v1/workspaces/{ws}/webhooks/sample

Sample bodies for one event type, shaped like deliveries plus the webhook-id as id: the workspace's latest events of that type (source recent), or one made-up example (source example). Keys need generations:read too

Scope: webhooks (or an owner session)

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
event requiredquery"generation.ready_for_review" | "generation.review_requested" | "generation.needs_input" | "generation.failed" | "version.approved" | "version.changes_requested" | "publication.published" | "publication.failed" | …
limitqueryintegerA whole number from 1 to 10; anything else is 400

Responses

StatusDescription
200Samples
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found

GET /v1/workspaces/{ws}/webhooks/{id}

One subscription: status, events, failure run

Scope: webhooks (or an owner session)

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Subscription
403forbidden, or a missing API key scope (details.missing)
404not_found

PATCH /v1/workspaces/{ws}/webhooks/{id}

Change the URL, events or description; enabled false pauses it, true turns it back on and clears its failures

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Request body

NameTypeDescription
urlstring
eventsarray of "generation.ready_for_review" | "generation.review_requested" | "generation.needs_input" | "generation.failed" | "version.approved" | "version.changes_requested" | "publication.published" | "publication.failed" | …
descriptionstring | null
enabledboolean

Responses

StatusDescription
200Subscription
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found

DELETE /v1/workspaces/{ws}/webhooks/{id}

Delete a subscription and its delivery log

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
204Deleted
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/webhooks/{id}/rotate-secret

Make a new signing secret (returned once). The old one also signs for 24 hours; another rotation in that time is 409

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
200Subscription and secret
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)

POST /v1/workspaces/{ws}/webhooks/{id}/test

Send a webhook.test event to this subscription now. Shares a per-workspace limit with redeliver (429)

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring

Responses

StatusDescription
202Delivery
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

GET /v1/workspaces/{ws}/webhooks/{id}/deliveries

The delivery log, newest first, kept 30 days

Scope: webhooks (or an owner session)

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring
limitqueryinteger
cursorquerystringnext_cursor from the previous page

Responses

StatusDescription
200Deliveries
400invalid_request
403forbidden, or a missing API key scope (details.missing)
404not_found

GET /v1/workspaces/{ws}/webhooks/{id}/deliveries/{did}

One delivery with the body sent and every attempt. Keys without generations:read get body null

Scope: webhooks (or an owner session)

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring
did requiredpathstring

Responses

StatusDescription
200Delivery
403forbidden, or a missing API key scope (details.missing)
404not_found

POST /v1/workspaces/{ws}/webhooks/{id}/deliveries/{did}/redeliver

Send a finished delivery again: same webhook-id and body, a fresh retry schedule. 409 while it is still being sent or the subscription is off

Scope: webhooks (or an owner session); subscribing also needs generations:read, and a key changes only subscriptions it created

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
id requiredpathstring
did requiredpathstring

Responses

StatusDescription
202Delivery
403forbidden, or a missing API key scope (details.missing)
404not_found
409conflict (see the code)
429Rate, spend or concurrency limit (details.retry_after)

Integrations

Slack, Microsoft Teams, Asana and Trello connections.

GET /v1/workspaces/{ws}/task-sync

Project tool sync: which tools this server offers and the workspace's Asana and Trello connections, with the picked project or board, task counts and the last sync. Never a token

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Connections
404not_found

POST /v1/workspaces/{ws}/task-sync/{provider}/sync

Queue a sync now. Saved plans, drafts, reviews and publishing queue one too, and the cron reconciles daily

Scope: generations:write

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
provider requiredpath"asana" | "trello"

Responses

StatusDescription
200Skipped: a sync started in the last 30 seconds (too_soon)
202Queued
403forbidden, or a missing API key scope (details.missing)
409conflict (see the code)

Billing

The plan, the credit balance, credit estimates and public pricing.

GET /v1/pricing

Plans, packs and the trial, with posts a month from the trailing 30-day measured average credits per published post

Scope: none

Responses

StatusDescription
200Pricing

GET /v1/workspaces/{ws}/billing/balance

The balance alone: credits and plan, by billing mode

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Balance
404not_found

GET /v1/workspaces/{ws}/billing

The plan, credit balance and history (members)

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Billing
401unauthorized
404not_found

GET /v1/workspaces/{ws}/billing/estimates

Credit estimates per kind before a run (credits workspaces): the trailing 30-day average and the most a run can hold

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug

Responses

StatusDescription
200Estimates
401unauthorized
404not_found

GET /v1/workspaces/{ws}/billing/checkout/{session}

Confirm a Checkout session and return the updated balance

Scope: generations:read

Parameters

NameInTypeDescription
ws requiredpathstringWorkspace slug
session requiredpathstring

Responses

StatusDescription
200Fulfillment
404not_found

Account

You: your profile, browser sessions and invitations.

GET /v1/me

You: profile, memberships, pending invitations. For an API key: its id, scopes and workspace (id, slug, name)

Scope: any (API key or session)

Responses

StatusDescription
200Me
401unauthorized

Web app only

These operations need a person signed in to the web app (they are marked x-session-only in the OpenAPI document). API keys and MCP tokens are refused. They are listed so you know what exists, not to call.

Show 70 web-app-only operations
OperationSummary
POST /v1/workspacesCreate a workspace (web session)
POST /v1/workspaces/{ws}/leaveLeave the workspace (the last active owner cannot)
PUT /v1/workspaces/{ws}/destinations/{did}/indexnowTurn IndexNow on or off for a destination (owner). The first time, a key is generated; the site must host /<key>.txt
PATCH /v1/workspaces/{ws}/destinations/{did}Edit a destination's name, config (replaced whole; refused while publishing to it), default_mode or secret (owner). Pointing a URL or host field somewhere new needs the whole secret again
DELETE /v1/workspaces/{ws}/destinations/{did}Remove a publishing destination (owner); refused while publishing to it
POST /v1/workspaces/{ws}/destinations/{did}/secretRotate a destination's secret (owner): typed fields replace stored ones, or an OAuth grant replaces it all. Never returned
POST /v1/workspaces/{ws}/destinations/testTest a destination's settings before saving (owner): runs the adapter's test; 200 with ok, or the stage that failed and why
POST /v1/workspaces/{ws}/destinations/mappingThe field-mapping step (owner): the adapter's targets and remote fields, and Wavefront's fields to map onto them
POST /v1/workspaces/{ws}/destinations/oauth/startStart connecting a destination with OAuth (owner, web session): returns the consent URL and a grant id
GET /v1/workspaces/{ws}/destinations/oauth/{gid}An OAuth connection you started: whether it connected, and the form it was started with (never the token)
POST /v1/workspaces/{ws}/destinations/{did}/testSend a test with the stored settings (owner). A webhook gets a signed ping event; returns ok, message and the delivery (status code, timing)
POST /v1/workspaces/{ws}/destinations/{did}/rotate-secretA new signing secret for a webhook destination (owner), returned once. The old one also signs for 24 hours unless immediately is true
GET /v1/workspaces/{ws}/social/ayrshareSocial posting through Ayrshare (owner): whether this deployment offers it (and X), the workspace's profile, and the accounts linked to it
POST /v1/workspaces/{ws}/social/ayrshare/linkA 5-minute Ayrshare page where the owner links the workspace's social accounts (owner, web session). The first call creates the workspace's Ayrshare profile
PATCH /v1/meSet your display name (web session)
POST /v1/me/sessions/revoke-othersSign out every other browser (web session)
POST /v1/invitations/{ws}/acceptAccept an invitation sent to your address (web session)
POST /v1/invitations/{ws}/declineDecline an invitation sent to your address (web session)
POST /v1/workspaces/{ws}/versions/{vid}/approveApprove or request changes (web session only)
POST /v1/workspaces/{ws}/publications/{id}/withdrawWithdraw a publication: the destination deletes the item, Wavefront confirms it is gone, then marks it withdrawn (owner session)
POST /v1/workspaces/{ws}/publications/{id}/withdrawnMark a publication withdrawn after deleting it at the destination by hand, for destinations that can't delete (owner session)
PATCH /v1/workspaces/{ws}Rename the workspace (owner); the slug never changes
GET /v1/workspaces/{ws}/membersList members (owner)
POST /v1/workspaces/{ws}/membersAdd a member by email (owner)
PATCH /v1/workspaces/{ws}/members/{mid}Change a member's role (owner)
DELETE /v1/workspaces/{ws}/members/{mid}Remove a member (owner)
GET /v1/workspaces/{ws}/api-keysList API keys (owner)
POST /v1/workspaces/{ws}/api-keysCreate an API key (owner); the key is shown once
DELETE /v1/workspaces/{ws}/api-keys/{kid}Revoke an API key (owner)
POST /v1/workspaces/{ws}/destinationsRegister a destination (owner) with a secret or an OAuth grant; secrets are encrypted at rest. default_mode defaults to draft where the adapter can. A webhook may send an empty secret: the response then carries signing_secret, once
PATCH /v1/workspaces/{ws}/googlePick the Search Console site and Analytics property to read (owner), then sync. null clears a pick
DELETE /v1/workspaces/{ws}/googleDisconnect Google (owner): deletes the token and the synced data
POST /v1/workspaces/{ws}/google/connectStart connecting Google (owner, web session only). Returns the consent URL to send the browser to
GET /v1/workspaces/{ws}/google/propertiesSearch Console sites and Analytics properties the connected account can read, with the likely site match
POST /v1/workspaces/{ws}/bingConnect Bing with a Bing Webmaster API key (owner, web session only). The key is checked with Bing, stored encrypted and never returned; answers with the verified sites to pick from
PATCH /v1/workspaces/{ws}/bingPick the verified Bing site to read (only the owner who connected), then sync. null clears it
DELETE /v1/workspaces/{ws}/bingDisconnect Bing (owner): deletes the stored key and the synced Bing data
GET /v1/workspaces/{ws}/bing/sitesSites verified in the connected Bing Webmaster account, with the likely match for the workspace's site
POST /v1/workspaces/{ws}/importsImport a preview as one context version (web session; the person who previewed). Documents go under imported/<provider>/. resync daily re-reads the source each day. 409 context_read_only for Git-managed workspaces; 422 context_too_large past the document limit
POST /v1/workspaces/{ws}/imports/previewDry run (web session; the person who connected the provider): reads and converts the picked files, pages, databases or spaces, and lists each document's path, size and status (new or skipped, with renamed_from when a path was taken). Nothing is written. The preview can be imported for an hour
POST /v1/workspaces/{ws}/imports/{provider}/connectStart connecting google_drive, notion or confluence (owner, web session only). Returns the consent URL. 503 when the server has no client for it
DELETE /v1/workspaces/{ws}/imports/{provider}/connectionDisconnect a provider (owner). Its imports stop and are removed; imported documents stay
GET /v1/workspaces/{ws}/imports/{provider}/browseWhat the connected account shares (web session; the person who connected): Notion pages and databases, or Confluence spaces (and a space's pages with parent=<space id>). Google Drive files are picked in the Google Picker instead
POST /v1/workspaces/{ws}/task-sync/{provider}/connectStart connecting Asana (OAuth) or Trello (authorize page) as an owner in the web app. Returns {url} to send the browser to
POST /v1/workspaces/{ws}/task-sync/trelloFinish connecting Trello with the token from the return URL's fragment and the state from its query (owner, the same browser that started)
GET /v1/workspaces/{ws}/task-sync/{provider}/projectsAsana projects or Trello boards the connected account can see (only the owner who connected)
PATCH /v1/workspaces/{ws}/task-sync/{provider}Pick the project or board tasks go to (only the owner who connected), then sync. null stops syncing; links to tasks in an earlier project are forgotten
DELETE /v1/workspaces/{ws}/task-sync/{provider}Disconnect (owner): revokes the token and forgets the task links. Tasks already made stay in the tool
PATCH /v1/workspaces/{ws}/suggestions/settingsOwners in the web app: digest weekly|off, urgent, email, auto_apply (types Wavefront carries out without asking; off by default) and auto_apply_published (may revise published posts)
GET /v1/workspaces/{ws}/slackThe Slack connection: team, channel, status (active, paused, reconnect), the messages it posts, reviewer DMs and recent deliveries. Never the token
PATCH /v1/workspaces/{ws}/slackChoose which messages go to Slack, turn reviewer DMs on or off, or pause (enabled false) and resume
DELETE /v1/workspaces/{ws}/slackDisconnect Slack: revokes the token and deletes the connection and its log
POST /v1/workspaces/{ws}/slack/connectStart Add to Slack (owner, web session only). Returns Slack's install URL, where the installer picks the channel
POST /v1/workspaces/{ws}/slack/testPost a test message to the connected channel now. Shares the per-workspace webhook send limit (429)
GET /v1/workspaces/{ws}/microsoft-teamsThe Microsoft Teams connection: the webhook URL's host and label, status (active, paused, reconnect), the messages it posts and recent deliveries. Never the URL
PUT /v1/workspaces/{ws}/microsoft-teamsConnect Teams with a Workflows webhook URL (https on powerplatform.com or logic.azure.com), or replace the URL; the chosen messages are kept and it turns back on
PATCH /v1/workspaces/{ws}/microsoft-teamsChoose which messages go to Teams, set the label, or pause (enabled false) and resume
DELETE /v1/workspaces/{ws}/microsoft-teamsDisconnect Teams: deletes the stored URL and the connection's log
POST /v1/workspaces/{ws}/microsoft-teams/testPost a test card to Teams now. Shares the per-workspace webhook send limit (429)
POST /v1/workspaces/{ws}/members/{mid}/inviteResend a pending invitation (owner)
PATCH /v1/workspaces/{ws}/settingsUpdate spend and concurrency caps (owner; app-managed workspaces, 409 context_read_only for Git-managed ones)
GET /v1/workspaces/{ws}/calendar/feedWhether you have a calendar feed URL here (id, created_at, last_used_at). The URL itself is shown only when it's made
POST /v1/workspaces/{ws}/calendar/feedMake your secret iCalendar feed URL (GET /cal/<token>.ics; ?strategy= and ?published=0 narrow it). Making a new one revokes the old URL. Shown once
DELETE /v1/workspaces/{ws}/calendar/feedTurn your calendar feed URL off
PATCH /v1/workspaces/{ws}/autopilotOwners: switch autopilot on or off, its timing, publishing on the date, and the backlog cadence ({per_day, days})
PATCH /v1/workspaces/{ws}/autopilot/approvalOwners in the web app: let autopilot approve its own calendar drafts with zero blockers, and request one automatic revision when they have blockers. API keys and MCP get 403
POST /v1/workspaces/{ws}/billing/checkoutStart a checkout top-up (owner session)
POST /v1/workspaces/{ws}/billing/subscribeSubscribe to the plan in checkout, monthly or annual (owner session)
POST /v1/workspaces/{ws}/billing/packsBuy a one-time credit pack in checkout (subscribers, owner session)
POST /v1/workspaces/{ws}/billing/portalOpen the billing portal: change plan, cancel, card, invoices