Every Link Tool Has an API. This One Tells Your Automation Whether the App Opened.
Zippy's public API is live: a zip_ key, 26 endpoints, and one field nobody else can return — appOpenRate, the share of taps that reached the real app. Build an automation that branches on reality instead of on click counts. Legend plan.


⚡ Zippy: every link API can tell you a link got tapped. that's the easy half. the half that decides whether your campaign worked is what happened next — and until now no API would tell you.
Zippy's public API is live. A key, a base URL, and the whole product: create and edit links, read your numbers, manage your bio page, sync your audience, subscribe to events.
That part is table stakes. Here's the part that isn't.
Every other link API returns half the story
Ask any link shortener's API how a link performed and you get a number: clicks. Taps. Redirects. Pick your noun — it's the same event, counted the same way, and it means one thing:
a request hit the server.
It does not tell you whether the person landed where you sent them. On mobile — where your audience actually is — a tap on an Instagram link routinely dead-ends in the in-app browser: a stripped-down webview where the user isn't logged in, the app never opens, and the purchase you paid for doesn't happen. The click still counted. It counted exactly the same as one that worked.
So the API gives your automation a number it can't act on. "47 clicks" doesn't tell you to do anything.
What Zippy's API returns instead
curl https://api.zipthe.link/v1/links/{id}/stats \
-H "authorization: Bearer zip_…"
{
"total": 1840,
"appOpenRate": 0.87,
"outcomes": { "opened": 1601, "browser": 205, "broken": 34 }
}
Three outcomes, not one count:
opened— the real app came to the foreground. It worked.browser— the tap died in a webview. It didn't.broken— the hand-off to the app failed outright.
That's a field an automation can branch on. Not "how many," but "did it work."
Which makes automations possible that weren't before
Wire it into n8n, Make, Zapier, a cron job, five lines of Python — the shape is the same, and none of these were expressible on a click count:
- A canary on your funnel. Every morning, read
/statsfor your money link. IfappOpenRatefell below 0.7, post to Slack with the number. You find out a platform broke your deep link the day it happens, not at the end of the month. - A/B tests decided on reality.
/ab-statsreturns clicks and app-open rate per variant. Variant B can win on taps and lose on opens — that's the case where every other tool ships you the wrong winner. - Per-platform routing you actually verify.
/analyticssplits outcomes by platform. "Instagram: 89% real-app opens, TikTok: 41%" is the sentence that tells you where to spend the next hour. - Bulk link ops that don't lie to you. Generate 100 campaign links from a spreadsheet
with
POST /v1/links/bulk, then read back which of them are actually opening apps.
Getting started takes one minute
Mint a key in Settings → API keys (it's shown once — only a hash is stored), then:
curl https://api.zipthe.link/v1/me -H "authorization: Bearer zip_…"
200 means you're in. That endpoint doubles as the "test connection" step in any automation
tool. Then create something:
curl -X POST https://api.zipthe.link/v1/links \
-H "authorization: Bearer zip_…" \
-H "content-type: application/json" \
-d '{ "url": "https://www.instagram.com/reel/abc123", "slug": "summer-drop" }'
Every power on the link editor is in that body — geo and device routing, A/B variants,
scheduled destination swaps, UTMs, passwords, tags, folders, retargeting pixels. The full
reference is in the API docs, and the machine-readable
contract is the OpenAPI document at
api.zipthe.link/openapi.json — point a client
generator at it and you have a typed SDK in whatever language you're in.
The honest part
The outcome numbers are sampled. They come from an analytics pipeline that estimates from a representative slice rather than counting every single event, which is what makes them fast and free to query at any scale.
That means: round to whole numbers, don't reconcile them against a payment ledger, and treat a
gap of a few points as noise rather than signal. It also means appOpenRate comes back as
null — never a tidy 0 — when nothing has been measured yet. Your automation should read
null as "no data", not as "nobody opened it." We'd rather hand you a null you have to
handle than a zero that quietly lies.
We wrote the sampling rules into the API docs rather than burying them in a footnote, because an automation built on a misread number does damage on a schedule.
Don't poll. Let us push.
If your first instinct is a cron job hitting /v1/analytics every five minutes: don't.
Webhooks deliver link and app-open events to your
URL the moment they happen — including app.opened, app.browser and app.broken as they
occur. An idle automation should make zero requests. Use the API to do things; use
webhooks to hear about things.
The API is rate limited to 120 requests a minute per key, with standard X-RateLimit-*
headers and a Retry-After on a 429, which is generous for everything except polling.
Your links outlive your integration
There is no endpoint in this API that stops a published link from redirecting. None. Archive frees a slot against your plan's link cap and hides the link from your list — the link keeps resolving. Downgrade and your links go read-only, never dead.
Whatever you build on this, the links it creates keep working. That's not a feature we added to the API; it's a rule the whole product is built on, and the API couldn't break it if it tried.
FAQ
How do I get a Zippy API key?
Open Settings → API keys in the dashboard and create one. The key is shown exactly once —
Zippy stores only a hash of it, so it can't be retrieved later. Lost it? Revoke and mint a new
one. Keys start with zip_ and go in an Authorization: Bearer header.
Can an API tell me if someone opened my app from a link?
Zippy's can. GET /v1/links/{id}/stats returns appOpenRate plus a breakdown of opened,
browser and broken outcomes for every tap on that link. Click-count APIs from other link
tools cannot distinguish a tap that opened the app from one that died in an in-app browser —
they're the same event to them.
How do I connect Zippy to n8n, Make, or Zapier?
Use an HTTP Request node pointed at https://api.zipthe.link/v1 with your zip_ key as a
bearer token, and GET /v1/me as the connection test. For receiving events, register a
webhook with your tool's catch-hook URL instead of
polling the API on a timer.
Are the API's analytics numbers exact?
No — outcome and click numbers are sampled estimates. They're built for steering decisions,
not for reconciliation. Report whole numbers, and treat appOpenRate: null as "nothing
measured yet" rather than as zero.
Which Zippy plan includes the API?
Legend. Keys are minted per workspace, and the entitlement is re-checked on every single request — so a key stops working the moment a plan no longer includes the API, and starts working again the moment it does. Links created through it keep redirecting either way.
Related
- API docs — every endpoint, error code and rate-limit header, plus the OpenAPI document to generate a client from.
- MCP server — the same surface as tools, so you can ask an AI assistant for a link instead of writing the request. Same key, same rules.
- Webhooks — the push half. Never poll this API on a timer.
- A/B testing —
/ab-statsis the endpoint that splits app-open rate per variant. - The app-open receipt and your media kit — the same numbers, rendered for humans.
- Your link tool should be something you can just ask
Read the API docs, or see everything else that shipped in the changelog. Mint a key →