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.
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:
| Param | Meaning |
|---|---|
project_id | Only pins on this project |
pageUrl | Only pins on this exact page URL |
since | ISO 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
- Inbound support → pin. A tagged Zendesk/Help Scout ticket becomes a pin on the page it's about, so your agent fixes the UI, not just the ticket. (Or skip the tooling entirely with email-to-pin.)
- Synthetic monitoring → pin. A failing Checkly/Playwright assertion files a pin with the failing URL and selector.
- Form / feedback widget → pin. A Typeform or Tally submission with a URL field lands as a triageable pin.
- Resolve on deploy. A CI step marks the pins referenced in a merged PR resolved.
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.