Zum Inhalt springen
Woodander Doku
DE

Discover

Your Discover products: page text, leads, reviews, analytics, and changes proposed under the AI mode you choose.

15 endpoints. Each one is a REST endpoint under https://woodander.com/api/v1 and an MCP tool with the same name and arguments. See the overview for authentication, rate limits and errors.

list_products

GET /api/v1/products

Your Discover projects.

MCP tool list_products Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
limit query integer No Page size, 1 to 100.
cursor query string No meta.next_cursor of the previous page.

Example request

bash
curl "https://woodander.com/api/v1/products" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "list_products",
        "arguments": {}
    }
}

Example response Example

json
{
    "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

get_product

GET /api/v1/products/{slug}

One of your projects with its full description.

MCP tool get_product Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see list_products).

Example request

bash
curl "https://woodander.com/api/v1/products/lumen-notes" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "get_product",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "data": {
        "slug": "lumen-notes",
        "name": "Lumen Notes",
        "description": "Long text",
        "pricing_model": "freemium",
        "platforms": [
            "web"
        ],
        "status": "published"
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
429rate_limitedToo many requests. See the Retry-After header.

product_analytics

GET /api/v1/products/{slug}/analytics

Views, outbound clicks, visitors, leads, daily series, referrers and campaigns. Ranges over 30 days need the advanced analytics plan feature.

MCP tool product_analytics Scope read:analytics Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see list_products).
range query string No Period. Default 30d. One of: 7d, 30d, 90d, 365d.

Example request

bash
curl "https://woodander.com/api/v1/products/lumen-notes/analytics" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "product_analytics",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:analytics scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

discover_list_products

GET /api/v1/discover/products

Your Discover projects with the AI mode you set for each (manual, hybrid, autonomous) and how many changes wait for you.

MCP tool discover_list_products Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
limit query integer No Page size, 1 to 100.
cursor query string No meta.next_cursor of the previous page.

Example request

bash
curl "https://woodander.com/api/v1/discover/products" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_list_products",
        "arguments": {}
    }
}

Example response Example

json
{
    "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

discover_product_page

GET /api/v1/discover/products/{slug}

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.

MCP tool discover_product_page Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).

Example request

bash
curl "https://woodander.com/api/v1/discover/products/lumen-notes" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_product_page",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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; ..."
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
429rate_limitedToo many requests. See the Retry-After header.

discover_leads

GET /api/v1/discover/products/{slug}/leads

Leads from the lead form of one of your projects, newest first, with their status.

MCP tool discover_leads Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
status query string No Only leads with this status. One of: new, contacted, archived.
limit query integer No Page size, 1 to 100.
cursor query string No meta.next_cursor of the previous page.

Example request

bash
curl "https://woodander.com/api/v1/discover/products/lumen-notes/leads" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_leads",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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"
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

discover_reviews

GET /api/v1/discover/products/{slug}/reviews

Published reviews of one of your projects with your replies, newest first.

MCP tool discover_reviews Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
limit query integer No Page size, 1 to 100.
cursor query string No meta.next_cursor of the previous page.

Example request

bash
curl "https://woodander.com/api/v1/discover/products/lumen-notes/reviews" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_reviews",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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"
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

discover_analytics

GET /api/v1/discover/products/{slug}/analytics

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.

MCP tool discover_analytics Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
range query string No Period. Default 30d. One of: 7d, 30d, 90d, 365d.

Example request

bash
curl "https://woodander.com/api/v1/discover/products/lumen-notes/analytics" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_analytics",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422invalid_requestA parameter is not valid (range, type, cursor).
429rate_limitedToo many requests. See the Retry-After header.

discover_list_changes

GET /api/v1/discover/products/{slug}/changes

The last 50 change requests for one of your products: proposals and confirmations waiting for you, and what ran.

MCP tool discover_list_changes Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).

Example request

bash
curl "https://woodander.com/api/v1/discover/products/lumen-notes/changes" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_list_changes",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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 “Claude Code”",
            "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"
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
429rate_limitedToo many requests. See the Retry-After header.

discover_change_status

GET /api/v1/discover/changes/{id}

One change request by id: its status (pending, done, failed, rejected), what it waits for and the result.

MCP tool discover_change_status Scope read:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
id path integer Yes The id a change request returned.

Example request

bash
curl "https://woodander.com/api/v1/discover/changes/12" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_change_status",
        "arguments": {
            "id": 12
        }
    }
}

Example response Example

json
{
    "data": {
        "id": 31,
        "action": "discover.post_brief",
        "risk": "publish",
        "status": "done",
        "needs": null,
        "summary": "Publish the Brief “Lumen 2.0 is out” in the Newsroom of Lumen Notes",
        "diff": [],
        "requested_by": "Token “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the read:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
429rate_limitedToo many requests. See the Retry-After header.

discover_update_page

PATCH /api/v1/discover/products/{slug}/page

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.

MCP tool discover_update_page Scope write:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
locale body string No 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 body string No Tagline, up to 80 characters.
description body string No What it does, 80 to 600 characters.
highlights body array<string> No Up to 6 short highlights.
faq body array<object> No Up to 10 entries {"question", "answer"}, both required.
links body array<object> No Up to 6 extra links {"label", "url"}.
submit body boolean No Also send the draft to Woodander editors (needs a complete draft and a confirmed email).

Example request

bash
curl -X PATCH "https://woodander.com/api/v1/discover/products/lumen-notes/page" \
  -H "Authorization: Bearer wdr_..."
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_update_page",
        "arguments": {
            "slug": "lumen-notes"
        }
    }
}

