{"openapi":"3.1.0","info":{"title":"Woodander API","version":"1.0.0","description":"Your Woodander data with a personal access token, plus Google Tag Manager changes under the mode you set per site. Create a token in the Workspace under Settings, API & MCP."},"servers":[{"url":"https:\/\/woodander.com\/api\/v1"}],"paths":{"\/whoami":{"get":{"operationId":"whoami","summary":"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.","tags":["account"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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"}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites":{"get":{"operationId":"list_sites","summary":"Your SEO sites with Search Console connection status and the latest audit.","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/search-console\/summary":{"get":{"operationId":"search_console_summary","summary":"Clicks, impressions, CTR and average position for a period, the previous period and the daily series. Served from synced data; with a range of 3 months or more, from\/to, compare, search_type or filters it is a live Search Console query (cached for an hour).","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["7d","28d","90d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"search_type","in":"query","required":false,"description":"Search Console search type (live). Default web.","schema":{"type":"string","enum":["web","image","video","news","discover","googleNews"]}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": query|page|country|device|appearance, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","property":"sc-domain:example.com","range":{"key":"28d","days":28,"from":"2026-09-18","to":"2026-10-15"},"totals":{"clicks":420,"impressions":9800,"ctr":4.29,"position":11.4},"previous_period":{"clicks":380,"impressions":9100,"ctr":4.18,"position":12},"daily":[{"date":"2026-10-15","clicks":15,"impressions":350,"ctr":4.29,"position":11.1}]},"meta":{"synced_at":"2026-10-17T03:00:00+00:00","source":"synced_search_console"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/search-console\/queries":{"get":{"operationId":"search_console_queries","summary":"Search queries of the last 28 days (the synced snapshot), sortable and filterable. With from\/to, range, compare, search_type, dimension or filters it is a live Search Console query (up to 25,000 rows, cached for an hour).","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["7d","28d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"search_type","in":"query","required":false,"description":"Search Console search type (live). Default web.","schema":{"type":"string","enum":["web","image","video","news","discover","googleNews"]}},{"name":"dimension","in":"query","required":false,"description":"Group the rows by this dimension instead of the default (live).","schema":{"type":"string","enum":["query","page","country","device","date","appearance"]}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": query|page|country|device|appearance, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}},{"name":"filter","in":"query","required":false,"description":"Keep queries containing this text.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Default clicks. Position sorts best first.","schema":{"type":"string","enum":["clicks","impressions","ctr","position"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 200.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"value":"best seo tools","clicks":12,"impressions":340,"ctr":3.53,"position":6.2}],"meta":{"next_cursor":null,"limit":50,"total":1,"site":"example.com","dimension":"query","window":"last_28_days","sort":"clicks","synced_at":"2026-10-17T03:00:00+00:00"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/search-console\/pages":{"get":{"operationId":"search_console_pages","summary":"Pages of the last 28 days (the synced snapshot), sortable and filterable. With from\/to, range, compare, search_type, dimension or filters it is a live Search Console query (up to 25,000 rows, cached for an hour).","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["7d","28d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"search_type","in":"query","required":false,"description":"Search Console search type (live). Default web.","schema":{"type":"string","enum":["web","image","video","news","discover","googleNews"]}},{"name":"dimension","in":"query","required":false,"description":"Group the rows by this dimension instead of the default (live).","schema":{"type":"string","enum":["query","page","country","device","date","appearance"]}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": query|page|country|device|appearance, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}},{"name":"filter","in":"query","required":false,"description":"Keep page URLs containing this text.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Default clicks. Position sorts best first.","schema":{"type":"string","enum":["clicks","impressions","ctr","position"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 200.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"value":"https:\/\/example.com\/blog\/guide","clicks":12,"impressions":340,"ctr":3.53,"position":6.2}],"meta":{"next_cursor":null,"limit":50,"total":1,"site":"example.com","dimension":"page","window":"last_28_days","sort":"clicks","synced_at":"2026-10-17T03:00:00+00:00"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/search-console\/opportunities":{"get":{"operationId":"search_opportunities","summary":"Queries worth acting on: striking distance (position 4 to 20) and low click-through in the top 5.","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","striking_distance":[{"value":"best seo tools","clicks":12,"impressions":340,"ctr":3.53,"position":6.2}],"low_ctr":[]},"meta":{"window":"last_28_days","synced_at":"2026-10-17T03:00:00+00:00"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/ga4\/summary":{"get":{"operationId":"ga4_summary","summary":"Google Analytics (GA4) sessions, users, engaged sessions and key events for a period, the previous period, the daily series, countries and devices. Served from synced data of the property you chose for the site; with a longer or custom range, compare, metrics or filters it is a live Data API report (cached for an hour).","tags":["read:analytics"],"security":[{"bearerAuth":["read:analytics"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["28d","90d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"metrics","in":"query","required":false,"description":"GA4 metrics to return (live): sessions, totalUsers, newUsers, engagedSessions, engagementRate, bounceRate, screenPageViews, eventCount, keyEvents, sessionKeyEventRate, averageSessionDuration, userEngagementDuration. Rates are percentages.","schema":{"type":"array","items":{"type":"string"}}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": a GA4 dimension such as pagePath, sessionSource, country, deviceCategory, eventName, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","property":"properties\/123456789","range":{"key":"28d","days":28,"through":"2026-10-16"},"totals":{"sessions":5200,"users":3900,"engaged_sessions":3100,"engagement_rate":59.6,"key_events":140},"previous_period":{"sessions":4800,"users":null,"engaged_sessions":2800,"engagement_rate":58.3,"key_events":120},"daily":[{"date":"2026-10-16","sessions":180,"users":150,"engaged_sessions":110,"key_events":5}],"countries":[{"value":"United States","sessions":1200,"users":900,"engaged_sessions":800,"engagement_rate":66.7,"key_events":30}],"devices":[{"value":"mobile","sessions":1200,"users":900,"engaged_sessions":800,"engagement_rate":66.7,"key_events":30}]},"meta":{"synced_at":"2026-10-17T03:45:00+00:00","source":"synced_google_analytics"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/ga4\/pages":{"get":{"operationId":"ga4_pages","summary":"Top pages by Google Analytics sessions for 28 or 90 days (the synced snapshot), sortable and filterable. With a longer or custom range, compare, dimension, metrics or filters it is a live Data API report (cached for an hour).","tags":["read:analytics"],"security":[{"bearerAuth":["read:analytics"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["28d","90d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"dimension","in":"query","required":false,"description":"Group the rows by this GA4 dimension instead of the default (live), e.g. country, deviceCategory, sessionDefaultChannelGroup, eventName, landingPage, date.","schema":{"type":"string"}},{"name":"metrics","in":"query","required":false,"description":"GA4 metrics to return (live): sessions, totalUsers, newUsers, engagedSessions, engagementRate, bounceRate, screenPageViews, eventCount, keyEvents, sessionKeyEventRate, averageSessionDuration, userEngagementDuration. Rates are percentages.","schema":{"type":"array","items":{"type":"string"}}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": a GA4 dimension such as pagePath, sessionSource, country, deviceCategory, eventName, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}},{"name":"filter","in":"query","required":false,"description":"Keep page paths containing this text.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Default sessions.","schema":{"type":"string","enum":["sessions","users","engaged_sessions","key_events"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"value":"\/blog\/guide","sessions":1200,"users":900,"engaged_sessions":800,"engagement_rate":66.7,"key_events":30}],"meta":{"next_cursor":null,"limit":25,"total":1,"site":"example.com","dimension":"page_path","range":"28d","sort":"sessions","synced_at":"2026-10-17T03:45:00+00:00"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/ga4\/sources":{"get":{"operationId":"ga4_sources","summary":"Traffic sources (source \/ medium, e.g. google \/ organic) by Google Analytics sessions for 28 or 90 days (the synced snapshot), sortable and filterable. With a longer or custom range, compare, dimension, metrics or filters it is a live Data API report (cached for an hour).","tags":["read:analytics"],"security":[{"bearerAuth":["read:analytics"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period ending yesterday. Default 28d. 3m and longer are live from Google.","schema":{"type":"string","enum":["28d","90d","3m","6m","12m","16m"]}},{"name":"from","in":"query","required":false,"description":"With to: a custom date range (YYYY-MM-DD), up to 16 months back. Answered live from Google (cached for an hour).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the custom date range (YYYY-MM-DD), not in the future.","schema":{"type":"string"}},{"name":"compare","in":"query","required":false,"description":"Compare with the previous period of the same length, or the same dates a year earlier (live).","schema":{"type":"string","enum":["none","previous","year"]}},{"name":"dimension","in":"query","required":false,"description":"Group the rows by this GA4 dimension instead of the default (live), e.g. country, deviceCategory, sessionDefaultChannelGroup, eventName, landingPage, date.","schema":{"type":"string"}},{"name":"metrics","in":"query","required":false,"description":"GA4 metrics to return (live): sessions, totalUsers, newUsers, engagedSessions, engagementRate, bounceRate, screenPageViews, eventCount, keyEvents, sessionKeyEventRate, averageSessionDuration, userEngagementDuration. Rates are percentages.","schema":{"type":"array","items":{"type":"string"}}},{"name":"filters","in":"query","required":false,"description":"Up to 8 conditions, all must match (live): a list of {\"dimension\": a GA4 dimension such as pagePath, sessionSource, country, deviceCategory, eventName, \"operator\": \"contains|not_contains|equals|not_equals|regex|not_regex\", \"value\"}. Regular expressions use RE2 syntax. In Search Console country is a 3-letter code (deu) and device is desktop, mobile or tablet.","schema":{"type":"array","items":{"type":"object"}}},{"name":"filter","in":"query","required":false,"description":"Keep sources containing this text.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Default sessions.","schema":{"type":"string","enum":["sessions","users","engaged_sessions","key_events"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"value":"google \/ organic","sessions":1200,"users":900,"engaged_sessions":800,"engagement_rate":66.7,"key_events":30}],"meta":{"next_cursor":null,"limit":25,"total":1,"site":"example.com","dimension":"source_medium","range":"28d","sort":"sessions","synced_at":"2026-10-17T03:45:00+00:00"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/audits":{"get":{"operationId":"list_audits","summary":"Site audits of one site, newest first.","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}},"post":{"operationId":"run_audit","summary":"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 \u2192 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.","tags":["run:audits"],"security":[{"bearerAuth":["run:audits"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites (see list_sites).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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 \u201cClaude Code\u201d","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}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/audits\/{id}":{"get":{"operationId":"get_audit","summary":"One audit: score with its health read (grade A\u2013F, the fixes that reach the next grade and a 0\u2013100 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).","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Audit id (see list_audits).","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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":[]}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/pagespeed":{"get":{"operationId":"pagespeed_check","summary":"Run Google PageSpeed on one page of your own sites and get everything needed to fix the code: score, lab and field (Chrome UX Report) metrics and, for each failing audit, the resources to change (render-blocking scripts and styles, unused JS and CSS with URLs and bytes, oversized images, fonts, LCP element, layout-shift elements, long tasks, third parties, cache lifetimes, redirects, server response time). Needs the site-audit plan feature; 30 fresh runs an hour and 100 a day (answers are cached 10 minutes and do not count).","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Full page address on one of your sites (see list_sites), e.g. https:\/\/example.com\/pricing.","schema":{"type":"string"}},{"name":"strategy","in":"query","required":false,"description":"Device: mobile (default) or desktop.","schema":{"type":"string","enum":["mobile","desktop"]}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"url":"https:\/\/example.com\/","fetched_at":"2026-10-19T09:00:00.000Z","final_url":"https:\/\/example.com\/","strategy":"mobile","score":62,"lab":[{"id":"largest-contentful-paint","label":"Largest Contentful Paint","value":"4.1 s","score":0.4,"numeric_value":4100}],"field":null,"truncated":false,"audits":[{"id":"render-blocking-resources","title":"Eliminate render-blocking resources","description":"Resources are blocking the first paint of your page.","score":0.3,"display_value":"Potential savings of 1,200 ms","savings_ms":1200,"savings_bytes":0,"items_total":1,"items":[{"url":"https:\/\/example.com\/assets\/app.css","totalBytes":48000,"wastedMs":1200}]}]},"meta":{"site":"example.com","strategy":"mobile","cached":false}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/products":{"get":{"operationId":"list_products","summary":"Your Discover projects.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"slug":"lumen-notes","name":"Lumen Notes","website_url":"https:\/\/lumen.example","short_description":"Notes that think.","status":"published","claim_status":"claimed","category":"productivity","logo_url":null,"public_url":"https:\/\/woodander.com\/products\/lumen-notes","published_at":"2026-09-01T08:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/products\/{slug}":{"get":{"operationId":"get_product","summary":"One of your projects with its full description.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see list_products).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"slug":"lumen-notes","name":"Lumen Notes","description":"Long text","pricing_model":"freemium","platforms":["web"],"status":"published"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/products\/{slug}\/analytics":{"get":{"operationId":"product_analytics","summary":"Views, outbound clicks, visitors, leads, daily series, referrers and campaigns. Ranges over 30 days need the advanced analytics plan feature.","tags":["read:analytics"],"security":[{"bearerAuth":["read:analytics"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see list_products).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period. Default 30d.","schema":{"type":"string","enum":["7d","30d","90d","365d"]}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"product":"lumen-notes","range":{"days":30,"from":"2026-09-18","to":"2026-10-17"},"totals":{"views":900,"clicks":120,"visitors":640,"ctr":13.3,"leads":4},"daily":[{"date":"2026-10-17","views":30,"clicks":4}],"referrers":[{"name":"Direct","views":400}],"campaigns":[]},"meta":{"range_limited":false}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/articles":{"get":{"operationId":"list_articles","summary":"Your written pieces: Woodander Media articles, posts for your own site and Content Studio drafts, newest first.","tags":["read:media"],"security":[{"bearerAuth":["read:media"]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Keep one status, e.g. draft, in_review, published.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Keep one kind.","schema":{"type":"string","enum":["media","site_post","seo_content"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":"media-12","type":"media","title":"How we ship","status":"published","excerpt":"Short.","locale":"en","slug":"how-we-ship","url":"https:\/\/woodander.com\/media\/how-we-ship","is_sponsored":false,"product":null,"site":null,"published_at":"2026-10-01T08:00:00+00:00","updated_at":"2026-10-02T08:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1,"status":null,"type":null}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/articles\/{id}":{"get":{"operationId":"get_article","summary":"One article with its Markdown body (the latest working draft while it is being edited).","tags":["read:media"],"security":[{"bearerAuth":["read:media"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Article id such as media-12, site_post-5 or seo_content-3 (see list_articles).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":"media-12","type":"media","title":"How we ship","status":"draft","body_markdown":"# Heading\n\nText."}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/gtm\/containers":{"get":{"operationId":"gtm_list_containers","summary":"Your Google Tag Manager accounts and containers, which site each one is chosen for, its mode, and the Tag Manager permissions you gave Woodander.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"public_id":"GTM-AB12CD","name":"example.com","account":"Example","site":"example.com","mode":"hybrid","usage":["web"]}],"meta":{"total":1,"permissions":{"read":true,"edit":true,"publish":false}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/workspaces":{"get":{"operationId":"gtm_list_workspaces","summary":"The workspaces of the site's container and the one Woodander reads (its own \"Woodander\" workspace when it exists, else the Default Workspace).","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","container":"GTM-AB12CD","workspaces":[{"id":"7","name":"Default Workspace"},{"id":"9","name":"Woodander"}],"in_use":{"id":"9","name":"Woodander","fingerprint":"1697623","is_woodander":true}},"meta":{"source":"gtm_snapshot"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/container":{"get":{"operationId":"gtm_get_container","summary":"The container snapshot: tags, triggers and variables in plain words, enabled built-in variables and the versions. Served from a cache keyed by the workspace fingerprint; refresh=true asks Google again.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"refresh","in":"query","required":false,"description":"Read from Google instead of the cached snapshot (uses the shared quota).","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","mode":"hybrid","container":{"public_id":"GTM-AB12CD","name":"example.com"},"workspace":{"id":"9","name":"Woodander","is_woodander":true},"tags":[{"id":"3","name":"Google tag - G-ABC123","type":"googtag","details":[{"label":"Type","value":"Google tag"},{"label":"ID","value":"G-ABC123"},{"label":"Fires on","value":"All Pages"}],"firing_trigger_ids":["2147479553"],"paused":false}],"triggers":[],"variables":[],"built_in_variables":["Page URL","Event"],"versions":[{"id":"4","name":"Launch","tags":3,"deleted":false}],"fetched_at":"2026-10-18T10:00:00+00:00"},"meta":{"stale":false,"source":"gtm_snapshot"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/analysis":{"get":{"operationId":"gtm_analyze_tracking","summary":"Compares the container with a tracking plan (default page_view, sign_up, begin_checkout, purchase): missing events, duplicates (two Google tags or GA4 configurations with the same measurement id, an event sent twice), tags without or with broken triggers, undefined variables, unused triggers, and sign-ups or purchases sent on a click.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"events","in":"query","required":false,"description":"Your plan: GA4 event names separated by commas, e.g. page_view,sign_up,test_started,purchase.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","plan":[{"event":"page_view","status":"ok","tags":["Google tag - G-ABC123"]},{"event":"sign_up","status":"missing","tags":[]}],"issues":[{"code":"missing_events","severity":"warning","message":"Events of the tracking plan that no tag sends.","items":["sign_up"]}],"counts":{"tags":1,"triggers":0,"variables":0}},"meta":{"source":"gtm_snapshot"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/scan":{"get":{"operationId":"gtm_scan_site","summary":"Reads one live page of your site and finds tags hard-coded in its HTML: gtag.js \/ GA4 (G-), Google Ads (AW-), Meta Pixel, Microsoft Clarity, Hotjar, LinkedIn Insight, TikTok Pixel and an existing GTM snippet. Changes nothing.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"A page of this site (path or full https URL). Default: the start page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","url":"https:\/\/example.com\/","status":200,"found":[{"vendor":"ga4","label":"Google Analytics 4 (gtag.js)","id":"G-ABC123","evidence":"gtag.js"},{"vendor":"meta_pixel","label":"Meta Pixel","id":"1234567890","evidence":"fbq init"}],"gtm_snippets":["GTM-AB12CD"]},"meta":{"changes_site":false}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/migration-plan":{"get":{"operationId":"gtm_plan_migration","summary":"Site \u2192 GTM: the tags that would replace the snippets hard-coded on the page, as ready inputs for gtm_create_tag, plus warnings. Never publishes and never edits the site: remove the snippets in the site's code and publish together with that deploy, or everything is counted twice.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"A page of this site. Default: the start page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"site":"example.com","container":"GTM-AB12CD","scan":{"url":"https:\/\/example.com\/","found":[]},"steps":[{"action":"gtm.create_tag","vendor":"meta_pixel","input":{"name":"Meta Pixel - base code","type":"html","html":"<script>...<\/script>","firing_trigger_ids":["2147479553"]},"reason":"Replaces the hard-coded Meta Pixel (1234567890)."}],"already_in_gtm":["Google tag - G-ABC123"],"manual":[],"warnings":["While a snippet stays in the site\u2019s code and the same tag is live in Tag Manager, every visit and event is counted twice. Publish the version only together with the deploy that removes the snippets from the site."]},"meta":{"publishes":false,"source":"gtm_snapshot"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/changes":{"get":{"operationId":"gtm_list_changes","summary":"The last 50 change requests for the site's container: proposals, changes waiting for the owner's confirmation, queued, done, failed and rejected ones, each with its diff.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":12,"action":"gtm.create_tag","risk":"reversible","status":"pending","needs":"apply","summary":"Create tag \u201cGA4 event - sign_up\u201d (GA4 event)","diff":[{"op":"+","kind":"tag","name":"GA4 event - sign_up","details":["Type: GA4 event","ID: G-ABC123","Event: sign_up","Fires on: CE - sign_up"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/seo\/tag-manager?site=example.com&change=12","created_at":"2026-10-18T10:00:00+00:00","decided_at":null}],"meta":{"total":1,"site":"example.com"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/gtm\/changes\/{id}":{"get":{"operationId":"gtm_change_status","summary":"One change request (or a queued read) by id: its status (pending, queued, running, done, failed, rejected), what it waits for and the result, e.g. the GTM version id.","tags":["read:gtm"],"security":[{"bearerAuth":["read:gtm"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The id a change or a queued read returned.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.create_version","risk":"reversible","status":"done","needs":null,"summary":"Create version \u201csign_up tracking\u201d from the Woodander workspace","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Create version \u201csign_up tracking\u201d from the Woodander workspace","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/tags":{"post":{"operationId":"gtm_create_tag","summary":"Create a tag in the \"Woodander\" workspace (never the live Default Workspace). A duplicate (same name, same Google tag id, same GA4 event to the same id) is refused. Manual mode: stored as a proposal the owner applies.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","type"],"properties":{"name":{"type":"string","description":"Tag name, e.g. \"GA4 event - sign_up\"."},"type":{"type":"string","enum":["googtag","gaawe","html","awct","gclidw"],"description":"googtag = Google tag (GA4 \/ Ads id), gaawe = GA4 event, html = Custom HTML, awct = Google Ads conversion, gclidw = Conversion Linker."},"google_tag_id":{"type":"string","description":"googtag: the id it loads, e.g. G-ABC123 or AW-123456."},"measurement_id":{"type":"string","description":"gaawe: the GA4 measurement id the event is sent to, e.g. G-ABC123."},"event_name":{"type":"string","description":"gaawe: the GA4 event name, e.g. sign_up, or one variable reference such as {{Event}} (a variable of the container or a built-in one) to send many events with one tag."},"event_parameters":{"type":"array","items":{"type":"object"},"description":"gaawe: event parameters, a list of {\"name\", \"value\"} (value may be a {{Variable}})."},"html":{"type":"string","description":"html: the Custom HTML."},"conversion_id":{"type":"string","description":"awct: Google Ads conversion id."},"conversion_label":{"type":"string","description":"awct: Google Ads conversion label."},"firing_trigger_ids":{"type":"array","items":{"type":"string"},"description":"Ids of the triggers that fire it (2147479553 = All Pages). One of firing_trigger_ids or firing_trigger_names is required to create."},"firing_trigger_names":{"type":"array","items":{"type":"string"},"description":"Trigger names instead of ids, resolved when the change runs (use it for a trigger another change creates first)."},"paused":{"type":"boolean","description":"Pause the tag."},"notes":{"type":"string","description":"Notes kept on the tag."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.create_tag","risk":"reversible","status":"pending","needs":"apply","summary":"Create tag \u201cGA4 event - sign_up\u201d (GA4 event)","diff":[{"op":"+","kind":"tag","name":"GA4 event - sign_up","details":["Type: GA4 event","ID: G-ABC123","Event: sign_up","Fires on: CE - sign_up"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/seo\/tag-manager?site=example.com&change=12","created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"proposed","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/tags\/{id}":{"patch":{"operationId":"gtm_update_tag","summary":"Update a tag in the \"Woodander\" workspace. Fields you send replace those of the tag; the others stay.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"id","in":"path","required":true,"description":"GTM tag id (numeric, see gtm_get_container).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"name":{"type":"string","description":"Tag name, e.g. \"GA4 event - sign_up\"."},"google_tag_id":{"type":"string","description":"googtag: the id it loads, e.g. G-ABC123 or AW-123456."},"measurement_id":{"type":"string","description":"gaawe: the GA4 measurement id the event is sent to, e.g. G-ABC123."},"event_name":{"type":"string","description":"gaawe: the GA4 event name, e.g. sign_up, or one variable reference such as {{Event}} (a variable of the container or a built-in one) to send many events with one tag."},"event_parameters":{"type":"array","items":{"type":"object"},"description":"gaawe: event parameters, a list of {\"name\", \"value\"} (value may be a {{Variable}})."},"html":{"type":"string","description":"html: the Custom HTML."},"conversion_id":{"type":"string","description":"awct: Google Ads conversion id."},"conversion_label":{"type":"string","description":"awct: Google Ads conversion label."},"firing_trigger_ids":{"type":"array","items":{"type":"string"},"description":"Ids of the triggers that fire it (2147479553 = All Pages). One of firing_trigger_ids or firing_trigger_names is required to create."},"firing_trigger_names":{"type":"array","items":{"type":"string"},"description":"Trigger names instead of ids, resolved when the change runs (use it for a trigger another change creates first)."},"paused":{"type":"boolean","description":"Pause the tag."},"notes":{"type":"string","description":"Notes kept on the tag."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.update_tag","risk":"reversible","status":"done","needs":null,"summary":"Update tag #25","diff":[{"op":"~","kind":"tag","name":"GA4 event - sign_up","details":["Event: signup \u2192 sign_up"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Update tag #25","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}},"delete":{"operationId":"gtm_delete_tag","summary":"Delete a tag in the \"Woodander\" workspace. Deleting always waits for the owner's confirmation in the Workspace (confirm_url), in every mode.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"id","in":"path","required":true,"description":"GTM tag id (numeric, see gtm_get_container).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.delete_tag","risk":"destructive","status":"pending","needs":"confirm","summary":"Delete tag #25","diff":[{"op":"-","kind":"tag","name":"Old pixel","details":["Type: Custom HTML"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/seo\/tag-manager?site=example.com&change=12","created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"pending_confirmation","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/triggers":{"post":{"operationId":"gtm_create_trigger","summary":"Create a trigger in the \"Woodander\" workspace. A custom event trigger for an event that already has one is refused.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","type"],"properties":{"name":{"type":"string","description":"Trigger name, e.g. \"CE - sign_up\"."},"type":{"type":"string","enum":["pageview","domReady","windowLoaded","customEvent","click","linkClick","formSubmission","historyChange"],"description":"Trigger type."},"event_name":{"type":"string","description":"customEvent: the dataLayer event it listens for."},"filters":{"type":"array","items":{"type":"object"},"description":"Conditions, a list of {\"variable\": \"Page Path\", \"operator\": \"equals|contains|startsWith|endsWith|matchRegex\", \"value\"}."},"notes":{"type":"string","description":"Notes kept on the trigger."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.create_trigger","risk":"reversible","status":"done","needs":null,"summary":"Create trigger \u201cCE - sign_up\u201d (Custom event)","diff":[{"op":"+","kind":"trigger","name":"CE - sign_up","details":["Type: Custom event","Event: sign_up"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Create trigger \u201cCE - sign_up\u201d (Custom event)","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/triggers\/{id}":{"patch":{"operationId":"gtm_update_trigger","summary":"Update a trigger in the \"Woodander\" workspace.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"id","in":"path","required":true,"description":"GTM trigger id (numeric, see gtm_get_container).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"name":{"type":"string","description":"Trigger name, e.g. \"CE - sign_up\"."},"event_name":{"type":"string","description":"customEvent: the dataLayer event it listens for."},"filters":{"type":"array","items":{"type":"object"},"description":"Conditions, a list of {\"variable\": \"Page Path\", \"operator\": \"equals|contains|startsWith|endsWith|matchRegex\", \"value\"}."},"notes":{"type":"string","description":"Notes kept on the trigger."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.update_trigger","risk":"reversible","status":"done","needs":null,"summary":"Update trigger #31","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Update trigger #31","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/variables":{"post":{"operationId":"gtm_create_variable","summary":"Create a variable in the \"Woodander\" workspace.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","type"],"properties":{"name":{"type":"string","description":"Variable name."},"type":{"type":"string","enum":["v","c","u","k","jsm"],"description":"v = data layer variable, c = constant, u = URL, k = 1st-party cookie, jsm = custom JavaScript."},"data_layer_name":{"type":"string","description":"v: the dataLayer key, e.g. ecommerce.value."},"value":{"type":"string","description":"c: the constant value."},"component":{"type":"string","enum":["URL","HOST","PATH","QUERY","FRAGMENT"],"description":"u: the part of the URL."},"cookie_name":{"type":"string","description":"k: the cookie name."},"javascript":{"type":"string","description":"jsm: function () { return ...; }"},"notes":{"type":"string","description":"Notes kept on the variable."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.create_variable","risk":"reversible","status":"done","needs":null,"summary":"Create variable \u201cDLV - value\u201d (Data layer variable)","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Create variable \u201cDLV - value\u201d (Data layer variable)","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/variables\/{id}":{"patch":{"operationId":"gtm_update_variable","summary":"Update a variable in the \"Woodander\" workspace.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"id","in":"path","required":true,"description":"GTM variable id (numeric, see gtm_get_container).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"name":{"type":"string","description":"Variable name."},"data_layer_name":{"type":"string","description":"v: the dataLayer key, e.g. ecommerce.value."},"value":{"type":"string","description":"c: the constant value."},"component":{"type":"string","enum":["URL","HOST","PATH","QUERY","FRAGMENT"],"description":"u: the part of the URL."},"cookie_name":{"type":"string","description":"k: the cookie name."},"javascript":{"type":"string","description":"jsm: function () { return ...; }"},"notes":{"type":"string","description":"Notes kept on the variable."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.update_variable","risk":"reversible","status":"done","needs":null,"summary":"Update variable #40","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Update variable #40","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/versions":{"post":{"operationId":"gtm_create_version","summary":"Turn the \"Woodander\" workspace into a container version. Not live: publishing is a separate step (gtm_publish_version). Google removes the workspace afterwards; the next change makes a new one.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Version name."},"notes":{"type":"string","description":"What changed and why."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.create_version","risk":"reversible","status":"done","needs":null,"summary":"Create version \u201csign_up tracking\u201d from the Woodander workspace","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Create version \u201csign_up tracking\u201d from the Woodander workspace","ids":{"tag_id":"25"}},"confirm_url":null,"created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/versions\/{version_id}\/publish":{"post":{"operationId":"gtm_publish_version","summary":"Make a version live. Guarded: in Manual and Hybrid it returns a pending confirmation (confirm_url) the owner gives in the Workspace; only in Autonomous mode, with a token that also holds publish:gtm and within the daily publish cap, it publishes at once (duplicate check, the previous version kept for rollback, an email to the owner).","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}},{"name":"version_id","in":"path","required":true,"description":"The version id (from gtm_create_version or gtm_get_container).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.publish_version","risk":"publish","status":"pending","needs":"confirm","summary":"Publish version 5","diff":[{"op":"~","kind":"live version","name":"version 5 \u201csign_up tracking\u201d","details":["Becomes live on the site for every visitor"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/seo\/tag-manager?site=example.com&change=12","created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"pending_confirmation","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/gtm\/rollback":{"post":{"operationId":"gtm_rollback","summary":"Republish the version that was live before the last publish through Woodander (or the version you name). Same guard as gtm_publish_version.","tags":["write:gtm"],"security":[{"bearerAuth":["write:gtm"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites with a Tag Manager container chosen for it (see gtm_list_containers).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"version_id":{"type":"string","description":"A version to go back to. Default: the one live before the last publish."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":12,"action":"gtm.rollback","risk":"publish","status":"pending","needs":"confirm","summary":"Roll back to the version live before the last publish","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/seo\/tag-manager?site=example.com&change=12","created_at":"2026-10-18T10:00:00+00:00","decided_at":null},"meta":{"outcome":"pending_confirmation","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/keywords\/ideas":{"get":{"operationId":"keyword_ideas","summary":"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.","tags":["read:keywords"],"security":[{"bearerAuth":["read:keywords"]}],"parameters":[{"name":"site","in":"query","required":true,"description":"Host of one of your sites (see list_sites); the keywords belong to it and set the default location and language.","schema":{"type":"string"}},{"name":"seed","in":"query","required":false,"description":"Up to 5 keywords separated by commas. Leave it out for keywords of the site itself.","schema":{"type":"string"}},{"name":"location","in":"query","required":false,"description":"Location code, e.g. 2840 United States, 2826 United Kingdom, 2276 Germany, 2724 Spain, 2804 Ukraine. Default: the site's market.","schema":{"type":"integer"}},{"name":"language","in":"query","required":false,"description":"Language code: en, de, es, uk, pl, fr, it, nl. Default: the site's language.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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"}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/keywords\/tracked":{"get":{"operationId":"tracked_keywords","summary":"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).","tags":["read:keywords"],"security":[{"bearerAuth":["read:keywords"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 200.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/keywords\/tracked\/{id}\/history":{"get":{"operationId":"rank_history","summary":"The position history of one tracked keyword: every finished check in the period, oldest first.","tags":["read:keywords"],"security":[{"bearerAuth":["read:keywords"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"id","in":"path","required":true,"description":"Tracked keyword id (see tracked_keywords).","schema":{"type":"integer"}},{"name":"days","in":"query","required":false,"description":"Period in days, 1 to 365. Default 90.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/ai-visibility":{"get":{"operationId":"ai_visibility","summary":"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.","tags":["read:keywords"],"security":[{"bearerAuth":["read:keywords"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites, e.g. example.com (see list_sites).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products":{"get":{"operationId":"discover_list_products","summary":"Your Discover projects with the AI mode you set for each (manual, hybrid, autonomous) and how many changes wait for you.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"slug":"lumen-notes","name":"Lumen Notes","website_url":"https:\/\/lumen.example","short_description":"Notes that think.","status":"published","claim_status":"claimed","category":"productivity","logo_url":null,"public_url":"https:\/\/woodander.com\/products\/lumen-notes","published_at":"2026-09-01T08:00:00+00:00","mode":"manual","pending_changes":1}],"meta":{"next_cursor":null,"limit":25,"total":1}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}":{"get":{"operationId":"discover_product_page","summary":"The full page of one of your products: the live version, your working draft (with what still blocks a submit), the review state, every language and the Briefs left this month.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"slug":"lumen-notes","name":"Lumen Notes","website_url":"https:\/\/lumen.example","short_description":"Notes that think.","status":"published","claim_status":"claimed","category":"productivity","logo_url":null,"public_url":"https:\/\/woodander.com\/products\/lumen-notes","published_at":"2026-09-01T08:00:00+00:00","mode":"manual","source_locale":"en","live":{"name":"Lumen Notes","website_url":"https:\/\/lumen.example","short_description":"Notes that think.","description":"Long text","highlights":["Backlinks"],"faq":[{"question":"Is there a free plan?","answer":"Yes."}],"links":[{"label":"Docs","url":"https:\/\/lumen.example\/docs"}],"screenshots":[{"url":"https:\/\/woodander.com\/storage\/discover\/1\/screenshots\/a.png","alt":"Editor"}],"video_url":null,"cta_label":null,"pricing":"freemium","pricing_model":null,"platforms":["web"]},"draft":{"name":"Lumen Notes","website_url":"https:\/\/lumen.example","short_description":"Notes that think.","description":"Long text","highlights":["Backlinks"],"faq":[{"question":"Is there a free plan?","answer":"Yes."}],"links":[{"label":"Docs","url":"https:\/\/lumen.example\/docs"}],"screenshots":[{"url":"https:\/\/woodander.com\/storage\/discover\/1\/screenshots\/a.png","alt":"Editor"}],"video_url":null,"cta_label":null,"pricing":"freemium","pricing_model":null,"platforms":["web"],"unsubmitted_edits":true,"problems":[],"edited_at":"2026-10-19T08:00:00+00:00"},"review":{"status":"in_review","submitted_at":"2026-10-18T08:00:00+00:00"},"languages":[{"locale":"uk","status":"draft","short_description":"","description":"","highlights":[],"faq":[]}],"newsroom":{"briefs_left_this_month":28,"url":"https:\/\/woodander.com\/newsroom\/lumen-notes"}},"meta":{"how_changes_go_live":"Page edits go to your draft; ..."}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/leads":{"get":{"operationId":"discover_leads","summary":"Leads from the lead form of one of your projects, newest first, with their status.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Only leads with this status.","schema":{"type":"string","enum":["new","contacted","archived"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":7,"name":"Ada","email":"ada@example.com","company":"Analytical","message":"Do you have a team plan?","status":"new","referrer":null,"created_at":"2026-10-18T10:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1,"product":"lumen-notes"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/reviews":{"get":{"operationId":"discover_reviews","summary":"Published reviews of one of your projects with your replies, newest first.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":4,"rating":5,"body":"Lovely tool for linked notes, the backlinks are great.","author":"Grace","reply":null,"replied_at":null,"created_at":"2026-10-17T10:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1,"product":"lumen-notes"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/analytics":{"get":{"operationId":"discover_analytics","summary":"Views, outbound clicks, visitors, leads, daily series, referrers and campaigns of one of your projects (as product_analytics). Ranges over 30 days need the advanced analytics plan feature.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"Period. Default 30d.","schema":{"type":"string","enum":["7d","30d","90d","365d"]}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"product":"lumen-notes","range":{"days":30,"from":"2026-09-20","to":"2026-10-19"},"totals":{"views":900,"clicks":120,"visitors":640,"ctr":13.3,"leads":4},"daily":[],"referrers":[],"campaigns":[]},"meta":{"range_limited":false}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/changes":{"get":{"operationId":"discover_list_changes","summary":"The last 50 change requests for one of your products: proposals and confirmations waiting for you, and what ran.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":31,"action":"discover.update_page","risk":"reversible","status":"pending","needs":"apply","summary":"Update the draft of Lumen Notes (tagline)","diff":[{"op":"~","kind":"Tagline","name":"","details":[],"before":"Notes that think.","after":"Notes that link themselves."}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/discover\/products\/lumen-notes\/ai-changes?change=31","created_at":"2026-10-19T09:00:00+00:00","decided_at":null}],"meta":{"total":1,"product":"lumen-notes","mode":"manual"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/changes\/{id}":{"get":{"operationId":"discover_change_status","summary":"One change request by id: its status (pending, done, failed, rejected), what it waits for and the result.","tags":["read:products"],"security":[{"bearerAuth":["read:products"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The id a change request returned.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.post_brief","risk":"publish","status":"done","needs":null,"summary":"Publish the Brief \u201cLumen 2.0 is out\u201d in the Newsroom of Lumen Notes","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Brief published in your Newsroom.","brief_id":12},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/page":{"patch":{"operationId":"discover_update_page","summary":"Change the tagline, description, highlights, FAQ or links of one of your projects. Same rules as the Workspace editor: it goes into your draft (or, with locale, that language's draft), never straight onto the live page; submit: true also sends the draft to Woodander editors, who approve it before the page changes. Fields you send replace those fields; the others stay. Manual mode: stored as a proposal the owner applies.","tags":["write:products"],"security":[{"bearerAuth":["write:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"locale":{"type":"string","description":"A language edition other than the project's own, e.g. uk or de: edits that language's draft (not links, not submit). A published language is refused: the owner edits it under Languages."},"short_description":{"type":"string","description":"Tagline, up to 80 characters."},"description":{"type":"string","description":"What it does, 80 to 600 characters."},"highlights":{"type":"array","items":{"type":"string"},"description":"Up to 6 short highlights."},"faq":{"type":"array","items":{"type":"object"},"description":"Up to 10 entries {\"question\", \"answer\"}, both required."},"links":{"type":"array","items":{"type":"object"},"description":"Up to 6 extra links {\"label\", \"url\"}."},"submit":{"type":"boolean","description":"Also send the draft to Woodander editors (needs a complete draft and a confirmed email)."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.update_page","risk":"reversible","status":"pending","needs":"apply","summary":"Update the draft of Lumen Notes (tagline)","diff":[{"op":"~","kind":"Tagline","name":"","details":[],"before":"Notes that think.","after":"Notes that link themselves."}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/discover\/products\/lumen-notes\/ai-changes?change=31","created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"proposed","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/screenshots":{"post":{"operationId":"discover_add_screenshot_from_url","summary":"Add a screenshot to the draft of one of your projects from a public https image address (PNG, JPG or WebP, at least 1200 \u00d7 650, cropped to 16:10, up to 8 MB, at most 8 screenshots). Downloaded when it runs; the page shows it after the draft is submitted and approved.","tags":["write:products"],"security":[{"bearerAuth":["write:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"https address of the image (no redirects, public hosts only)."},"alt":{"type":"string","description":"Alt text, up to 150 characters."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.add_screenshot_from_url","risk":"reversible","status":"done","needs":null,"summary":"Add a screenshot to the draft of Lumen Notes","diff":[{"op":"+","kind":"Screenshot","name":"","details":["https:\/\/lumen.example\/shot.png"]}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Screenshot added to your draft.","draft_id":3,"path":"discover\/1\/screenshots\/a.png"},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/briefs":{"post":{"operationId":"discover_post_brief","summary":"Publish a Newsroom Brief for one of your products: short news, live at once, within the monthly quota (see discover_product_page). Public, so in Manual and Hybrid it waits for the owner's confirmation (confirm_url); in Autonomous it is published.","tags":["write:products"],"security":[{"bearerAuth":["write:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["title","body"],"properties":{"title":{"type":"string","description":"Up to 120 characters."},"body":{"type":"string","description":"40 to 1200 characters, up to 3 paragraphs, no markup."},"source_url":{"type":"string","description":"A link to the source (http or https)."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.post_brief","risk":"publish","status":"pending","needs":"confirm","summary":"Publish the Brief \u201cLumen 2.0 is out\u201d in the Newsroom of Lumen Notes","diff":[{"op":"+","kind":"Brief","name":"Lumen 2.0 is out","details":[],"before":null,"after":"Linked notes, a new editor and ..."}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/discover\/products\/lumen-notes\/ai-changes?change=31","created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"pending_confirmation","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/reviews\/{review_id}\/reply":{"post":{"operationId":"discover_reply_review","summary":"Publish your reply under a review of one of your projects (one reply per review; a new one replaces it). Public, so in Manual and Hybrid it waits for the owner's confirmation (confirm_url).","tags":["write:products"],"security":[{"bearerAuth":["write:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}},{"name":"review_id","in":"path","required":true,"description":"Review id (see discover_reviews).","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["reply"],"properties":{"reply":{"type":"string","description":"Up to 1000 characters."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.reply_review","risk":"publish","status":"pending","needs":"confirm","summary":"Reply to the review by Grace (5\u2605) of Lumen Notes","diff":[{"op":"+","kind":"Reply","name":"","details":["Review: Lovely tool ..."],"before":null,"after":"Thank you, Grace!"}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":null,"confirm_url":"https:\/\/woodander.com\/workspace\/discover\/products\/lumen-notes\/ai-changes?change=31","created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"pending_confirmation","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/discover\/products\/{slug}\/leads\/{lead_id}":{"patch":{"operationId":"discover_update_lead_status","summary":"Mark a lead of one of your projects new, contacted or archived.","tags":["write:products"],"security":[{"bearerAuth":["write:products"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of one of your projects (see discover_list_products).","schema":{"type":"string"}},{"name":"lead_id","in":"path","required":true,"description":"Lead id (see discover_leads).","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["new","contacted","archived"],"description":"The new status."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":31,"action":"discover.update_lead_status","risk":"reversible","status":"done","needs":null,"summary":"Mark the lead from Ada as contacted","diff":[{"op":"~","kind":"Lead status","name":"Ada","details":[],"before":"new","after":"contacted"}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Lead marked as contacted.","lead_id":7},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/uptime":{"get":{"operationId":"uptime_status","summary":"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.","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"query","required":false,"description":"Keep one of your sites (host, see list_sites).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/reports":{"get":{"operationId":"list_reports","summary":"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.","tags":["read:seo"],"security":[{"bearerAuth":["read:seo"]}],"parameters":[{"name":"site","in":"query","required":false,"description":"Keep one of your sites (host, see list_sites).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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=\u2026"}],"meta":{"next_cursor":null,"limit":25,"total":1,"schedules":[{"id":3,"site":"example.com","frequency":"monthly","active":true,"recipients":2,"unsubscribed":0}]}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/articles\/drafts":{"post":{"operationId":"create_article_draft","summary":"Create a private Media draft from Markdown in your name. It stays private: sending it to Woodander editors (with your rights statement) is yours in the editor, editors review every piece, and paid labels are never touched. Drafts an agent wrote are marked AI-assisted. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["write:media"],"security":[{"bearerAuth":["write:media"]}],"parameters":[],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["title","body_markdown","locale"],"properties":{"title":{"type":"string","description":"Title, up to 160 characters."},"excerpt":{"type":"string","description":"Teaser, up to 300 characters."},"body_markdown":{"type":"string","description":"The body in Markdown (headings, lists, links, images by https address). Unsafe markup is removed."},"locale":{"type":"string","description":"Language code of the piece, e.g. en or uk."},"type":{"type":"string","description":"Format of the piece (default story)."},"topic_id":{"type":"integer","description":"A Media topic id."},"related_product_id":{"type":"integer","description":"One of your Discover projects the piece is about."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"media.create_draft","risk":"reversible","status":"done","needs":null,"summary":"Create the draft \u201cNotes on a quiet launch\u201d","diff":[{"op":"+","kind":"Title","name":"","details":["Language: en"],"before":null,"after":"Notes on a quiet launch"}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Draft saved. It is private until you send it to Woodander editors from the editor.","article_id":"media-12","editor_url":"https:\/\/woodander.com\/media\/edit\/12"},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","module":"media","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/articles\/drafts\/{id}":{"patch":{"operationId":"update_article_draft","summary":"Change the title, teaser or Markdown body of the working draft of one of your Media pieces. What is with the editors or published stays as it is until you send the draft again. Fields you send replace those fields. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["write:media"],"security":[{"bearerAuth":["write:media"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Id of one of your Media drafts, e.g. media-12 (see list_articles).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"title":{"type":"string","description":"Title, up to 160 characters."},"excerpt":{"type":"string","description":"Teaser, up to 300 characters."},"body_markdown":{"type":"string","description":"The body in Markdown (headings, lists, links, images by https address). Unsafe markup is removed."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"media.update_draft","risk":"reversible","status":"pending","needs":"apply","summary":"Update the draft \u201cNotes on a quiet launch\u201d (title)","diff":[{"op":"~","kind":"Title","name":"","details":[],"before":"Notes on a quiet launch","after":"Notes on a calm launch"}],"requested_by":"Token \u201cClaude Code\u201d","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":{"outcome":"proposed","module":"media","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/search-console\/sync":{"post":{"operationId":"queue_search_console_sync","summary":"Queue a refresh of the stored Search Console figures of one of your sites (never a live Google call from this request). Refused while the figures are under 15 minutes old. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["run:audits"],"security":[{"bearerAuth":["run:audits"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites (see list_sites).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"seo.queue_search_console_sync","risk":"reversible","status":"done","needs":null,"summary":"Refresh the Search Console figures of example.com","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Search Console refresh of example.com queued."},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","module":"seo","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/sites\/{site}\/ga4\/sync":{"post":{"operationId":"queue_ga4_sync","summary":"Queue a refresh of the stored Google Analytics (GA4) figures of one of your sites. Refused while the figures are under 15 minutes old. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["run:audits"],"security":[{"bearerAuth":["run:audits"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"Host of one of your sites (see list_sites).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"seo.queue_ga4_sync","risk":"reversible","status":"done","needs":null,"summary":"Refresh the Google Analytics figures of example.com","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Google Analytics refresh of example.com queued."},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","module":"seo","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/autopilot\/pieces":{"get":{"operationId":"list_autopilot_pieces","summary":"The pieces Content Autopilot wrote that wait for your review, with a preview of the text, open [Confirm: \u2026] markers (a piece with open markers cannot be approved) and the automatic quality checks.","tags":["read:autopilot"],"security":[{"bearerAuth":["read:autopilot"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":7,"kind":"partner","status":"awaiting_you","title":"Five habits of calm launches","excerpt":"What small teams do differently.","body_markdown":"## Start small \u2026","open_confirmations":false,"quality":{"passed":true,"issues":[]},"created_at":"2026-10-19T07:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1,"mode":"manual"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/autopilot\/pieces\/{id}\/approve":{"post":{"operationId":"approve_autopilot_piece","summary":"Approve a piece waiting for your review: it goes live on Woodander Media with its \"Partner content\" label, rel=\"sponsored\" and noindex, and is spot-checked by editors. Making it public, so in Manual and Hybrid it waits for the owner (confirm_url); only Autonomous runs it. Poll agent_change_status with the id.","tags":["write:autopilot"],"security":[{"bearerAuth":["write:autopilot"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Id of a piece waiting for your review (see list_autopilot_pieces).","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"autopilot.approve_piece","risk":"publish","status":"pending","needs":"confirm","summary":"Publish the piece \u201cFive habits of calm launches\u201d","diff":[{"op":"~","kind":"Piece","name":"Five habits of calm launches","details":["Goes live on Woodander Media with its \u201cPartner content\u201d label."],"before":"Waiting for your review","after":"Published"}],"requested_by":"Token \u201cClaude Code\u201d","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":{"outcome":"proposed","module":"autopilot","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/autopilot\/pieces\/{id}\/reject":{"post":{"operationId":"reject_autopilot_piece","summary":"Discard a piece waiting for your review; its allowance comes back and Autopilot schedules another. Removing something always waits for the owner (confirm_url) in every mode. Poll agent_change_status with the id.","tags":["write:autopilot"],"security":[{"bearerAuth":["write:autopilot"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Id of a piece waiting for your review (see list_autopilot_pieces).","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"autopilot.reject_piece","risk":"destructive","status":"pending","needs":"confirm","summary":"Discard the piece \u201cFive habits of calm launches\u201d","diff":[{"op":"-","kind":"Piece","name":"Five habits of calm launches","details":["Its allowance comes back and a new piece is scheduled."],"before":null,"after":null}],"requested_by":"Token \u201cClaude Code\u201d","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":{"outcome":"proposed","module":"autopilot","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/market\/listings":{"get":{"operationId":"list_market_listings","summary":"Your own Market listings (offers, swaps and requests) with their status (draft, pending, active, paused), availability and whether edits wait for review.","tags":["read:market"],"security":[{"bearerAuth":["read:market"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"listing":"sponsored-article-on-lumen-blog","type":"offer","title":"Sponsored article on Lumen blog","format":"sponsored_article","status":"active","availability":"available","summary":"A labelled article with one link.","compensation":"money","pricing_model":"fixed","price":220,"currency":"USD","has_changes_waiting_for_review":false,"updated_at":"2026-10-19T08:00:00+00:00"}],"meta":{"next_cursor":null,"limit":25,"total":1,"mode":"manual"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}},"post":{"operationId":"create_market_listing","summary":"Add a private draft listing (an offer, a swap or a request). It is never sent to Woodander editors or made public by an agent: you send it from the editor. Prices are never invented: send the amount you mean. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["write:market"],"security":[{"bearerAuth":["write:market"]}],"parameters":[],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["type","title","format"],"properties":{"type":{"type":"string","enum":["offer","swap","request"],"description":"What the listing is."},"title":{"type":"string","description":"Title, up to 140 characters."},"format":{"type":"string","description":"What is sold or needed, e.g. sponsored_article, review, newsletter_sponsorship, social_post, other."},"summary":{"type":"string","description":"One or two sentences, up to 600 characters."},"description":{"type":"string","description":"Longer text, up to 2,500 characters."},"compensation":{"type":"string","enum":["money","swap","either"],"description":"How it is settled."},"swap_give":{"type":"string","description":"What you give in exchange (required for a swap)."},"pricing_model":{"type":"string","enum":["fixed","from","negotiable","on_request"],"description":"How it is priced."},"price":{"type":"number","description":"Amount in whole units (required for fixed and from prices), never invented."},"currency":{"type":"string","description":"USD, EUR, GBP or UAH."},"audience_language":{"type":"string","description":"Audience language code, e.g. en."},"audience_country":{"type":"string","description":"Audience country or region key, e.g. us or global."},"topics":{"type":"array","items":{"type":"string"},"description":"Up to 5 topic keys."},"site_url":{"type":"string","description":"The address of the site or channel, https."},"details":{"type":"object","description":"Optional package, duration, placement, materials, restrictions (short texts)."},"timing_note":{"type":"string","description":"Your own estimate of timing, up to 160 characters."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"market.create_listing","risk":"reversible","status":"done","needs":null,"summary":"Add the draft listing \u201cSponsored article on Lumen blog\u201d","diff":[{"op":"+","kind":"Title","name":"","details":[],"before":null,"after":"Sponsored article on Lumen blog"}],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Draft listing saved. It is private until you send it to editors from the editor.","listing":"sponsored-article-on-lumen-blog"},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","module":"market","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/market\/listings\/{listing}":{"patch":{"operationId":"update_market_listing","summary":"Edit one of your listings (a draft, or a published one: its live version stays until editors review the edit, which you send from the editor). Fields you send replace those fields. A listing with the editors cannot be changed meanwhile. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["write:market"],"security":[{"bearerAuth":["write:market"]}],"parameters":[{"name":"listing","in":"path","required":true,"description":"Slug of one of your listings (see list_market_listings).","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"title":{"type":"string","description":"Title, up to 140 characters."},"format":{"type":"string","description":"What is sold or needed, e.g. sponsored_article, review, newsletter_sponsorship, social_post, other."},"summary":{"type":"string","description":"One or two sentences, up to 600 characters."},"description":{"type":"string","description":"Longer text, up to 2,500 characters."},"compensation":{"type":"string","enum":["money","swap","either"],"description":"How it is settled."},"swap_give":{"type":"string","description":"What you give in exchange (required for a swap)."},"pricing_model":{"type":"string","enum":["fixed","from","negotiable","on_request"],"description":"How it is priced."},"price":{"type":"number","description":"Amount in whole units (required for fixed and from prices), never invented."},"currency":{"type":"string","description":"USD, EUR, GBP or UAH."},"audience_language":{"type":"string","description":"Audience language code, e.g. en."},"audience_country":{"type":"string","description":"Audience country or region key, e.g. us or global."},"topics":{"type":"array","items":{"type":"string"},"description":"Up to 5 topic keys."},"site_url":{"type":"string","description":"The address of the site or channel, https."},"details":{"type":"object","description":"Optional package, duration, placement, materials, restrictions (short texts)."},"timing_note":{"type":"string","description":"Your own estimate of timing, up to 160 characters."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"market.update_listing","risk":"reversible","status":"pending","needs":"apply","summary":"Update the listing \u201cSponsored article on Lumen blog\u201d (price)","diff":[{"op":"~","kind":"Price","name":"","details":[],"before":"220","after":"240"}],"requested_by":"Token \u201cClaude Code\u201d","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":{"outcome":"proposed","module":"market","mode":"manual","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/market\/listings\/{listing}\/pause":{"post":{"operationId":"pause_market_listing","summary":"Pause one of your published listings: it disappears from Market until you resume it in the editor. Only hides; nothing is deleted. What happens depends on the mode the owner set for this module in Settings \u2192 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.","tags":["write:market"],"security":[{"bearerAuth":["write:market"]}],"parameters":[{"name":"listing","in":"path","required":true,"description":"Slug of one of your listings (see list_market_listings).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":41,"action":"market.pause_listing","risk":"reversible","status":"done","needs":null,"summary":"Pause the listing \u201cSponsored article on Lumen blog\u201d","diff":[],"requested_by":"Token \u201cClaude Code\u201d","note":null,"error":null,"result":{"summary":"Listing paused.","listing":"sponsored-article-on-lumen-blog"},"confirm_url":null,"created_at":"2026-10-19T09:00:00+00:00","decided_at":null},"meta":{"outcome":"done","module":"market","mode":"hybrid","hint":null}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/agent\/changes":{"get":{"operationId":"agent_changes","summary":"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).","tags":["account"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"module","in":"query","required":true,"description":"The module.","schema":{"type":"string","enum":["media","seo","autopilot","market"]}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":41,"action":"media.update_draft","risk":"reversible","status":"pending","needs":"apply","summary":"Update the draft \u201cNotes on a quiet launch\u201d (title)","diff":[],"requested_by":"Token \u201cClaude Code\u201d","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"}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/agent\/changes\/{id}":{"get":{"operationId":"agent_change_status","summary":"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.","tags":["account"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The id a change request returned.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"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 \u201cClaude Code\u201d","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}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/site-posts":{"get":{"operationId":"list_site_posts","summary":"The posts you approved for your sites connected through the Woodander API, newest first, with title, slug, meta description, HTML and Markdown. Poll it from your site (for example every hour, with since set to the last run) and publish what is new. Only for a site you connected as \"Woodander API (your site pulls the articles)\" in Media \u2192 Articles for your site: an approved post waits here and nothing is sent to your site.","tags":["read:content"],"security":[{"bearerAuth":["read:content"]}],"parameters":[{"name":"site","in":"query","required":false,"description":"Only posts of this connected site (its host, e.g. yourblog.com).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Only posts created or changed since this ISO 8601 date (updated_at), e.g. 2026-10-01T00:00:00Z.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 100.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":[{"id":14,"site":"yourblog.com","title":"How to choose a standing desk","slug":"how-to-choose-a-standing-desk","meta_description":"Height range, stability and price: what matters.","keyword":"standing desk","html":"<h2>Start with your height<\/h2><p>\u2026<\/p>","markdown":"## Start with your height\n\n\u2026","status":"published","published_at":"2026-10-24T09:00:00+00:00","updated_at":"2026-10-24T09:00:00+00:00","remote_id":null,"remote_url":null}],"meta":{"next_cursor":null,"limit":25,"total":1,"site":null,"since":null}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/site-posts\/{id}":{"get":{"operationId":"get_site_post","summary":"One approved post of a site connected through the Woodander API, with its HTML and Markdown.","tags":["read:content"],"security":[{"bearerAuth":["read:content"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Id of an approved post (see list_site_posts).","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":14,"site":"yourblog.com","title":"How to choose a standing desk","slug":"how-to-choose-a-standing-desk","meta_description":"Height range, stability and price: what matters.","keyword":"standing desk","html":"<h2>Start with your height<\/h2><p>\u2026<\/p>","markdown":"## Start with your height\n\n\u2026","status":"published","published_at":"2026-10-24T09:00:00+00:00","updated_at":"2026-10-24T09:00:00+00:00","remote_id":null,"remote_url":null}}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}},"\/site-posts\/{id}\/live":{"post":{"operationId":"mark_site_post_live","summary":"Tell Woodander where your site published a post: its address (shown as \"View on your site\" in the Workspace) and the id your site gave it. Send at least one. Returns the post.","tags":["write:content"],"security":[{"bearerAuth":["write:content"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Id of an approved post (see list_site_posts).","schema":{"type":"integer"}}],"requestBody":{"required":false,"content":{"application\/json":{"schema":{"type":"object","required":[],"properties":{"url":{"type":"string","description":"The public address of the published post (http or https)."},"remote_id":{"type":"string","description":"The id your site gave the post, up to 255 characters."}}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"data":[],"meta":{"type":"object"}}},"example":{"data":{"id":14,"site":"yourblog.com","title":"How to choose a standing desk","slug":"how-to-choose-a-standing-desk","meta_description":"Height range, stability and price: what matters.","keyword":"standing desk","html":"<h2>Start with your height<\/h2><p>\u2026<\/p>","markdown":"## Start with your height\n\n\u2026","status":"published","published_at":"2026-10-24T09:00:00+00:00","updated_at":"2026-10-24T09:00:00+00:00","remote_id":"812","remote_url":"https:\/\/yourblog.com\/how-to-choose-a-standing-desk"}}}}},"201":{"description":"Accepted: proposed, waiting for the owner's confirmation, or queued. See data.status and meta.outcome."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/RateLimited"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal access token, e.g. wdr_..."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}}}}}},"responses":{"Unauthenticated":{"description":"Missing, invalid, expired or revoked token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"Forbidden":{"description":"The token lacks the scope (insufficient_scope) or the plan has no API access (plan_required).","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"NotFound":{"description":"Not found, or not yours.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"RateLimited":{"description":"Too many requests. See the Retry-After header.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}}}}}}