Flipbooker for developers
Put flipbooks in your own workflow
A REST API for turning PDFs into tracked flipbooks: upload documents, read per-reader analytics, export leads and receive webhooks — without anyone opening the dashboard.
57 endpoints · OpenAPI 3.1 · API keys and OAuth
curl https://app.flipbooker.com/api/v1/books \
-H "Authorization: Bearer $FLIPBOOKER_API_KEY"Two ways in
Same workspace, same keys, same scopes — pick the one that matches who is making the call.
REST API
Your code drives. 57 endpoints covering the full surface — uploads, per-reader analytics, exports and webhook subscriptions.
API referenceMCP server
A model drives. Connect Claude, ChatGPT or any MCP client and let the assistant call 50 tools directly — no integration code.
Connect a clientQuickstart
Three steps from zero to a converted flipbook.
- 1
Create an API key
Sign in to Flipbooker, open Account → API Keys and create a key. Pick only the scopes your integration needs.
The key is displayed once. Copy it into your secret store — it cannot be retrieved later, only rotated.
Store it as an environment variableexport FLIPBOOKER_API_KEY="wsk_live_..." - 2
List your flipbooks
Confirm the key works by listing the workspace's flipbooks. A
200with adataarray means you are connected.A
401means the key is wrong or revoked; a403means it is missing thebooks:readscope.GET /bookscurl https://app.flipbooker.com/api/v1/books \ -H "Authorization: Bearer $FLIPBOOKER_API_KEY" - 3
Upload a PDF
Post the document as
multipart/form-dataunder thefiles[]field — one file per request. PDF, Word, Excel, PowerPoint, JPG and PNG are accepted.Conversion runs in the background, so the response is
202 Acceptedwith a batch id rather than a finished flipbook. PollGET /batches/{batchId}until it reports done, then read the created book.POST /bookscurl -X POST https://app.flipbooker.com/api/v1/books \ -H "Authorization: Bearer $FLIPBOOKER_API_KEY" \ -F "files[][email protected]"
Authentication
Every request needs a workspace API key, sent as a bearer token. Keys are created in the app under Account → API Keys and are shown once at creation — Flipbooker only stores a hash, so store yours in a secret manager before closing the dialog.
Live keys are prefixed wsk_live_ and test keys wsk_test_. A key belongs to one workspace and every request is scoped to it — there is no workspace parameter to pass.
The API also accepts an OAuth 2 bearer token, which is how the Canva and Adobe integrations connect. Both auth methods honour the same scopes.
export FLIPBOOKER_API_KEY="wsk_live_..."
curl https://app.flipbooker.com/api/v1/books \
-H "Authorization: Bearer $FLIPBOOKER_API_KEY"Scopes
Grant a key only what it needs. A key with * gets everything.
analytics:readbooks:readbooks:writebrand:readbrand:writecatalogs:readcatalogs:writeexports:readsubscribers:readsubscribers:writetracked-links:readtracked-links:writewebhooks:readwebhooks:write
Calling an endpoint without its scope returns 403, and the response lists the scopes your key actually has.
How the API behaves
The conventions below hold across every endpoint.
Response envelope
Successful responses wrap the payload in data. Endpoints that paginate or add context also return a meta object.
Errors replace both with a single error object carrying a human-readable message, a stable type, and — for validation failures — field-level details. Branch on the HTTP status and type, not the message text.
// 200 OK
{
"data": [ { "id": 42, "name": "Quarterly report" } ],
"meta": { "next_cursor": "eyJpZCI6NDJ9", "has_more": true }
}
// 422 Unprocessable Entity
{
"error": {
"message": "The given data was invalid.",
"type": "ValidationException",
"details": { "file": ["The file field is required."] }
}
}Cursor pagination
List endpoints are cursor-paginated. Read meta.next_cursor and send it back as the cursor query parameter to fetch the next page; stop when has_more is false.
Cursors are opaque — never build or mutate one. Sort with the sort parameter, prefixing a field with - for descending order.
| Field | Type | Details |
|---|---|---|
| cursor | string | Opaque cursor from a previous response. |
| limit | integer | Items per page. 1–200 |
| sort | string | e.g. created_at or -created_at. |
let cursor = null
do {
const url = new URL('https://app.flipbooker.com/api/v1/books')
url.searchParams.set('limit', '100')
if (cursor) url.searchParams.set('cursor', cursor)
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.FLIPBOOKER_API_KEY}` }
})
const { data, meta } = await res.json()
for (const book of data) console.log(book.name)
cursor = meta?.has_more ? meta.next_cursor : null
} while (cursor)Rate limits
Authenticated traffic is limited to 1,000 requests per minute per workspace, with a second limit of 100 requests per minute per endpoint so one hot path cannot starve the rest of your integration.
Unauthenticated requests are limited to 10 per minute per IP. Exceeding a limit returns 429 with a Retry-After header — back off for that many seconds rather than retrying immediately.
async function call(url, init, attempt = 0) {
const res = await fetch(url, init)
if (res.status !== 429 || attempt >= 5) return res
const wait = Number(res.headers.get('Retry-After') ?? 1)
await new Promise(r => setTimeout(r, wait * 1000))
return call(url, init, attempt + 1)
}Idempotency
Send an Idempotency-Key header on writes so a retry after a timeout cannot create a duplicate. Use a fresh UUID per logical operation.
The first successful (2xx) response for a key is cached for 24 hours. Replays return that stored response together with X-Idempotent-Replay: true, so you can tell a replay from fresh work. Failed responses are not cached — those retries execute normally.
curl -X POST https://app.flipbooker.com/api/v1/books \
-H "Authorization: Bearer $FLIPBOOKER_API_KEY" \
-H "Idempotency-Key: 5b8f0a7e-2a1e-4f6a-9c3d-7e2b1f4a8c60" \
-F "files[][email protected]"Guides
End-to-end walkthroughs for the things people build first.
Upload a PDF and track it
Convert a document, wait for the batch to finish, then read who opened it and for how long.
Read guideReceive webhooks
Subscribe an endpoint to reader events, verify delivery, and debug what went wrong.
Read guideSync leads to your CRM
Pull the leads a flipbook captured and keep them flowing into your own systems.
Read guideBrowse every endpoint
Parameters, scopes, response shapes and example requests for all 57 endpoints — plus the OpenAPI 3.1 document.