---
title: "Python"
description: "The official INBIO SDK for Python — typed, zero dependencies."
---

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

# Python

Dataclass models, full type hints, zero dependencies (pure standard library).
Python ≥ 3.9.

```bash
pip install inbio
```

## Shorten a URL (no account)

```python
import inbio

link = inbio.shorten("https://example.com/very/long/url")
print(link.short_url)  # https://in.bio/a8K2p
```

## Authenticated client

Pass a token or set `INBIO_API_TOKEN` in the environment:

```python
from inbio import Inbio

client = Inbio()  # reads INBIO_API_TOKEN

created = client.links.create(
"https://example.com/sale",
slug="spring-sale",
tags=["marketing"],
utm={"source": "newsletter", "medium": "email"},
)
```

## Everything else

```python
# List with filters, or iterate every page automatically
page = client.links.list(status="active", per_page=50)
for link in client.links.iterate(tag="marketing"):
print(link.slug, link.total_clicks)

# Update, toggle, delete
client.links.update(42, title="Renamed")
client.links.disable(42)
client.links.enable(42)
client.links.delete(42)

# QR code bytes → file
qr = client.links.qr(42, format="png", size=1024)
open("qr.png", "wb").write(qr)

# Analytics, folders, tags, usage  (from is a Python keyword → from_)
stats = client.links.analytics(42, from_="2026-06-01")
folders = client.folders.list()
tags = client.tags.list()
usage = client.account.usage()
```

## Errors

```python
from inbio import RateLimitError, ValidationError

try:
client.links.create(url)
except ValidationError as e:
print(e.errors)          # per-field messages
except RateLimitError as e:
print(e.retry_after)     # seconds
```

`AuthenticationError` (401), `AccessError` (403, plan or scope),
`NotFoundError`, `ValidationError`, `EntitlementError`, `StateConflictError`
(409), `RateLimitError` (429), `ServerError` — all subclass `InbioError`.
GETs and `Retry-After` 429s are retried automatically with backoff.

## Webhooks

```python
# e.g. in a Flask handler
event = client.webhooks.verify(
request.get_data(),                    # raw body bytes
request.headers["X-Inbio-Signature"],
secret,
)
if event["event"] == "link.clicked":
...
```

Signatures are checked with `hmac.compare_digest` and a 5-minute
replay-protection window. See [Webhooks](/api/webhooks) for the payload format.

Source: https://docs.in.bio/sdks/python/index.mdx
