Automate Pincushion. Pins from anywhere.

A pin doesn't have to start in a browser. Turn a support email, a form submission, a failing synthetic check, or a Slack message into a Pincushion pin — an agent-ready work packet your coding agent burns down via MCP. Use the ready-made n8n node or Zapier connector, or POST the raw REST shape below.

Get the n8n node Read the REST contract

The one endpoint you need

Every integration below wraps a single endpoint — the same one the Pincushion extension and MCP server use:

https://dpsqzszdviltqvethxbr.supabase.co/functions/v1/sync-annotations

Authenticate with your license key (Pincushion settings → license key, or your MCP config) in the x-license-key header. Free accounts work — pins created this way are counted as manual pins and are never metered.

n8n

Install the community node from Settings → Community Nodes: n8n-nodes-pincushion. It adds a Pincushion action node (Create Pin / List Pins / Resolve Pin) and a Pincushion Trigger that fires when a new pin appears. Add a Pincushion API credential with your license key and you're wiring pins into any of n8n's 400+ integrations.

Zapier

Pincushion exposes the same three actions and a new-pin trigger to Zapier. Because Zapier publishing runs through their developer review, the integration definition (auth test, actions, trigger, and sample payloads) is documented in the Zapier kit — a Custom Integration you can point at the endpoints below today, or use once the public listing is approved. It's the same REST contract, so a Webhooks-by-Zapier step works immediately with no waiting.

The REST contract

Three moves. All requests carry x-license-key: <your-key>.

Create a pin

POST /sync-annotations with an array of one annotation. Required: a unique id and a pageUrl (which should fall under a URL registered on the project). The note goes in the first thread message.

curl -X POST \
  https://dpsqzszdviltqvethxbr.supabase.co/functions/v1/sync-annotations \
  -H "x-license-key: $PINCUSHION_KEY" \
  -H "Content-Type: application/json" \
  -d '[{
    "id": "ann_'"$(uuidgen)"'",
    "projectId": "proj_abc123",
    "pageUrl": "https://app.example.com/checkout",
    "status": "open",
    "element": { "selector": ".btn-submit", "source": "zapier" },
    "author": "Support inbox",
    "tags": ["email", "billing"],
    "thread": [{
      "author": "Support inbox",
      "timestamp": "2026-07-04T00:00:00Z",
      "body": "Customer reports the pay button does nothing on Safari."
    }]
  }]'

Pins created through automations count as manual pins — never metered. Agent-authored pins (which draw from the AI-action pool) are filed through the MCP create_agent_pin tool instead.

List pins

GET /sync-annotations returns every pin your account can see. Narrow with query params:

ParamMeaning
project_idOnly pins on this project
pageUrlOnly pins on this exact page URL
sinceISO timestamp — only pins updated at or after this time (poll cursor)
curl "https://dpsqzszdviltqvethxbr.supabase.co/functions/v1/sync-annotations?project_id=proj_abc123&since=2026-07-01T00:00:00Z" \
  -H "x-license-key: $PINCUSHION_KEY"

The response is { "annotations": [...], "projects": [...], "ts": "<server time>", ... }. Store ts and pass it as the next since to poll for new pins without re-reading the backlog.

Resolve a pin

Resolving is a partial upsert of the same endpoint — send the pin's id, its pageUrl, and the new status. Unspecified fields are left untouched.

curl -X POST \
  https://dpsqzszdviltqvethxbr.supabase.co/functions/v1/sync-annotations \
  -H "x-license-key: $PINCUSHION_KEY" \
  -H "Content-Type: application/json" \
  -d '[{ "id": "ann_...", "pageUrl": "https://app.example.com/checkout", "status": "resolved" }]'

Where automations fit

Building an agent handoff instead of a workflow trigger? See the browser-agent → coding-agent guide. New to Pincushion? Start with what a visual feedback MCP server does.

Get started — free Back to home