TapCue how-to
Share a link from Android to a webhook
Tap Share on your phone and a JSON request lands on your server, your Cloudflare Worker, Zapier, n8n or a Slack channel, a few seconds later. This page shows the exact request, a working receiver, and what happens on retries.
Set it up
- In TapCue (the app, or tapcue.app), open Destinations and add Webhook. Paste your HTTPS address. Pick a Format (JSON for almost everything). Add an Authorization header if your endpoint wants a key: it is sent exactly as you type it, such as
Bearer abc123. - Choose which reason goes there. Open Categories, pick a reason such as For AI, and make the webhook its destination. Or keep the reason going to your notes and add the webhook under Also send toPro.
- Share a link from any app, tap TapCue, and watch it arrive. webhook.site is a quick way to see the first request before you write any code.
What arrives
With the Body field left empty, TapCue sends its standard JSON: the one-line headline it wrote, the link and page title, your note, the reason and the time. This is a real save of a video:
POST /hooks/tapcue HTTP/1.1
content-type: application/json
x-tapcue-delivery: dlv_6f0c…
idempotency-key: dlv_6f0c…
user-agent: TapCue
{
"type": "tapcue.save",
"category": "Watch later",
"markdown": "- [How to sharpen a kitchen knife](https://videos.example/w/knife-sharpening) to watch later",
"card": {
"headline": "Kitchen knife sharpening video to watch later",
"what": "Kitchen knife sharpening video",
"kind": "video",
"intent": "watch",
"url": "https://videos.example/w/knife-sharpening",
"source": "videos.example",
"title": "How to sharpen a kitchen knife",
"author": "Edge & Grain",
"note": "the 12-minute one with the \"whetstone\" tip",
"tag": "#watch",
"savedAt": 1793207040000
}
}
x-tapcue-delivery is the id of this delivery. If TapCue has to retry, the same id comes again, so your endpoint can ignore a repeat. kind is a word for what the link is (video, recipe, product and so on) and intent is the reason's key.
Or write the body yourself
Put anything in the Body field and TapCue fills the placeholders, escaping each value so the result stays valid in the format you picked. JSON is parsed before it is sent; a broken body is refused in the editor and never reaches you.
Body in TapCue
{
"title": "{title}",
"url": "{url}",
"why": "{category}",
"note": "{note}",
"saved": "{date}"
}What your endpoint gets
{
"title": "How to sharpen a kitchen knife",
"url": "https://videos.example/w/knife-sharpening",
"why": "Watch later",
"note": "the 12-minute one with the \"whetstone\" tip",
"saved": "2026-10-28T17:04:00.000Z"
}Every placeholder below works here. Pick XML, YAML, CSV, HTML, Markdown or plain text as the format and the same placeholders are escaped for that format instead.
| Placeholder | Meaning | Sample save |
|---|---|---|
{headline} | the one-line summary TapCue writes | Kitchen knife sharpening video to watch later |
{title} | the page's own title | How to sharpen a kitchen knife |
{what} | what the link is, in a few words | Kitchen knife sharpening video |
{url} | the link | https://videos.example/w/knife-sharpening |
{source} | the site it came from | videos.example |
{author} | the author or channel, when the page names one | Edge & Grain |
{note} | the note you typed when saving | the 12-minute one with the "whetstone" tip |
{text} | text you shared or selected, if any | empty |
{category} | the reason's name | Watch later |
{tag} | the reason's tag | #watch |
{tagname} | the tag without the # | watch |
{date} | when you saved it, ISO 8601 in UTC | 2026-10-28T17:04:00.000Z |
{day} | the date in your time zone | 2026-10-28 |
{time} | the time in your time zone, with - instead of :, so it can go in a file name | 17-04 |
{markdown} | the standard one-line Markdown entry | - [How to sharpen a kitchen knife](https://videos.example/w/knife-sharpening) to watch later |
A receiver in 15 lines
A Cloudflare Worker that checks the key, drops repeats and keeps the save. Swap the last line for whatever you want to happen: a row in a database, a message somewhere, a file in a bucket.
export default {
async fetch(req, env) {
if (req.method !== "POST") return new Response("TapCue webhook", { status: 405 });
if (req.headers.get("authorization") !== "Bearer " + env.TAPCUE_SECRET) return new Response("no", { status: 401 });
const save = await req.json(); // the body above
const id = req.headers.get("x-tapcue-delivery");
if (await env.SEEN.get(id)) return new Response("already have it"); // a retry of the same save
await env.SEEN.put(id, "1", { expirationTtl: 86400 });
await env.SAVES.put(id, JSON.stringify(save)); // or forward it, file it, post it anywhere
return new Response("ok");
},
};
Questions
- Does TapCue retry a webhook that fails?
- Yes. A response other than 2xx is retried a few times, with the same x-tapcue-delivery and idempotency-key values, so if your endpoint already handled that id it can answer 200 and ignore the repeat. A save that keeps failing shows as not delivered in TapCue, with the status your endpoint returned, and you can retry it by hand.
- Can the webhook body be XML, YAML, CSV or plain text instead of JSON?
- Yes. Pick the format in the destination's settings; it sets the Content-Type and how values are escaped inside your body. JSON is checked before it is sent, so a broken body never leaves TapCue.
- Can I send one save to a webhook and to my notes?
- Yes, with Pro: give a reason an Also send to destination, and every save for that reason goes to both. A webhook can also be the main destination for one reason only, such as For AI.
- Is a webhook different from the TapCue API?
- A webhook is push: TapCue calls your address the moment a save is made. The API and MCP are pull: your script or assistant reads your saves when it wants. Use a webhook to react at once, the API to work through what you saved.
- Does it work with Slack, Discord, Zapier, Make or n8n?
- Yes. Slack and Discord webhook links get a formatted message instead of JSON. Zapier, Make and n8n each give you a webhook URL that receives the standard JSON body above, or a body you design.
Save links as JSON, XML or YAML files instead · The TapCue API · How to use TapCue
Webhooks are part of Pro. Pricing