Bio pages
List, create and update bio pages (mobile link pages).
Plan: Starter and up.
A bio page goes live when a code points at it. Choose the page for a code in the dashboard.
The bio page object
{
"id": "7d1e0f4a-58b2-4c3e-8f0a-1b2c3d4e5f60",
"name": "Cafe links",
"content": {
"title": "Corner Cafe",
"description": "Fresh coffee, open daily from 7am.",
"avatarUrl": "https://example.com/logo.png",
"coverUrl": null,
"theme": "editorial",
"style": { "accent": "#1f6f5c", "buttonStyle": "pill" },
"customCss": "",
"blocks": [
{ "id": "menu", "type": "link", "label": "See the menu", "url": "https://example.com/menu" },
{ "id": "hello", "type": "text", "body": "Ask about our loyalty card." },
{ "id": "social", "type": "socials", "links": [{ "network": "instagram", "url": "https://instagram.com/cornercafe" }] }
]
},
"updatedAt": "2026-11-12T16:40:00.000Z"
}
Content fields
| Field | Notes |
|---|---|
title | Required, 1 to 80 characters |
description | Up to 300 characters. Default "" |
avatarUrl | http/https image URL, or null (default) |
coverUrl | Banner image above the profile, an http/https URL, or null (default) |
theme | minimal (default), midnight, cobalt, dusk, editorial, playful, grove or blush. The older names light, dark, sand, forest, ocean and rose are still accepted and saved as the closest new theme |
style | Optional changes on top of the theme. See Style fields. Default {} |
customCss | Up to 10,000 characters. Business only; sanitised when the page is shown |
blocks | Up to 40 blocks, shown top to bottom |
Style fields
Every style field is optional. A field you leave out uses the theme's value.
| Field | Notes |
|---|---|
background | solid, gradient or image |
backgroundColor, gradientTo, accent | Six-digit hex colours, such as #1f6f5c |
backgroundImage | http/https image URL, used when background is image |
buttonStyle | filled, outline, soft, pill, square or shadow |
font | system, inter, grotesk, humanist, display, editorial, classic, rounded or mono |
avatarShape | circle, rounded or square |
Block types
Every block has an id (up to 40 characters) and a type.
type | Fields |
|---|---|
link | label (1 to 80 characters), url (http/https) |
text | body (1 to 2000 characters) |
image | src (http/https), alt (up to 200 characters) |
video | url: a YouTube or Vimeo link |
socials | links: up to 12 items { "network", "url" }. Networks: instagram, facebook, tiktok, x, youtube, linkedin, threads, pinterest, whatsapp, email, website |
lead | formId: a lead form in this workspace. Needs lead capture (Pro and up) |
List bio pages
GET /api/v1/bio-pages
Returns every page, most recently updated first, with the plan's page limit (null means unlimited). Not paginated.
{
"data": [
{
"id": "7d1e0f4a-58b2-4c3e-8f0a-1b2c3d4e5f60",
"name": "Cafe links",
"content": { "title": "Corner Cafe", "description": "", "avatarUrl": null, "coverUrl": null, "theme": "editorial", "style": {}, "customCss": "", "blocks": [] },
"updatedAt": "2026-11-12T16:40:00.000Z"
}
],
"limit": null
}
Create a bio page
POST /api/v1/bio-pages
| Body field | Required | Notes |
|---|---|---|
name | Yes | Internal name, 1 to 120 characters |
content | Yes | Content fields. Only title is required |
curl -X POST https://dynaqr.app/api/v1/bio-pages \
-H "Authorization: Bearer qrm_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Cafe links",
"content": {
"title": "Corner Cafe",
"theme": "editorial",
"blocks": [
{ "id": "menu", "type": "link", "label": "See the menu", "url": "https://example.com/menu" }
]
}
}'
Returns 201 with the page in data, including organizationId and createdAt. Returns 402 PLAN_LIMIT when the plan's page limit is reached.
Update a bio page
PATCH /api/v1/bio-pages/{id}
| Body field | Required | Notes |
|---|---|---|
content | Yes | The complete new content. Fields you leave out go back to their defaults, so read the page first, change what you need and send it all back |
name | No | New internal name |
Returns the updated page in data. Every code that shows the page opens the new version.
Every link, image and video URL on the page, plus the avatar, cover and background images, goes through the same safety checks as code destinations. Sending customCss on a plan below Business, or a lead block on a plan below Pro, returns 402 PLAN_FEATURE.