Skip to content
Woodander Docs
EN

Woodander API reference

Every REST endpoint and the MCP tool with the same name, generated from the live API catalog. Version 1, JSON over HTTPS.

Get started

  1. API and MCP access is included in the Pro and Scale plans. See plans.
  2. In the Workspace open Settings, API & MCP, choose what the token may read and an expiry, and create it. The token is shown once.
  3. Send it as a Bearer token to https://woodander.com/api/v1.
bash
curl -H "Authorization: Bearer wdr_..." https://woodander.com/api/v1/whoami

A machine-readable description is at https://woodander.com/api/v1/openapi.json (OpenAPI 3.1). The MCP server is at https://woodander.com/mcp; set it up in the guides.

Authentication

Personal access tokens (wdr_...) are sent as Authorization: Bearer <token>. A token belongs to one person and sees only that person's data. It is stored hashed, so we cannot show it again; if you lose it, revoke it and create another.

A missing, malformed, expired or revoked token gets 401. A token without the scope an endpoint needs gets 403 with insufficient_scope. If the plan no longer includes API access the answer is 403 with plan_required.

Scopes

ScopeGrants
read:productsYour Discover projects and their details.
write:productsAsk for changes to your Discover projects: page drafts, screenshots, Briefs, review replies, lead status. What happens depends on the mode you set per project: a proposal you apply (Manual), a draft edit (Hybrid), or a public post (Autonomous). Your page itself still changes only after Woodander editors approve the draft.
read:analyticsViews, clicks, referrers and leads of your projects, and the synced Google Analytics (GA4) figures of your sites.
read:seoYour sites, synced Search Console data and site audits.
read:mediaYour Woodander Media articles, posts for your site and Content Studio drafts.
read:gtmYour Google Tag Manager containers, tags, triggers and variables, tracking analysis and site scans.
write:gtmAsk for Tag Manager changes. What happens depends on the mode you set per site: a proposal you apply (Manual) or a change in the separate Woodander workspace (Hybrid). Publishing still waits for your confirmation.
publish:gtmMake Tag Manager versions live without asking you, only where you turned on Autonomous. Give it only to an agent you trust.
read:keywordsKeyword ideas with search volume, competition and CPC (each new lookup uses one of your plan’s daily keyword lookups), your tracked keywords and their ranking history.
write:mediaCreate and edit your private Media drafts. Woodander editors still review every piece; sending a draft to them stays yours. What happens depends on the mode you set for Media in Settings → AI activity.
run:auditsStart site audits and refresh the Search Console and Google Analytics data of your sites, within your plan’s limits. What happens depends on the mode you set for SEO.
read:autopilotThe pieces Content Autopilot wrote that wait for your review.
write:autopilotApprove (publish) or discard pieces waiting for your review. What happens depends on the mode you set for Content Autopilot; discarding always waits for you.
read:marketYour Market listings and their status.
write:marketAdd draft listings, edit and pause your Market listings; sending them to editors stays yours. What happens depends on the mode you set for Market.
read:contentThe approved articles for your own site, for a site connected through the Woodander API to pull.
write:contentTell Woodander where your site published an approved article (its address and id).

Rate limits

60 requests per minute per token, on REST and MCP together, and 20 Tag Manager changes per minute per token. Over the limit you get 429 with error.code = rate_limited and a Retry-After header (seconds).

Errors

Every error has the same shape. Match on error.code; the message is for people.

json
{"error": {"code": "not_found", "message": "Site was not found."}}
HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the scope this endpoint needs.
403plan_requiredThe owner's plan does not include API access.
404not_foundNot found, or not yours. Other people's data is indistinguishable from missing data.
404search_console_not_connectedThe site has no connected Search Console property.
404gtm_container_not_chosenNo Tag Manager container is chosen for the site.
409busyAnother request of the same account is using its allowance: try again in a moment.
409google_reconnectGoogle no longer accepts the owner's Tag Manager access: they reconnect in the Workspace.
409duplicateThe change would duplicate a tag, trigger or variable the container already has (or the version is already live).
422invalid_requestA parameter is not valid (range, type, cursor).
422validation_failedThe body of a change is not valid; details.errors names the fields.
429rate_limitedToo many requests. See Retry-After.
429limit_reachedThe plan's daily keyword lookups are used up; the message says when they reset (see whoami limits).
429account_spend_capThe account reached this month's keyword data limit.
502provider_errorThe keyword data provider failed; nothing was spent. Try again later.
503provider_not_connectedKeyword data is not connected on this server yet.
503provider_budget_reachedKeyword data is paused until the next month.

Pagination and shapes

Responses are {"data": ..., "meta": ...} with stable field names and ISO 8601 dates. Lists take limit and cursor: pass meta.next_cursor back as cursor until it is null. Cursors are opaque.

Endpoint groups