List links
GET /api/v1/links — scope links:read.
| Param | Type | Notes |
|---|---|---|
search |
string | Matches slug, title, destination URL |
folder_id |
int | Filter by folder |
tag |
string | Filter by tag name |
status |
string | active, disabled, archived, expired, exhausted, blocked, pending_review |
page, per_page |
int | per_page 1–100, default 25 |
{
"data": [
{
"id": 42,
"slug": "spring-sale",
"short_url": "https://in.bio/spring-sale",
"destination_url": "https://example.com/sale",
"title": "Spring sale",
"status": "active",
"redirect_type": 302,
"folder_id": 3,
"tags": ["marketing"],
"expires_at": null,
"click_limit": null,
"has_password": false,
"total_clicks": 1240,
"unique_clicks": 981,
"last_clicked_at": "2026-07-21T18:03:11+00:00",
"created_at": "2026-06-01T09:00:00+00:00"
}
],
"links": { "next": "..." },
"meta": { "current_page": 1, "total": 57 }
}Create a link
POST /api/v1/links — scope links:write. Only destination_url is
required.
| Field | Type | Notes |
|---|---|---|
destination_url |
string | http/https, max 2048 chars |
slug |
string | 4–64 chars [a-zA-Z0-9-_]; omitted → random |
title, description, notes |
string | Optional metadata |
redirect_type |
int | 301, 302 (default), 307 |
folder_id |
int | Must be one of your folders |
tags |
string[] | Created on the fly |
utm |
object | {source, medium, campaign, term, content} |
expires_at, fallback_url |
— | Requires link expiration (Pro+) |
click_limit |
int | Requires click limits (Pro+) |
password |
string | Requires password protection (Pro+) |
qr |
object | Optional QR design, same fields as the studio |
Returns 201 with the link resource. Hitting your monthly link quota returns
422 with error.type = "entitlement".
Bulk create
POST /api/v1/links/bulk — scope links:write, Business (bulk actions
feature). Body: {"links": [...]}, up to 100 objects with the same fields as
create. Rows fail independently:
{
"data": {
"created": [{ "id": 43, "slug": "a1" }],
"failed": [{ "index": 1, "error": "This slug is already taken." }]
}
}Read, update, delete
GET /api/v1/links/{id}—links:read.404if not found or not yours.PATCH /api/v1/links/{id}—links:write. Any subset of the create fields plusslug. Editingdestination_urlrequires the edit-destination feature (Pro+) and re-triggers a safety scan.DELETE /api/v1/links/{id}—links:write.204 No Content; the link stops redirecting immediately.
Enable / disable
POST /api/v1/links/{id}/enable · POST /api/v1/links/{id}/disable — scope
links:write. Only toggles between active and disabled; any other
current status returns 409 with error.type = "state".
QR image
GET /api/v1/links/{id}/qr — scope links:read.
| Param | Notes |
|---|---|
format |
png (default) or svg |
size |
64–2048 px |
Returns raw image bytes using the link’s saved QR design. The code encodes the short URL, so destination edits never invalidate printed codes.