The REST API lives at https://in.bio/api/v1 and covers links, QR codes,
analytics, folders, tags, and account usage. API access is a plan feature —
included on every paid plan (Lite, Pro, and Business).
Authentication
Create a token under Settings → API tokens — the plaintext token is shown once. Send it as a bearer token on every request:
curl https://in.bio/api/v1/links \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json"Scopes
A token only has the scopes selected at creation. A missing scope returns 403
with error.type = "scope" naming the required scope.
| Scope | Grants |
|---|---|
links:read |
List and read links, QR codes, folders, and tags. |
links:write |
Create, update, delete, enable/disable, and bulk-create links. |
analytics:read |
Per-link analytics. |
Rate limits
Standard X-RateLimit-Limit / X-RateLimit-Remaining headers are returned;
exceeding the limit returns 429 with Retry-After.
| Plan | Requests / minute |
|---|---|
| Lite | 60 |
| Pro | 60 |
| Business | 300 |
Conventions
-
Single resources are wrapped in
{ "data": ... }; paginated lists add Laravel-stylelinksandmetaobjects. -
Errors look like
{ "message": "...", "error": { "type": "..." } }:error.typeStatus Meaning scope403 Token is missing a required scope. plan403 Feature isn’t on your plan. state409 Invalid state transition (e.g. enabling an active link). entitlement422 A plan limit was reached (e.g. monthly links). account403 Account is suspended. -
Validation failures are standard
422with anerrorsobject per field. -
Timestamps are ISO 8601; dates are
YYYY-MM-DD. -
Requesting a link you don’t own returns
404, never403— resource existence is never leaked.