Create a link
apiKeyAuthorizationBearer <token>- body
url*stringWhere the link sends people
urislug?stringThe part after the domain (letters, digits, - and _; case-sensitive). Random 5 characters when left out
title?stringlength <= 200description?stringlength <= 500ogImageUrl?|Image for social previews
folderId?|A folder id from GET /v1/folders; null = no folder
tagIds?array<string>Tag ids from GET /v1/tags; replaces the link’s tags
redirectType?|||HTTP redirect status; 302 by default
302passQuery?booleanForward the short link’s query string to the destination
falseopenInApp?booleanOn phones, open the destination in its app (Basic and up)
falseopenInBrowser?booleanAndroid in-app browsers hand the destination to the default browser (Basic and up)
falseutm?UTM parameters to set in the destination url; an empty value removes one. They live in the url itself, so a url with utm_* in it works just as well
geoRules?array<>A different destination per country (Basic and up)
[]deviceRules?array<>A different destination per device (Basic and up)
[]expiresAt?|ISO date-time after which the link stops redirecting (Basic and up)
expiredUrl?|Where an expired link sends people
abTest?|A/B test on the destination; variants[0] is the link’s own url (Pro)
password?|Visitors must enter it first (Basic and up). Only a hash is stored; null removes it
qrTemplateId?|The QR brand template its QR code wears, an id from GET /v1/qr-templates; null = none, the plain code. Left out when creating: the domain’s template, else the one whose sites include the destination, else the workspace default
qrStyle?|QR style settings this link changes on top of its template (dot and corner shapes, colours, logo, margin, outline); null = none. Refused when the result would not scan
domain?stringHost of one of your domains; the workspace subdomain when left out
Response for status 201
application/json- response
id*stringdomain*stringslug*stringshortLink*stringurl*stringtitle*string|nulldescription*string|nullogImageUrl*string|nullfolderId*string|nulltags*array<>redirectType*numberpassQuery*booleanopenInApp*booleanopenInBrowser*booleanutm*|nullgeoRules*array<>deviceRules*array<>expiresAt*|nullexpiredUrl*string|nullabTest*|nullhasPassword*booleanqrTemplateId*|Its QR brand template; null = the plain code
qrStyle*|QR style settings it changes on top of its template
createdAt*stringISO 8601 date-time
updatedAt*stringISO 8601 date-time
curl -X POST 'https://api.tinbo.co/v1/links' \ -H 'Content-Type: application/json' \ -d '{ "url": "http://example.com"}'{ "id": "string", "domain": "string", "slug": "string", "shortLink": "string", "url": "string", "title": "string", "description": "string", "ogImageUrl": "string", "folderId": "string", "tags": [ { "id": "string", "name": "string", "color": "string" } ], "redirectType": 0, "passQuery": true, "openInApp": true, "openInBrowser": true, "utm": { "property1": "string", "property2": "string" }, "geoRules": [ { "country": "string", "url": "string" } ], "deviceRules": [ { "device": "string", "url": "string" } ], "expiresAt": "string", "expiredUrl": "string", "abTest": { "variants": [ { "url": "string", "weight": 0 } ], "endsAt": "string" }, "hasPassword": true, "qrTemplateId": "string", "qrStyle": { "dots": "square", "eyeFrame": "square", "eyeBall": "square", "color": "string", "eyeColor": "string", "background": "string", "logo": true, "logoSize": 0.15, "margin": 2, "outline": "none", "outlineColor": "string" }, "createdAt": "string", "updatedAt": "string"}List links GET
Newest first.
Create links in bulk POST
Each link is created on its own: a taken slug or an option the plan lacks fails that one, and the others are still created. The whole batch must fit the link allowance left this billing cycle, or none is created (403 limit_reached). Counts as one request against the rate limit.