---
title: "Links"
description: "Create, list, update, delete, toggle, and bulk-create links; fetch QR images."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.in.bio/llms.txt
> Use this file to discover all available pages before exploring further.

# Links

## 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 |

```json
{
  "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:

```json
{
  "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`. `404` if not found or not yours.
- `PATCH /api/v1/links/{id}` — `links:write`. Any subset of the create
  fields plus `slug`. Editing `destination_url` requires 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.

Source: https://docs.in.bio/api/links/index.mdx
