Sites, website audits, reports, uptime, keyword ideas and rank tracking, plus the agent change log.
GET
/api/v1/whoami
The user behind the token, their plan, what is left of every plan limit (limits: per day or month, or held at once) and what the token may do.
MCP tool whoami
Scope any
Plan Pro and above, or the Project Pro pass
Parameters
No parameters.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/whoami" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "whoami" ,
"arguments" : {}
}
}
Example response Example
json Copy
{
"data" : {
"user" : {
"id" : 1 ,
"name" : "Ada" ,
"email" : "ada@example.com"
},
"plan" : {
"names" : [
"Pro"
],
"features" : [
"api_access" ,
"search_insights"
]
},
"limits" : {
"keyword_lookups" : {
"label" : "Keyword lookups" ,
"kind" : "metered" ,
"window" : "day" ,
"limit" : 20 ,
"used" : 4 ,
"remaining" : 16 ,
"resets_at" : "2026-10-20T00:00:00+00:00"
},
"tracked_keywords" : {
"label" : "Tracked keywords" ,
"kind" : "capacity" ,
"window" : null ,
"limit" : 150 ,
"used" : 12 ,
"remaining" : 138 ,
"resets_at" : null
}
},
"token" : {
"name" : "Claude Code" ,
"scopes" : [
"read:seo"
],
"expires_at" : null ,
"last_used_at" : "2026-10-17T09:00:00+00:00"
}
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 plan_requiredThe plan does not include API access.
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/sites
Your SEO sites with Search Console connection status and the latest audit.
MCP tool list_sites
Scope read:seo
Plan Pro and above
Parameters
No parameters.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/sites" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "list_sites" ,
"arguments" : {}
}
}
Example response Example
json Copy
{
"data" : [
{
"host" : "example.com" ,
"sources" : [
"business" ,
"gsc"
],
"business" : {
"id" : 3 ,
"name" : "Example"
},
"search_console" : {
"connected" : true ,
"property" : "sc-domain:example.com" ,
"tracked" : true ,
"synced_at" : "2026-10-17T03:00:00+00:00" ,
"error" : null
},
"latest_audit" : {
"id" : 41 ,
"score" : 82 ,
"finished_at" : "2026-10-15T10:00:00+00:00"
}
}
],
"meta" : {
"total" : 1
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:seo scope.
403 plan_requiredThe plan does not include API access.
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/sites/{site}/audits
Site audits of one site, newest first.
MCP tool list_audits
Scope read:seo
Plan Pro and above
Parameters
Name In Type Required Description
site
path
string
Yes
Host of one of your sites, e.g. example.com (see list_sites).
limit
query
integer
No
Page size, 1 to 100.
cursor
query
string
No
meta.next_cursor of the previous page.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/sites/example.com/audits" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "list_audits" ,
"arguments" : {
"site" : "example.com"
}
}
}
Example response Example
json Copy
{
"data" : [
{
"id" : 41 ,
"host" : "example.com" ,
"start_url" : "https://example.com/" ,
"status" : "done" ,
"score" : 82 ,
"pages_crawled" : 120 ,
"counts" : {
"error" : 2 ,
"warning" : 9 ,
"notice" : 14
},
"created_at" : "2026-10-15T09:55:00+00:00" ,
"finished_at" : "2026-10-15T10:00:00+00:00"
}
],
"meta" : {
"next_cursor" : null ,
"limit" : 25 ,
"total" : 1 ,
"site" : "example.com"
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:seo scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/audits/{id}
One audit: score with its health read (grade A–F, the fixes that reach the next grade and a 0–100 score per area: technical, onpage, speed, ai, ux), issues with the points each costs (impact), their area, example pages and fixes, what changed since the previous run, the pages with the most problems and, when measured, Google PageSpeed lab and field (Chrome UX Report) data for the start page, with the detailed audits under speed.detailed (same shape as pagespeed_check).
MCP tool get_audit
Scope read:seo
Plan Pro and above
Parameters
Name In Type Required Description
id
path
integer
Yes
Audit id (see list_audits).
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/audits/12" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "get_audit" ,
"arguments" : {
"id" : 12
}
}
}
Example response Example
json Copy
{
"data" : {
"id" : 41 ,
"host" : "example.com" ,
"status" : "done" ,
"score" : 82 ,
"health" : {
"grade" : "B" ,
"next" : {
"grade" : "A" ,
"points" : 8 ,
"fixes" : 2
},
"areas" : [
{
"key" : "technical" ,
"score" : 96 ,
"issues" : 2
},
{
"key" : "onpage" ,
"score" : 88 ,
"issues" : 3
},
{
"key" : "speed" ,
"score" : 100 ,
"issues" : 0
},
{
"key" : "ai" ,
"score" : 94 ,
"issues" : 1
},
{
"key" : "ux" ,
"score" : 100 ,
"issues" : 0
}
]
},
"issues" : [
{
"code" : "missing_meta_description" ,
"severity" : "warning" ,
"message" : "Missing meta description" ,
"pages" : 9 ,
"area" : "onpage" ,
"impact" : 1 ,
"examples" : [
"https://example.com/a"
],
"why" : null ,
"fix" : null
}
],
"action_plan" : [
{
"status" : "new" ,
"severity" : "warning" ,
"message" : "Missing meta description" ,
"pages" : 9
}
],
"speed" : {
"strategy" : "mobile" ,
"score" : 71 ,
"lab" : [
{
"id" : "largest-contentful-paint" ,
"label" : "Largest Contentful Paint" ,
"value" : "3.2 s" ,
"score" : 0.5
}
],
"field" : {
"scope" : "origin" ,
"overall" : "AVERAGE" ,
"metrics" : [
{
"key" : "LARGEST_CONTENTFUL_PAINT_MS" ,
"label" : "Largest Contentful Paint" ,
"value" : "2.3 s" ,
"category" : "FAST"
}
]
},
"measured_at" : "2026-10-15T10:00:00.000Z"
},
"pages" : []
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:seo scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/keywords/ideas
Keyword ideas with monthly search volume, competition (0 to 1), CPC in USD and a 12-month trend, for a seed keyword or (without seed) for your site. A new search uses one of your plan's daily keyword lookups (repeating it the same UTC day is free); meta.limits says what is left.
MCP tool keyword_ideas
Scope read:keywords
Plan Pro and above
Parameters
Name In Type Required Description
site
query
string
Yes
Host of one of your sites (see list_sites); the keywords belong to it and set the default location and language.
seed
query
string
No
Up to 5 keywords separated by commas. Leave it out for keywords of the site itself.
location
query
integer
No
Location code, e.g. 2840 United States, 2826 United Kingdom, 2276 Germany, 2724 Spain, 2804 Ukraine. Default: the site's market.
language
query
string
No
Language code: en, de, es, uk, pl, fr, it, nl. Default: the site's language.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/keywords/ideas?site=example.com" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "keyword_ideas" ,
"arguments" : {
"site" : "example.com"
}
}
}
Example response Example
json Copy
{
"data" : {
"site" : "example.com" ,
"mode" : "seed" ,
"seeds" : [
"ceramic mugs"
],
"location" : {
"code" : 2840 ,
"name" : "United States"
},
"language" : {
"code" : "en" ,
"name" : "English"
},
"items" : [
{
"keyword" : "ceramic mugs" ,
"search_volume" : 14800 ,
"competition" : 0.92 ,
"competition_level" : "HIGH" ,
"cpc_usd" : 1.12 ,
"trend" : [
12100 ,
12100 ,
14800 ,
14800 ,
18100 ,
22200 ,
14800 ,
12100 ,
12100 ,
14800 ,
14800 ,
14800
]
}
]
},
"meta" : {
"cached" : false ,
"source" : "dataforseo_labs" ,
"limits" : {
"keyword_lookups" : {
"kind" : "metered" ,
"window" : "day" ,
"limit" : 20 ,
"used" : 4 ,
"remaining" : 16 ,
"resets_at" : "2026-10-20T00:00:00+00:00"
}
}
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:keywords scope.
403 plan_requiredThe plan does not include API access.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 limit_reachedThe plan's daily keyword lookups are used up.
503 provider_not_connectedKeyword data is not connected on this server yet.
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/sites/{site}/keywords/tracked
Keywords you track for a site with the latest Google position, change since the check before, best and worst, and the URL that ranks. Positions are organic ranks; null = not in the checked depth (or not checked yet).
MCP tool tracked_keywords
Scope read:keywords
Plan Pro and above
Parameters
Name In Type Required Description
site
path
string
Yes
Host of one of your sites, e.g. example.com (see list_sites).
limit
query
integer
No
Page size, 1 to 200.
cursor
query
string
No
meta.next_cursor of the previous page.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/sites/example.com/keywords/tracked" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "tracked_keywords" ,
"arguments" : {
"site" : "example.com"
}
}
}
Example response Example
json Copy
{
"data" : [
{
"id" : 7 ,
"keyword" : "ceramic mugs" ,
"location" : {
"code" : 2840 ,
"name" : "United States"
},
"language" : "en" ,
"device" : "desktop" ,
"position" : 6 ,
"previous_position" : 9 ,
"change" : 3 ,
"best_position" : 5 ,
"worst_position" : 14 ,
"url" : "https://example.com/mugs" ,
"last_checked_at" : "2026-10-18T04:10:00+00:00" ,
"next_check_at" : "2026-10-19T04:07:00+00:00"
}
],
"meta" : {
"next_cursor" : null ,
"limit" : 25 ,
"total" : 1 ,
"site" : "example.com" ,
"depth" : 50 ,
"frequency" : "daily" ,
"limits" : {
"tracked_keywords" : {
"kind" : "capacity" ,
"window" : null ,
"limit" : 150 ,
"used" : 12 ,
"remaining" : 138 ,
"resets_at" : null
}
}
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:keywords scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/sites/{site}/keywords/tracked/{id}/history
The position history of one tracked keyword: every finished check in the period, oldest first.
MCP tool rank_history
Scope read:keywords
Plan Pro and above
Parameters
Name In Type Required Description
site
path
string
Yes
Host of one of your sites, e.g. example.com (see list_sites).
id
path
integer
Yes
Tracked keyword id (see tracked_keywords).
days
query
integer
No
Period in days, 1 to 365. Default 90.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/sites/example.com/keywords/tracked/12/history" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "rank_history" ,
"arguments" : {
"site" : "example.com" ,
"id" : 12
}
}
}
Example response Example
json Copy
{
"data" : {
"id" : 7 ,
"keyword" : "ceramic mugs" ,
"location" : {
"code" : 2840 ,
"name" : "United States"
},
"language" : "en" ,
"device" : "desktop" ,
"position" : 6 ,
"previous_position" : 9 ,
"change" : 3 ,
"best_position" : 5 ,
"worst_position" : 14 ,
"url" : "https://example.com/mugs" ,
"last_checked_at" : "2026-10-18T04:10:00+00:00" ,
"next_check_at" : "2026-10-19T04:07:00+00:00" ,
"history" : [
{
"checked_at" : "2026-10-17T04:12:00+00:00" ,
"position" : 9 ,
"url" : "https://example.com/mugs"
},
{
"checked_at" : "2026-10-18T04:10:00+00:00" ,
"position" : 6 ,
"url" : "https://example.com/mugs"
}
]
},
"meta" : {
"site" : "example.com" ,
"days" : 90 ,
"depth" : 50
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:keywords scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/sites/{site}/ai-visibility
The prompts you track for a site (the questions your customers ask AI) with the latest answer of each AI platform: whether your brand was named, its place among the brands named, the competitors named, the sources cited and the change since the check before. meta.summary has the mention rate and average place, meta.share_of_voice the competitors across prompts. Stored checks, never a live call; needs AI visibility in your plan.
MCP tool ai_visibility
Scope read:keywords
Plan Pro and above
Parameters
Name In Type Required Description
site
path
string
Yes
Host of one of your sites, e.g. example.com (see list_sites).
limit
query
integer
No
Page size, 1 to 100.
cursor
query
string
No
meta.next_cursor of the previous page.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/sites/example.com/ai-visibility" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "ai_visibility" ,
"arguments" : {
"site" : "example.com"
}
}
}
Example response Example
json Copy
{
"data" : [
{
"id" : 3 ,
"prompt" : "What are the best tools for mapping architecture?" ,
"location" : "United States" ,
"language" : "English" ,
"checked" : "2 days ago" ,
"platforms" : [
{
"platform" : "chat_gpt" ,
"state" : "done" ,
"mentioned" : true ,
"position" : 4 ,
"trend" : "same" ,
"model" : "gpt-4.1-mini" ,
"checked_at" : "2026-10-21T04:10:00+00:00" ,
"competitors" : [
{
"name" : "Alchetype" ,
"domain" : "alchetype.co"
}
],
"sources" : [
{
"domain" : "example.com" ,
"url" : "https://example.com/en"
}
],
"cited_as_source" : true ,
"answer_excerpt" : "1. **Alchetype** ... 4. **Archemap** ..."
}
]
}
],
"meta" : {
"next_cursor" : null ,
"limit" : 25 ,
"total" : 1 ,
"site" : "example.com" ,
"frequency" : "weekly" ,
"summary" : {
"checks" : 2 ,
"mentioned" : 1 ,
"rate" : 50 ,
"rateDelta" : null ,
"averagePosition" : 4 ,
"positionDelta" : null ,
"prompts" : 1 ,
"cited" : 1
},
"share_of_voice" : [
{
"name" : "Alchetype" ,
"domain" : "alchetype.co" ,
"mentions" : 2 ,
"share" : 100 ,
"you" : false
}
],
"limits" : {
"ai_visibility_prompts" : {
"kind" : "capacity" ,
"window" : null ,
"limit" : 25 ,
"used" : 1 ,
"remaining" : 24 ,
"resets_at" : null
}
}
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:keywords scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/uptime
Your uptime monitors: state (up, down, unknown, paused), the last check (HTTP status, response time, reason when down), uptime percentages for 24 hours, 7 and 30 days, and the latest incidents. Empty when your plan has no uptime monitoring.
MCP tool uptime_status
Scope read:seo
Plan Pro and above
Parameters
Name In Type Required Description
site
query
string
No
Keep one of your sites (host, see list_sites).
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/uptime" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "uptime_status" ,
"arguments" : {}
}
}
Example response Example
json Copy
{
"data" : [
{
"site" : "example.com" ,
"url" : "https://example.com/" ,
"state" : "up" ,
"active" : true ,
"since" : "2026-10-12T08:00:00+00:00" ,
"last_checked_at" : "2026-10-19T09:59:00+00:00" ,
"last_status_code" : 200 ,
"last_response_ms" : 142 ,
"last_error" : null ,
"uptime" : {
"h24" : 100 ,
"d7" : 99.94 ,
"d30" : 99.9
},
"incidents" : [
{
"started_at" : "2026-10-11T22:10:00+00:00" ,
"ended_at" : "2026-10-11T22:19:00+00:00" ,
"minutes" : 9 ,
"error" : "status" ,
"status_code" : 503
}
]
}
],
"meta" : {
"total" : 1 ,
"interval_minutes" : 1 ,
"limit" : 3
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:seo scope.
403 plan_requiredThe plan does not include API access.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/reports
Your white-label PDF reports, newest first (status queued, done or failed), and your scheduled client reports with their recipients. download_url opens the PDF for the signed-in owner of the account for 30 minutes. Empty without white-label reports on your plan.
MCP tool list_reports
Scope read:seo
Plan Pro and above
Parameters
Name In Type Required Description
site
query
string
No
Keep one of your sites (host, see list_sites).
limit
query
integer
No
Page size, 1 to 100.
cursor
query
string
No
meta.next_cursor of the previous page.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/reports" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "list_reports" ,
"arguments" : {}
}
}
Example response Example
json Copy
{
"data" : [
{
"id" : 12 ,
"site" : "example.com" ,
"status" : "done" ,
"source" : "schedule" ,
"size_bytes" : 148220 ,
"created_at" : "2026-10-19T06:00:00+00:00" ,
"download_url" : "https://woodander.com/workspace/seo/client-reports/12/download?signature=…"
}
],
"meta" : {
"next_cursor" : null ,
"limit" : 25 ,
"total" : 1 ,
"schedules" : [
{
"id" : 3 ,
"site" : "example.com" ,
"frequency" : "monthly" ,
"active" : true ,
"recipients" : 2 ,
"unsubscribed" : 0
}
]
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the read:seo scope.
403 plan_requiredThe plan does not include API access.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
POST
/api/v1/sites/{site}/audits
Start a site audit of one of your sites, within your plan (the free plan has one audit a month, and only one audit runs at a time). The audit runs in the background: read it with list_audits and get_audit. What happens depends on the mode the owner set for this module in Settings → AI activity: Manual stores a proposal the owner applies in the Workspace (the answer has a confirm_url), Hybrid and Autonomous run it. Poll agent_change_status with the id.
MCP tool run_audit
Scope run:audits
Plan Pro and above
Parameters
Name In Type Required Description
site
path
string
Yes
Host of one of your sites (see list_sites).
Example request
curl
MCP
bash Copy
curl -X POST "https://woodander.com/api/v1/sites/example.com/audits" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "run_audit" ,
"arguments" : {
"site" : "example.com"
}
}
}
Example response Example
json Copy
{
"data" : {
"id" : 41 ,
"action" : "seo.run_audit" ,
"risk" : "reversible" ,
"status" : "done" ,
"needs" : null ,
"summary" : "Start a site audit of example.com" ,
"diff" : [],
"requested_by" : "Token “Claude Code”" ,
"note" : null ,
"error" : null ,
"result" : {
"summary" : "Audit of example.com started. It runs in the background." ,
"audit_id" : 18
},
"confirm_url" : null ,
"created_at" : "2026-10-19T09:00:00+00:00" ,
"decided_at" : null
},
"meta" : {
"outcome" : "done" ,
"module" : "seo" ,
"mode" : "hybrid" ,
"hint" : null
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 insufficient_scopeThe token does not have the run:audits scope.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/agent/changes
The last 50 change requests of one module (media, seo, autopilot or market): proposals and confirmations waiting for the owner, and what ran. Needs the module's read scope (read:media, read:seo, read:autopilot, read:market).
MCP tool agent_changes
Scope any
Plan Pro and above
Parameters
Name In Type Required Description
module
query
string
Yes
The module. One of: media, seo, autopilot, market.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/agent/changes?module=media" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "agent_changes" ,
"arguments" : {
"module" : "media"
}
}
}
Example response Example
json Copy
{
"data" : [
{
"id" : 41 ,
"action" : "media.update_draft" ,
"risk" : "reversible" ,
"status" : "pending" ,
"needs" : "apply" ,
"summary" : "Update the draft “Notes on a quiet launch” (title)" ,
"diff" : [],
"requested_by" : "Token “Claude Code”" ,
"note" : null ,
"error" : null ,
"result" : null ,
"confirm_url" : "https://woodander.com/workspace/settings/ai-activity?module=media&change=41" ,
"created_at" : "2026-10-19T09:00:00+00:00" ,
"decided_at" : null
}
],
"meta" : {
"total" : 1 ,
"module" : "media" ,
"mode" : "manual"
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 plan_requiredThe plan does not include API access.
422 invalid_requestA parameter is not valid (range, type, cursor).
429 rate_limitedToo many requests. See the Retry-After header.
GET
/api/v1/agent/changes/{id}
One change request of Media, SEO, Content Autopilot or Market by id: its status (pending, done, failed, rejected), what it waits for and the result. Needs the module's read scope.
MCP tool agent_change_status
Scope any
Plan Pro and above
Parameters
Name In Type Required Description
id
path
integer
Yes
The id a change request returned.
Example request
curl
MCP
bash Copy
curl "https://woodander.com/api/v1/agent/changes/12" \
-H "Authorization: Bearer wdr_..."
tools/call Copy
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"method" : "tools/call" ,
"params" : {
"name" : "agent_change_status" ,
"arguments" : {
"id" : 12
}
}
}
Example response Example
json Copy
{
"data" : {
"id" : 41 ,
"action" : "seo.run_audit" ,
"risk" : "reversible" ,
"status" : "done" ,
"needs" : null ,
"summary" : "Start a site audit of example.com" ,
"diff" : [],
"requested_by" : "Token “Claude Code”" ,
"note" : null ,
"error" : null ,
"result" : {
"summary" : "Audit of example.com started. It runs in the background." ,
"audit_id" : 18
},
"confirm_url" : null ,
"created_at" : "2026-10-19T09:00:00+00:00" ,
"decided_at" : null
},
"meta" : {
"outcome" : "done" ,
"module" : "seo" ,
"mode" : "hybrid" ,
"hint" : null
}
}
Errors
HTTP Code Meaning
401 unauthenticatedMissing, invalid, expired or revoked token.
403 plan_requiredThe plan does not include API access.
404 not_foundNot found, or not yours.
429 rate_limitedToo many requests. See the Retry-After header.