---
title: "API reference"
description: "Every operation, generated from openapi.yaml."
canonical: "https://writavo.com/docs/api"
last-updated: "2026-09-30"
---

# API reference

Every operation in the Writavo Content API, generated from the published OpenAPI 3.1
specification at https://writavo.com/openapi.json.

- **Base URL**: `https://api.writavo.com/v1`
- **Version**: 1.8.0
- **Operations**: 267

## Resources

| Resource | Operations | What it covers |
|---|---|---|
| [Meta](/docs/api/meta) | 5 | Connectivity, Site information, article formats, limits and usage. |
| [Articles](/docs/api/articles) | 21 | The content spine. Create, edit, organise, publish and schedule. |
| [Categories](/docs/api/categories) | 6 | The closed taxonomy. Exactly one category per article. |
| [Tags](/docs/api/tags) | 6 | The cross cutting taxonomy. Many tags per article. |
| [Authors](/docs/api/authors) | 6 | The byline roster for a Site. |
| [Media](/docs/api/media) | 7 | The media library. Two step upload, then registration. |
| [Imports](/docs/api/imports) | 8 | Import a whole blog, or keep pushing articles from another system. Send a Writavo Import Format document (https://writavo.com/schemas/import-v1.json), check the dry run, then start it; it runs server side. Matching on `external_id` makes a repeat push an update. Also behind the MCP `import_content` tool. |
| [Pipeline](/docs/api/pipeline) | 25 | The AI generation engine: runs, the content plan, configuration and AI rewrites. Runs, turning the pipeline on or up, and rewrites spend credits (`x-spends-credits`). |
| [Formats and prompts](/docs/api/formats-and-prompts) | 7 | Article formats (the SEO blueprints the AI follows) and each pipeline stage's prompt. Read the defaults, override one per Site, or reset it. |
| [Content types](/docs/api/content-types) | 7 | Your Site's own content models, such as a Product or a Testimonial. Fields (text, numbers, dates, choices, media, references, components, blocks) with validation. Define them in the dashboard, here, or from a file with `POST /content-types/apply`. Kind `article_fields` (API id `article`) adds custom fields to articles. |
| [Entries](/docs/api/entries) | 13 | The content of your content types. Drafts until published, schedulable to publish and unpublish, fully versioned, and counted as documents on the CMS meter. Publishable keys read published entries only. |
| [Site settings](/docs/api/site-settings) | 4 | The Site's name, primary domain, locale, niche, timezone and knowledge profile. The profile is the brand voice, product and audience the AI writes for. |
| [Organisation](/docs/api/organisation) | 2 | The organisation's name and your role. AI agent controls are readable here; only a person changes them, in the dashboard. |
| [Delivery](/docs/api/delivery) | 15 | How the blog reaches readers: reverse proxy, custom domain, hosted site and branding, headless API or CMS push. A custom domain costs money; publishing the hosted site or pushing to a CMS puts content live. |
| [SEO](/docs/api/seo) | 55 | The SEO suite: metrics, competitors, tracked keywords and alerts, content gaps and links. Also LLM mentions, engagement, backlinks, disavow and link opportunities. Reads and curation are free; the seven paid scans always need a person's approval for an AI agent. |
| [Engagement](/docs/api/engagement) | 4 | Per-article views, reactions, share clicks and comment counts. Record from your server (`POST /engagement/events`), read one or up to 50 (`GET /engagement/posts/{slug}`, `GET /engagement/posts?slugs=`), or import a migrated blog's history (`POST /engagement/import`). Site-wide report: `GET /seo/engagement`. |
| [Redirects](/docs/api/redirects) | 7 | Old URLs and where they now send readers. Each answers 301 where the URL would 404 (hosted site, custom domain, reverse proxy). Changing a published article, category or tag slug adds one. Import old URLs, or export those your own server must answer. |
| [Analytics](/docs/api/analytics) | 4 | Cookieless visitor analytics for every page that shows your articles. No cookie or storage id: a visitor is a hash under a daily salt. Hosted blogs carry the script; elsewhere paste the `snippet` from `GET /analytics/setup` into `<head>`. The collector answers 202 to every event, so verify with `POST /analytics/install-check`. Script attributes, CSP and exclusions: https://writavo.com/docs/analytics. |
| [Comments](/docs/api/comments) | 11 | Reader comments on articles, off until someone turns them on. Turn on with `PATCH /comments/settings`. The hosted blog shows a form; your own site reads `GET /comments/posts/{slug}` (publishable key) and posts with `POST /comments` server side. Moderate here or in the dashboard. Plain text, one reply level, emails never public, IPs only as a daily-salted hash. `comments:read`/`comments:write` need the comments.moderate permission. |
| [Outreach](/docs/api/outreach) | 5 | Link outreach, read only: readiness, mailbox, contacts, campaigns and threads. Holds outsiders' personal data. Policy acceptance and mailbox setup happen in the dashboard. |
| [Team](/docs/api/team) | 12 | Members, invites, roles and permissions. An AI agent needs approval for every change, and can never change the access of the person it acts for or anything about ownership. |
| [Billing](/docs/api/billing) | 11 | The plan, credits, USD balance, allowances, invoices, credit packs, auto-refill and credit cap. Also balance activity and the overage estimate. Payment details and plan changes are links a person opens. |
| [Insights](/docs/api/insights) | 7 | Reports and logs: the Site overview, costs per Site and article, taxonomy counts, and the function, audit and AI agent call logs. |
| [API keys](/docs/api/api-keys) | 8 | List, create, rotate and revoke API keys. |
| [Webhooks](/docs/api/webhooks) | 8 | Signed HTTPS POSTs to your endpoint when content changes, from the API or the dashboard. |
| [Device sign-in](/docs/api/device-sign-in) | 3 | Sign-in for command line tools and MCP clients, approved by a person in the dashboard. The only endpoints that take no API key. |

## Every operation

| Method | Path | Operation id | Summary |
|---|---|---|---|
| GET | `/ping` | `ping` | Verify a key |
| GET | `/site` | `getSite` | Read Site information |
| GET | `/formats` | `listFormats` | List article formats |
| POST | `/formats` | `createFormat` | Define an article format |
| GET | `/usage` | `getUsage` | Read plan limits, usage and balances |
| GET | `/approvals/{id}` | `getApprovalStatus` | Check an approval you are waiting on |
| GET | `/articles` | `listArticles` | List and search articles |
| POST | `/articles` | `createArticle` | Create an article |
| GET | `/articles/{id}` | `getArticle` | Read one article |
| PATCH | `/articles/{id}` | `updateArticle` | Update an article |
| DELETE | `/articles/{id}` | `deleteArticle` | Delete an article |
| POST | `/articles/{id}/publish` | `publishArticle` | Publish an article |
| GET | `/articles/{id}/revisions` | `listArticleRevisions` | List an article's revisions |
| GET | `/articles/{id}/revisions/{revision_id}` | `getArticleRevision` | Read one revision |
| POST | `/articles/{id}/revisions/{revision_id}/restore` | `restoreArticleRevision` | Put a revision back |
| GET | `/articles/{id}/preview-links` | `listArticlePreviewLinks` | List an article's preview links |
| POST | `/articles/{id}/preview-links` | `createArticlePreviewLink` | Share a preview of an unpublished article |
| DELETE | `/articles/{id}/preview-links/{link_id}` | `revokeArticlePreviewLink` | Revoke a preview link |
| POST | `/articles/{id}/schedule-unpublish` | `scheduleArticleUnpublish` | Take a live article down at a set time |
| POST | `/articles/{id}/cancel-unpublish` | `cancelArticleUnpublish` | Keep a live article up |
| POST | `/articles/cost-history` | `setArticleCostHistoryBulk` | Set the imported cost history of many articles |
| POST | `/articles/bulk-delete` | `bulkDeleteArticles` | Delete many articles |
| POST | `/articles/{id}/link-rel` | `setArticleLinkRel` | Set one link in an article to dofollow, nofollow or sponsored |
| POST | `/articles/{id}/cost-history` | `setArticleCostHistory` | Set an article's imported cost history |
| POST | `/articles/{id}/unpublish` | `unpublishArticle` | Unpublish an article |
| POST | `/articles/{id}/schedule` | `scheduleArticle` | Schedule an article |
| POST | `/articles/{id}/cancel-schedule` | `cancelArticleSchedule` | Cancel a scheduled publish |
| GET | `/categories` | `listCategories` | List categories |
| POST | `/categories` | `createCategory` | Create a category |
| POST | `/categories/bulk-delete` | `bulkDeleteCategories` | Delete many categories |
| GET | `/categories/{id}` | `getCategory` | Read one category |
| PATCH | `/categories/{id}` | `updateCategory` | Update a category |
| DELETE | `/categories/{id}` | `deleteCategory` | Delete a category |
| GET | `/tags` | `listTags` | List tags |
| POST | `/tags` | `createTag` | Create a tag |
| POST | `/tags/bulk-delete` | `bulkDeleteTags` | Delete many tags |
| GET | `/tags/{id}` | `getTag` | Read one tag |
| PATCH | `/tags/{id}` | `updateTag` | Update a tag |
| DELETE | `/tags/{id}` | `deleteTag` | Delete a tag |
| GET | `/authors` | `listAuthors` | List authors |
| POST | `/authors` | `createAuthor` | Create an author |
| POST | `/authors/bulk-delete` | `bulkDeleteAuthors` | Delete many authors |
| GET | `/authors/{id}` | `getAuthor` | Read one author |
| PATCH | `/authors/{id}` | `updateAuthor` | Update an author |
| DELETE | `/authors/{id}` | `deleteAuthor` | Delete an author |
| GET | `/media` | `listMedia` | List media assets |
| POST | `/media` | `registerMedia` | Register an uploaded file |
| POST | `/media/upload-url` | `createMediaUploadUrl` | Request an upload URL |
| POST | `/imports` | `createImport` | Send an import document |
| POST | `/imports/uploads` | `createImportUpload` | Start an import with an upload link |
| GET | `/imports/{import_id}` | `getImport` | Check an import |
| POST | `/imports/{import_id}/documents` | `addImportDocument` | Add to an import |
| POST | `/imports/{import_id}/dry-run` | `dryRunImport` | Dry-run an import again |
| POST | `/imports/{import_id}/start` | `startImport` | Start an import |
| POST | `/imports/{import_id}/cancel` | `cancelImport` | Cancel an import |
| POST | `/media/bulk-delete` | `bulkDeleteMedia` | Delete many media assets |
| GET | `/media/{id}` | `getMediaAsset` | Read one media asset |
| PATCH | `/media/{id}` | `updateMediaAsset` | Update a media asset |
| DELETE | `/media/{id}` | `deleteMediaAsset` | Delete a media asset |
| GET | `/pipeline/runs` | `listPipelineRuns` | List pipeline runs |
| POST | `/pipeline/runs` | `createPipelineRun` | Request a pipeline run |
| GET | `/pipeline/runs/{id}` | `getPipelineRun` | Read one pipeline run |
| GET | `/pipeline/queue` | `listPipelineQueue` | Read the content queue |
| POST | `/pipeline/queue` | `createPlanItem` | Add a topic to the content plan |
| GET | `/pipeline/sources` | `listPipelineSources` | List competitor source articles |
| GET | `/pipeline/sources/{id}` | `getPipelineSource` | Read one competitor source article |
| GET | `/pipeline/config` | `getPipelineConfig` | Read the pipeline configuration |
| PATCH | `/pipeline/config` | `updatePipelineConfig` | Change the pipeline configuration |
| GET | `/pipeline/steps` | `listRecipeSteps` | List the steps a recipe can use |
| GET | `/pipeline/templates` | `listRecipeTemplates` | List the starting recipes |
| GET | `/pipeline/recipe` | `getRecipe` | Read the Site's article recipe |
| GET | `/pipeline/recipe/explain` | `explainRecipe` | Explain the recipe in plain words |
| GET | `/pipeline/recipe/activity` | `listRecipeActivity` | See what the recipe did, step by step |
| POST | `/pipeline/recipe/estimate` | `estimateRecipe` | Estimate what a recipe costs |
| POST | `/pipeline/recipe/draft` | `saveRecipeDraft` | Save the draft recipe |
| DELETE | `/pipeline/recipe/draft` | `discardRecipeDraft` | Discard the draft recipe |
| POST | `/pipeline/recipe/draft/test` | `testRecipeDraft` | Test the draft on one real idea |
| POST | `/pipeline/recipe/draft/activate` | `activateRecipeDraft` | Switch the draft recipe on |
| POST | `/pipeline/recipe/undo` | `undoRecipe` | Go back to the previous recipe |
| POST | `/pipeline/queue/reorder` | `reorderPlanItems` | Reorder the content plan |
| GET | `/pipeline/queue/{id}` | `getPlanItem` | Read one content plan item |
| PATCH | `/pipeline/queue/{id}` | `updatePlanItem` | Change a content plan item |
| DELETE | `/pipeline/queue/{id}` | `deletePlanItem` | Remove a content plan item |
| POST | `/pipeline/articles/{id}/requeue` | `requeueArticle` | Send an article back through the pipeline |
| GET | `/pipeline/prompts` | `listPrompts` | Read the AI prompts |
| PATCH | `/pipeline/prompts/{stage}` | `setPromptOverride` | Override a stage's prompt |
| DELETE | `/pipeline/prompts/{stage}` | `resetPrompt` | Reset a stage's prompt to the default |
| GET | `/formats/{id}` | `getFormat` | Read one article format |
| PATCH | `/formats/{id}` | `updateFormat` | Change an article format |
| DELETE | `/formats/{id}` | `deleteFormat` | Delete an article format |
| GET | `/content-types` | `listContentTypes` | List content types |
| POST | `/content-types` | `createContentType` | Create a content type |
| POST | `/content-types/apply` | `applyContentSchema` | Apply a whole schema |
| GET | `/content-types/typescript` | `getContentTypesTypescript` | Generate TypeScript types |
| GET | `/content-types/{api_id}` | `getContentType` | Read a content type |
| PATCH | `/content-types/{api_id}` | `updateContentType` | Change a content type |
| DELETE | `/content-types/{api_id}` | `deleteContentType` | Delete a content type |
| GET | `/entries/{type}` | `listEntries` | List entries |
| POST | `/entries/{type}` | `createEntry` | Create an entry |
| GET | `/entries/{type}/{id}` | `getEntry` | Read an entry |
| PATCH | `/entries/{type}/{id}` | `updateEntry` | Change an entry |
| DELETE | `/entries/{type}/{id}` | `deleteEntry` | Delete an entry |
| POST | `/entries/{type}/{id}/publish` | `publishEntry` | Publish an entry |
| POST | `/entries/{type}/{id}/unpublish` | `unpublishEntry` | Unpublish an entry |
| POST | `/entries/{type}/{id}/schedule` | `scheduleEntry` | Schedule an entry to publish |
| POST | `/entries/{type}/{id}/unschedule` | `unscheduleEntry` | Cancel an entry's schedule |
| POST | `/entries/{type}/{id}/schedule-unpublish` | `scheduleEntryUnpublish` | Schedule an entry to unpublish |
| GET | `/entries/{type}/{id}/revisions` | `listEntryRevisions` | List an entry's revisions |
| GET | `/entries/{type}/{id}/revisions/{rid}` | `getEntryRevision` | Read a revision |
| POST | `/entries/{type}/{id}/revisions/{rid}/restore` | `restoreEntryRevision` | Restore a revision |
| GET | `/export` | `exportSite` | Export the Site |
| GET | `/site/settings` | `getSiteSettings` | Read the Site settings |
| PATCH | `/site/settings` | `updateSiteSettings` | Change the Site settings |
| GET | `/site/knowledge-profile` | `getKnowledgeProfile` | Read the knowledge profile |
| PATCH | `/site/knowledge-profile` | `updateKnowledgeProfile` | Change the knowledge profile |
| GET | `/organisation` | `getOrganisation` | Read the organisation |
| PATCH | `/organisation` | `renameOrganisation` | Rename the organisation |
| GET | `/delivery` | `getDelivery` | Read how the blog is delivered |
| POST | `/delivery/proxy` | `setupReverseProxy` | Set up the reverse proxy |
| GET | `/delivery/proxy/installers` | `getProxyInstallers` | Read the reverse proxy snippets |
| POST | `/delivery/headless` | `setupHeadlessDelivery` | Set up headless delivery |
| POST | `/delivery/custom-domain` | `connectCustomDomain` | Connect a custom domain |
| DELETE | `/delivery/custom-domain` | `removeCustomDomain` | Remove the custom domain |
| POST | `/delivery/health-checks` | `runDeliveryHealthCheck` | Run a delivery health check |
| GET | `/delivery/hosted-site` | `getHostedSite` | Read the hosted site |
| PATCH | `/delivery/hosted-site/branding` | `updateHostedSiteBranding` | Change the hosted site's branding |
| POST | `/delivery/hosted-site/publish` | `publishHostedSite` | Publish the hosted blog |
| GET | `/delivery/cms` | `listCmsConnections` | List external CMS connections |
| POST | `/delivery/cms` | `connectCms` | Get the link to connect an external CMS |
| DELETE | `/delivery/cms/{provider}` | `disconnectCms` | Disconnect an external CMS |
| POST | `/delivery/cms/push` | `pushToCms` | Push published articles to the external CMS |
| GET | `/delivery/cms/push-log` | `listCmsPushLog` | Read the CMS push log |
| GET | `/seo/overview` | `getSeoOverview` | Read the SEO overview |
| POST | `/seo/site-metrics/refresh` | `refreshSiteMetrics` | Refresh the site metrics |
| GET | `/seo/competitors` | `listCompetitors` | List competitors |
| POST | `/seo/competitors` | `addCompetitor` | Track a competitor |
| PATCH | `/seo/competitors/{id}` | `updateCompetitor` | Change a competitor |
| DELETE | `/seo/competitors/{id}` | `removeCompetitor` | Stop tracking a competitor |
| GET | `/seo/keywords` | `listTrackedKeywords` | List tracked keywords |
| POST | `/seo/keywords` | `trackKeyword` | Track a keyword |
| PATCH | `/seo/keywords/{id}` | `updateTrackedKeyword` | Change a tracked keyword |
| DELETE | `/seo/keywords/{id}` | `untrackKeyword` | Stop tracking a keyword |
| GET | `/seo/keywords/{id}/history` | `getKeywordHistory` | Read a keyword's position history |
| GET | `/seo/keyword-alerts` | `listKeywordAlerts` | List keyword alerts |
| POST | `/seo/keyword-alerts/acknowledge` | `acknowledgeKeywordAlerts` | Acknowledge keyword alerts |
| POST | `/seo/rank-check` | `runRankCheck` | Check keyword positions now |
| POST | `/seo/import` | `importSeo` | Import keywords, competitors and ranking history |
| GET | `/seo/content-gaps` | `listContentGaps` | List content gaps |
| POST | `/seo/content-gaps/scan` | `scanContentGaps` | Scan for content gaps |
| PATCH | `/seo/content-gaps/{id}` | `updateContentGap` | Target, dismiss or reopen a content gap |
| POST | `/seo/content-gaps/{id}/plan` | `planContentGap` | Plan an article from a content gap |
| GET | `/seo/internal-links` | `getInternalLinkHealth` | Read internal link health |
| GET | `/seo/internal-links/health` | `getInternalLinkReport` | Read the internal link report |
| POST | `/seo/internal-links/rescan` | `rescanInternalLinks` | Rescan internal links |
| GET | `/seo/llm-mentions` | `listLlmMentions` | List LLM mentions |
| POST | `/seo/llm-mentions/check` | `checkLlmMentions` | Check LLM mentions now |
| GET | `/seo/ai-visibility` | `getAiVisibility` | Read AI visibility |
| POST | `/seo/ai-visibility/run` | `runAiVisibility` | Run an AI visibility check now |
| GET | `/redirects` | `listRedirects` | List redirects |
| POST | `/redirects` | `createRedirect` | Create a redirect |
| POST | `/redirects/bulk` | `bulkRedirects` | Create or replace many redirects |
| GET | `/redirects/export` | `exportRedirects` | Export redirects for your own server |
| GET | `/redirects/{id}` | `getRedirect` | Read one redirect |
| PATCH | `/redirects/{id}` | `updateRedirect` | Update a redirect |
| DELETE | `/redirects/{id}` | `deleteRedirect` | Delete a redirect |
| POST | `/engagement/events` | `recordEngagement` | Record a view, reaction or share |
| POST | `/engagement/import` | `importEngagement` | Import engagement history |
| GET | `/engagement/posts/{slug}` | `getPostEngagement` | Read an article's views, reactions and shares |
| GET | `/engagement/posts` | `listPostsEngagement` | Read views, reactions, shares and comment counts for several articles |
| GET | `/analytics/setup` | `getAnalyticsSetup` | Read the analytics setup and install status |
| PATCH | `/analytics/settings` | `updateAnalyticsSettings` | Turn analytics on or off, or change the extra domains |
| GET | `/analytics/visitors` | `getVisitorAnalytics` | Read the visitor report |
| POST | `/analytics/install-check` | `checkAnalyticsInstall` | Check that the analytics script is installed on a page |
| GET | `/comments/posts/{slug}` | `getPostComments` | Read an article's approved comments |
| GET | `/comments` | `listComments` | List comments for moderation |
| POST | `/comments` | `submitComment` | Submit a reader's comment |
| GET | `/comments/settings` | `getCommentSettings` | Read the comment settings |
| PATCH | `/comments/settings` | `updateCommentSettings` | Change the comment settings |
| POST | `/comments/erase` | `eraseCommenter` | Erase everything one commenter wrote |
| POST | `/comments/import` | `importComments` | Import comments |
| GET | `/comments/{id}` | `getComment` | Read one comment |
| PATCH | `/comments/{id}` | `updateComment` | Approve a comment, hold it or mark it as spam |
| DELETE | `/comments/{id}` | `deleteComment` | Delete a comment |
| POST | `/comments/{id}/replies` | `replyToComment` | Reply to a comment as the Site's team |
| GET | `/seo/engagement` | `getEngagement` | Read blog engagement |
| GET | `/seo/backlinks/overview` | `getBacklinkOverview` | Read the backlink overview |
| GET | `/seo/backlinks` | `listBacklinks` | List backlinks |
| POST | `/seo/backlinks/scan` | `scanBacklinkProfile` | Scan the backlink profile |
| POST | `/seo/backlinks/detail-pull` | `pullBacklinkDetail` | Pull a page of backlink detail |
| GET | `/seo/backlinks/disavow` | `listDisavowEntries` | List disavow entries |
| POST | `/seo/backlinks/disavow` | `addDisavowEntry` | Add a disavow entry |
| DELETE | `/seo/backlinks/disavow/{id}` | `removeDisavowEntry` | Remove a disavow entry |
| GET | `/seo/backlinks/disavow-file` | `getDisavowFile` | Build the disavow file |
| POST | `/seo/backlinks/import` | `importBacklinksCsv` | Import a Search Console links export |
| POST | `/seo/backlinks/verify` | `verifyBacklinks` | Verify backlinks |
| POST | `/seo/backlinks/bing` | `connectBing` | Get the link to connect Bing Webmaster Tools |
| POST | `/seo/backlinks/bing/sync` | `syncBing` | Read backlinks from Bing now |
| GET | `/seo/link-opportunities` | `listLinkOpportunities` | List link opportunities |
| POST | `/seo/link-opportunities` | `addLinkOpportunity` | Add a link opportunity |
| PATCH | `/seo/link-opportunities/{id}` | `updateLinkOpportunity` | Change a link opportunity |
| POST | `/seo/link-opportunities/{id}/plan` | `planLinkOpportunity` | Plan an article for a link opportunity |
| POST | `/seo/link-opportunities/intersect-scan` | `scanLinkIntersect` | Find sites that link to competitors |
| GET | `/seo/link-exchanges` | `listLinkExchanges` | List link exchanges |
| POST | `/seo/link-exchanges` | `createLinkExchange` | Record a link exchange |
| POST | `/seo/link-exchanges/check` | `checkLinkExchanges` | Re-check every link exchange |
| GET | `/seo/link-exchanges/{id}` | `getLinkExchange` | Read a link exchange |
| PATCH | `/seo/link-exchanges/{id}` | `updateLinkExchange` | Change a link exchange |
| DELETE | `/seo/link-exchanges/{id}` | `removeLinkExchange` | Remove a link exchange |
| POST | `/seo/link-exchanges/{id}/check` | `checkLinkExchange` | Check one link exchange now |
| POST | `/seo/link-prospects/inspect` | `inspectLinkProspect` | Look at a site offering a link |
| GET | `/seo/links` | `listArticleLinks` | List every internal and external link in your articles, with its state and nofollow |
| GET | `/seo/outbound-links` | `listOutboundLinkDomains` | List the sites your articles link to |
| GET | `/seo/outbound-links/links` | `listOutboundLinks` | List your links to one site |
| GET | `/outreach/readiness` | `getOutreachReadiness` | Read outreach readiness |
| GET | `/outreach/mailbox` | `getOutreachMailbox` | Read the outreach mailbox |
| GET | `/outreach/contacts` | `listOutreachContacts` | List outreach contacts |
| GET | `/outreach/campaigns` | `listOutreachCampaigns` | List outreach campaigns |
| GET | `/outreach/threads` | `listOutreachThreads` | List outreach threads |
| GET | `/team/members` | `listTeamMembers` | List team members |
| GET | `/team/members/{user_id}` | `getTeamMember` | Read one team member |
| PATCH | `/team/members/{user_id}` | `updateMemberRole` | Change a member's role |
| DELETE | `/team/members/{user_id}` | `removeTeamMember` | Remove a team member |
| GET | `/team/members/{user_id}/permissions` | `getMemberPermissions` | Read a member's permissions |
| PATCH | `/team/members/{user_id}/permissions` | `updateMemberPermissions` | Change a member's permissions |
| GET | `/team/invites` | `listTeamInvites` | List pending invites |
| POST | `/team/invites` | `inviteTeamMember` | Invite someone to the organisation |
| DELETE | `/team/invites/{id}` | `revokeTeamInvite` | Revoke an invite |
| GET | `/team/roles` | `getRoleMatrix` | Read what each role can do |
| PATCH | `/team/roles/{role}` | `updateRolePermissions` | Change what a role can do |
| GET | `/team/permissions` | `listPermissionCatalog` | List the permission catalog |
| GET | `/billing` | `getBillingSummary` | Read the billing summary |
| GET | `/billing/invoices` | `listInvoices` | List invoices and payments |
| GET | `/billing/credit-packs` | `listCreditPacks` | List credit packs |
| POST | `/billing/credit-packs/{key}/checkout` | `startCreditPurchase` | Start a credit pack purchase |
| POST | `/billing/credit-packs/{key}/buy-with-balance` | `buyCreditPackWithBalance` | Buy a credit pack with the account balance |
| POST | `/billing/wallet/checkout` | `startWalletTopup` | Start adding funds to the account balance |
| GET | `/billing/activity` | `listBillingActivity` | List balance and credit activity |
| GET | `/billing/links` | `getBillingLinks` | Get the billing links for a person |
| POST | `/billing/scheduled-change/cancel` | `keepCurrentPlan` | Keep the current plan |
| PATCH | `/billing/autorefill` | `updateAutorefill` | Change auto-refill |
| PATCH | `/billing/site-credit-cap` | `updateSiteCreditCap` | Change this Site's credit cap |
| GET | `/insights/overview` | `getSiteOverview` | Read the Site overview |
| GET | `/insights/costs` | `getSiteCosts` | Read the Site's costs |
| GET | `/insights/articles/{id}/costs` | `getArticleCosts` | Read one article's costs |
| GET | `/insights/taxonomy` | `getTaxonomyCounts` | Read taxonomy counts |
| GET | `/logs/functions` | `listFunctionLogs` | Read the Site's function logs |
| GET | `/logs/audit` | `listAuditLog` | Read the audit log |
| GET | `/logs/agent-calls` | `listAgentCalls` | Read the AI agent call log |
| GET | `/keys` | `listApiKeys` | List API keys |
| POST | `/keys` | `createApiKey` | Create an API key |
| POST | `/keys/{id}/rotate` | `rotateApiKey` | Rotate an API key |
| DELETE | `/keys/{id}` | `revokeApiKey` | Revoke an API key |
| GET | `/webhooks` | `listWebhooks` | List webhook endpoints |
| POST | `/webhooks` | `createWebhook` | Create a webhook endpoint |
| GET | `/webhooks/{id}` | `getWebhook` | Read one webhook endpoint |
| PATCH | `/webhooks/{id}` | `updateWebhook` | Update a webhook endpoint |
| DELETE | `/webhooks/{id}` | `deleteWebhook` | Delete a webhook endpoint |
| POST | `/webhooks/{id}/rotate-secret` | `rotateWebhookSecret` | Rotate the signing secret |
| GET | `/webhooks/{id}/deliveries` | `listWebhookDeliveries` | List deliveries for an endpoint |
| POST | `/webhooks/{id}/deliveries/{delivery_id}/redeliver` | `redeliverWebhookDelivery` | Send one delivery again |
| POST | `/auth/device` | `startDeviceAuthorization` | Start a device sign-in |
| POST | `/auth/device/token` | `pollDeviceAuthorization` | Poll a device sign-in |
| POST | `/auth/key/extend` | `extendApiKey` | Extend the calling key's expiry |
| POST | `/auth/key/revoke` | `revokeCurrentApiKey` | Revoke the calling key |
| GET | `/auth/key/sites` | `listConnectionSites` | Internal: the Sites an AI connection reaches |
| POST | `/auth/key/sites` | `mintConnectionSiteKey` | Internal: register an AI connection's key for one of its Sites |
| POST | `/auth/key/revoke-oauth` | `revokeOauthKey` | Internal: revoke the key behind a revoked MCP sign-in |
