BioFlow / Developers / API docs

BioFlow API documentation.

A REST API for the page your users keep in their bio: read and edit pages, add blocks, publish, capture contacts, pull analytics, and manage webhooks — all at https://app.getbioflow.com/v1, described by an OpenAPI 3.1 spec, available on Creator and Pro.

Quickstart

Three steps to your first call.

1. Get your API key

Create a key in the developer console — pick its scopes when you create it. bf_live_ keys are production keys; bf_test_ keys are read-only.

Get your API key →

2. List your pages

Paste-runnable — swap in your key:

curl "https://app.getbioflow.com/v1/pages" \ -H "Authorization: Bearer bf_live_YOUR_KEY"

3. Read the response

A cursor page of your bio pages — every list endpoint uses the same { data, has_more, next_cursor } envelope:

{ "data": [ { "id": "pg_abc123", "title": "My links", "slug": "maya", "status": "PUBLISHED", "block_count": 6, "public_url": "https://getbioflow.com/maya", "updated_at": "2026-07-20T12:00:00.000Z" } ], "has_more": false, "next_cursor": null }
Authentication

One key, two header forms.

Send the key either way

Both forms are equivalent — send exactly one per request:

Authorization: Bearer bf_live_YOUR_KEY x-api-key: bf_live_YOUR_KEY

Live vs test keys

bf_live_ keys can do everything their scopes allow. bf_test_ keys are restricted to read operations — a write with a test key returns 403 test_key_read_only, so test integrations can never touch live data.

Rate limits & quotas

Plan quotas, burst limits, honest headers.

BioFlow API monthly quota and per-key burst limit by plan
PlanMonthly quotaPer-key burst
Free— (no API access)
Creator10,000 requests/mo60 requests/min
Pro100,000 requests/mo120 requests/min

The quota counts successful /v1 requests per calendar month (UTC); GET /v1/usage is free and shows where you stand. Every response carries IETF draft-11 RateLimit / RateLimit-Policy headers. Bursting past the per-minute limit returns 429 rate_limited; an exhausted month returns 429 quota_exhausted; Free-plan keys get 403 feature_not_enabled. Full plan pricing on /pricing.

Conventions

Pagination and idempotency, everywhere the same.

Cursor pagination

List endpoints return { data, has_more, next_cursor }. Pass limit for page size and feed next_cursor back as after until has_more is false. Cursors are opaque — never parse them.

Idempotency keys

Consequential POSTs (create page, add block, publish, webhook management) accept an Idempotency-Key header — any unique string per logical attempt. Retrying with the same key returns the original result instead of repeating the action; reusing a key with a different body returns 422 idempotency_key_reused.

Errors

14 stable codes, RFC 9457 bodies.

Every error is application/problem+json with a stable code your integration can branch on (never parse title or detail), a type URI that resolves to the pages below, and a request_id to quote at support.

The BioFlow API problem codes with their HTTP statuses
CodeStatusMeaning
invalid_request400The request body or parameters failed validation
invalid_api_key401Missing, malformed, unknown, disabled, or expired API key
insufficient_scope403The API key was not granted the required scope
feature_not_enabled403The workspace plan does not include public API access
test_key_read_only403Test-mode keys are restricted to read operations
resource_not_found404No resource with that ID exists in this workspace
stale_snapshot409The draft changed since it was last read
idempotency_in_progress409A request with this Idempotency-Key is still executing
idempotency_key_reused422This Idempotency-Key was already used with a different request
endpoint_verification_failed422The webhook endpoint did not accept the signed test event
endpoint_limit_reached422The workspace webhook endpoint limit was reached
rate_limited429Per-key rate limit exceeded
quota_exhausted429Monthly API quota exhausted
internal_error500Something went wrong on our side
Reference

All 22 operations.

Every BioFlow API operation with its method, path, and scope
OperationEndpointScope
Get analytics summaryGET /v1/analytics/summaryanalytics:read
List contactsGET /v1/contactscontacts:read
List filesGET /v1/filesfiles:read
List pagesGET /v1/pagespages:read
Create a pagePOST /v1/pagespages:write
Delete a pageDELETE /v1/pages/{page_id}pages:write
Get a pageGET /v1/pages/{page_id}pages:read
Update a page draftPATCH /v1/pages/{page_id}pages:write
Add a blockPOST /v1/pages/{page_id}/blockspages:write
Remove a blockDELETE /v1/pages/{page_id}/blocks/{block_id}pages:write
Publish a pagePOST /v1/pages/{page_id}/publishpublish
Get API usageGET /v1/usagepages:read, pages:write, analytics:read, contacts:read, files:read, publish
List webhook endpointsGET /v1/webhook-endpointswebhooks:read
Create a webhook endpointPOST /v1/webhook-endpointswebhooks:write
Delete a webhook endpointDELETE /v1/webhook-endpoints/{endpoint_id}webhooks:write
Get a webhook endpointGET /v1/webhook-endpoints/{endpoint_id}webhooks:read
Update a webhook endpointPATCH /v1/webhook-endpoints/{endpoint_id}webhooks:write
List deliveriesGET /v1/webhook-endpoints/{endpoint_id}/deliverieswebhooks:read
Resend a deliveryPOST /v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}/resendwebhooks:write
Replay failed deliveriesPOST /v1/webhook-endpoints/{endpoint_id}/replaywebhooks:write
Rotate the signing secretPOST /v1/webhook-endpoints/{endpoint_id}/rotate-secretwebhooks:write
Send a test eventPOST /v1/webhook-endpoints/{endpoint_id}/testwebhooks:write

Ship your first integration today.

Create a key in the developer console and make your first call in under a minute — the API is included on Creator and Pro.

Start free — no cardGet your API key