POST/api/v1/links
Create a short link: a redirect (kind url) or a contact card (kind contact). Anonymous links need Turnstile, expire in 7 days unless claimed, and return a one-time claimToken.
Access: API key (anonymous allowed)
Request body (JSON)
| Field | Type | Notes |
|---|
kind | "url" | "contact" | url (default): the code redirects to url. contact: a scan is answered with a vCard built from payload — no page in between, so the person scanning needs a connection and gets the card through their browser. |
url | string (uri) | Required for kind url. Up to 2048 characters. |
payload | object | Required for kind contact. |
payload.firstName | string | Up to 60 characters. |
payload.lastName | string | Up to 60 characters. |
payload.organization | string | Up to 100 characters. |
payload.title | string | Up to 100 characters. |
payload.street | string | Up to 120 characters. |
payload.city | string | Up to 60 characters. |
payload.state | string | Up to 60 characters. |
payload.zipcode | string | Up to 20 characters. |
payload.country | string | Up to 60 characters. |
payload.note | string | Up to 280 characters. |
payload.phoneMobile | string | Up to 32 characters. |
payload.phoneWork | string | Up to 32 characters. |
payload.phoneHome | string | Up to 32 characters. |
payload.email | string (email) | Up to 254 characters. |
payload.website | string (uri) | Up to 2048 characters. |
turnstileToken | string | Required only when creating anonymously (no key, no session). |
Responses
201 The link: code, kind, shortUrl, qrText (encode this, uppercase), expiresAt, claimToken (anonymous only).401 The API key is invalid or revoked.403 Turnstile failed (anonymous only), or { error: "plan_limit", limit: "active_codes", max, used, plan, message }: the account is at its plan's active tracked codes. Pause or delete a code to make room. Or: The key's owner hasn't agreed to the current terms (terms_required). They agree by signing in to the dashboard.422 { error: "destination_refused", reasons }: the destination, or a contact's website, is unsafe, self-referencing or blocklisted. { error: "content_refused", field, reason }: a contact field broke a content rule.429 Creation quota exceeded. Or: API key rate limit: 60/minute or 10,000/day per key. See Retry-After. Or { error: "plan_limit", limit: "api_daily", max, used, plan, resetsAt, message }: the account's daily API calls on its plan (all keys together) are used up until 00:00 UTC.503 { error: "contact_links_disabled" }: switched off by the operator.
PATCH/api/v1/links/{code}
Change the destination (kind url) or the contact (kind contact: send the whole payload, it replaces the old one) and/or pause or resume. New content passes the same checks as creation; a new destination on a link with >100 recent scans shows an interstitial for an hour. A link's kind cannot be changed.
Access: API key
Parameters
Request body (JSON)
| Field | Type | Notes |
|---|
url | string (uri) | |
payload | object | |
payload.firstName | string | Up to 60 characters. |
payload.lastName | string | Up to 60 characters. |
payload.organization | string | Up to 100 characters. |
payload.title | string | Up to 100 characters. |
payload.street | string | Up to 120 characters. |
payload.city | string | Up to 60 characters. |
payload.state | string | Up to 60 characters. |
payload.zipcode | string | Up to 20 characters. |
payload.country | string | Up to 60 characters. |
payload.note | string | Up to 280 characters. |
payload.phoneMobile | string | Up to 32 characters. |
payload.phoneWork | string | Up to 32 characters. |
payload.phoneHome | string | Up to 32 characters. |
payload.email | string (email) | Up to 254 characters. |
payload.website | string (uri) | Up to 2048 characters. |
status | "active" | "paused" | |
Responses
200 The updated link.400 { error: "wrong_kind", kind }: url sent to a contact link, or payload to a url link.401 Not signed in, or the API key is invalid or revoked.403 Resuming a paused link: { error: "plan_limit", limit: "active_codes", max, used, plan, message }: the account is at its plan's active tracked codes. Pause or delete a code to make room. Or: The key's owner hasn't agreed to the current terms (terms_required). They agree by signing in to the dashboard.404 No such link of yours.422 Destination or content refused, as on create.429 Edit quota exceeded (20 per link per day). Or: API key rate limit: 60/minute or 10,000/day per key. See Retry-After. Or { error: "plan_limit", limit: "api_daily", max, used, plan, resetsAt, message }: the account's daily API calls on its plan (all keys together) are used up until 00:00 UTC.503 { error: "contact_links_disabled" }: switched off by the operator.
DELETE/api/v1/links/{code}
Delete a link: it answers 410 from then on, its statistics are deleted, and the destination history is kept without any link to you.
Access: API key
Parameters
Responses
204 Deleted.401 Not signed in, or the API key is invalid or revoked.403 The key's owner hasn't agreed to the current terms (terms_required). They agree by signing in to the dashboard.404 No such link of yours.429 API key rate limit: 60/minute or 10,000/day per key. See Retry-After. Or { error: "plan_limit", limit: "api_daily", max, used, plan, resetsAt, message }: the account's daily API calls on its plan (all keys together) are used up until 00:00 UTC.