• Getting started
    • Create your first code
    • Static vs dynamic codes
    • Plans and limits
  • QR codes
    • Code types
    • Editing a destination
    • Design and export
    • Folders, tags and placement
    • Pausing, archiving, expiry and scan limits
    • Code links
    • Custom domains
    • Safety checks and disabled codes
    • Put your menu behind a QR code
  • Analytics
    • What's tracked
    • History and plans
    • Exporting scans
  • Redirect rules
    • Conditions
    • A/B tests
    • Examples
  • Bio pages and lead capture
    • Create a bio page
    • Lead forms
    • Managing leads
  • Integrations
    • UTM tags
    • Google Analytics 4
    • Webhooks
    • Zapier
    • Bulk CSV import
  • Workspaces and team
    • Roles
    • Inviting people
    • Transferring ownership
    • Audit log
  • Reports
    • Schedule a report
    • Delivery, PDFs and unsubscribing
  • Billing
    • Upgrading and downgrading
    • Managing your subscription
  • Account and security
    • Signing in
    • Two-step verification
    • Deleting a workspace or account
  • REST API
    • Authentication
    • Errors and rate limits
    • Pagination
    • GET /me
    • Codes
    • A single code
    • Scan stats
    • Redirect rules
    • Bio pages
    • Leads
    • Hooks
    • Webhooks
  • AI assistants (MCP)
    • Connect Claude
    • Connect ChatGPT
    • Sign-in and access
    • Tools reference
    • Example prompts
    • Troubleshooting
    • Free static QR codes (no sign-in)

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

FieldNotes
titleRequired, 1 to 80 characters
descriptionUp to 300 characters. Default ""
avatarUrlhttp/https image URL, or null (default)
coverUrlBanner image above the profile, an http/https URL, or null (default)
thememinimal (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
styleOptional changes on top of the theme. See Style fields. Default {}
customCssUp to 10,000 characters. Business only; sanitised when the page is shown
blocksUp to 40 blocks, shown top to bottom

Style fields

Every style field is optional. A field you leave out uses the theme's value.

FieldNotes
backgroundsolid, gradient or image
backgroundColor, gradientTo, accentSix-digit hex colours, such as #1f6f5c
backgroundImagehttp/https image URL, used when background is image
buttonStylefilled, outline, soft, pill, square or shadow
fontsystem, inter, grotesk, humanist, display, editorial, classic, rounded or mono
avatarShapecircle, rounded or square

Block types

Every block has an id (up to 40 characters) and a type.

typeFields
linklabel (1 to 80 characters), url (http/https)
textbody (1 to 2000 characters)
imagesrc (http/https), alt (up to 200 characters)
videourl: a YouTube or Vimeo link
socialslinks: up to 12 items { "network", "url" }. Networks: instagram, facebook, tiktok, x, youtube, linkedin, threads, pinterest, whatsapp, email, website
leadformId: 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 fieldRequiredNotes
nameYesInternal name, 1 to 120 characters
contentYesContent 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 fieldRequiredNotes
contentYesThe 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
nameNoNew 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.

DynaQR
Help