Example response Example

json
{
    "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 “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the write:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422validation_failedThe body is not valid; details.errors names the fields.
429rate_limitedToo many requests. See the Retry-After header.

discover_add_screenshot_from_url

POST /api/v1/discover/products/{slug}/screenshots

Add a screenshot to the draft of one of your projects from a public https image address (PNG, JPG or WebP, at least 1200 × 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.

MCP tool discover_add_screenshot_from_url Scope write:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
url body string Yes https address of the image (no redirects, public hosts only).
alt body string No Alt text, up to 150 characters.

Example request

bash
curl -X POST "https://woodander.com/api/v1/discover/products/lumen-notes/screenshots" \
  -H "Authorization: Bearer wdr_..." \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/"}'
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_add_screenshot_from_url",
        "arguments": {
            "slug": "lumen-notes",
            "url": "https://example.com/"
        }
    }
}

Example response Example

json
{
    "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 “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the write:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422validation_failedThe body is not valid; details.errors names the fields.
429rate_limitedToo many requests. See the Retry-After header.

discover_post_brief

POST /api/v1/discover/products/{slug}/briefs

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.

MCP tool discover_post_brief Scope write:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
title body string Yes Up to 120 characters.
body body string Yes 40 to 1200 characters, up to 3 paragraphs, no markup.
source_url body string No A link to the source (http or https).

Example request

bash
curl -X POST "https://woodander.com/api/v1/discover/products/lumen-notes/briefs" \
  -H "Authorization: Bearer wdr_..." \
  -H "Content-Type: application/json" \
  -d '{"title":"example","body":"example"}'
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_post_brief",
        "arguments": {
            "slug": "lumen-notes",
            "title": "example",
            "body": "example"
        }
    }
}

Example response Example

json
{
    "data": {
        "id": 31,
        "action": "discover.post_brief",
        "risk": "publish",
        "status": "pending",
        "needs": "confirm",
        "summary": "Publish the Brief “Lumen 2.0 is out” 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 “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the write:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422validation_failedThe body is not valid; details.errors names the fields.
429rate_limitedToo many requests. See the Retry-After header.

discover_reply_review

POST /api/v1/discover/products/{slug}/reviews/{review_id}/reply

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).

MCP tool discover_reply_review Scope write:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
review_id path integer Yes Review id (see discover_reviews).
reply body string Yes Up to 1000 characters.

Example request

bash
curl -X POST "https://woodander.com/api/v1/discover/products/lumen-notes/reviews/12/reply" \
  -H "Authorization: Bearer wdr_..." \
  -H "Content-Type: application/json" \
  -d '{"reply":"example"}'
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_reply_review",
        "arguments": {
            "slug": "lumen-notes",
            "review_id": 12,
            "reply": "example"
        }
    }
}

Example response Example

json
{
    "data": {
        "id": 31,
        "action": "discover.reply_review",
        "risk": "publish",
        "status": "pending",
        "needs": "confirm",
        "summary": "Reply to the review by Grace (5★) of Lumen Notes",
        "diff": [
            {
                "op": "+",
                "kind": "Reply",
                "name": "",
                "details": [
                    "Review: Lovely tool ..."
                ],
                "before": null,
                "after": "Thank you, Grace!"
            }
        ],
        "requested_by": "Token “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the write:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422validation_failedThe body is not valid; details.errors names the fields.
429rate_limitedToo many requests. See the Retry-After header.

discover_update_lead_status

PATCH /api/v1/discover/products/{slug}/leads/{lead_id}

Mark a lead of one of your projects new, contacted or archived.

MCP tool discover_update_lead_status Scope write:products Plan Pro and above, or the Project Pro pass

Parameters

NameInTypeRequiredDescription
slug path string Yes Slug of one of your projects (see discover_list_products).
lead_id path integer Yes Lead id (see discover_leads).
status body string Yes The new status. One of: new, contacted, archived.

Example request

bash
curl -X PATCH "https://woodander.com/api/v1/discover/products/lumen-notes/leads/12" \
  -H "Authorization: Bearer wdr_..." \
  -H "Content-Type: application/json" \
  -d '{"status":"new"}'
tools/call
{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "discover_update_lead_status",
        "arguments": {
            "slug": "lumen-notes",
            "lead_id": 12,
            "status": "new"
        }
    }
}

Example response Example

json
{
    "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 “Claude Code”",
        "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
    }
}

Errors

HTTPCodeMeaning
401unauthenticatedMissing, invalid, expired or revoked token.
403insufficient_scopeThe token does not have the write:products scope.
403plan_requiredThe plan does not include API access.
404not_foundNot found, or not yours.
422validation_failedThe body is not valid; details.errors names the fields.
429rate_limitedToo many requests. See the Retry-After header.