BluetickedDeveloper docs

Authentication & limits

How keys work: bearer auth, scopes, IP allowlisting and rate limits.

How a key authenticates

Bearer auth
Send Authorization: Bearer blu_live_… (or blu_test_… for the sandbox) on every /api/v1 request. The full key is shown once at creation. Store it in a secrets manager. An app connected to a workspace by OAuth sends its bto_at_ access token the same way; an expired or revoked token answers 401 unauthorized, and the app should reconnect (its client refreshes tokens on its own). If Blueticked cannot check an OAuth token or the workspace's status right now, the call answers 503 service_unavailable: nothing was applied, so retry shortly.
When a key is refused
A key has no expiry unless one is set; an owner can set or move it on the key at any time. A missing or malformed Authorization header answers 401 unauthorized, and its message names the form a key takes. A refused key answers 401 unauthorized. Once its secret checks out, details.reason says why: revoked (it will not work again; create a new key), expired (its expiry date has passed; rotate it to make it work again) or workspace_inactive (its workspace is no longer active). An unknown key or a wrong secret gets no reason, so nobody without the secret can learn whether a key exists.
Scoped keys
Each key grants a fixed set of scopes; a missing scope returns 403 forbidden, with details.granted and details.required naming the difference. Grant only what an integration needs, and use a separate key per system. A business-restricted key reaches only the endpoints that can bound their answer to its businesses; any other answers 403 forbidden with details.business_scope restricted.
Publishable keys
A blu_pub_ key ships in a web page, so it works on the agent chat endpoint only, and only from the exact origins (scheme and host) you allowed on the key. Anywhere else it answers 403 forbidden: details.key_kind is publishable off the agent chat endpoint, and details.origin names the origin it was refused from. Use a secret key for everything else.
IP allowlist
Restrict a key to trusted IPs or IPv4/IPv6 CIDR ranges from Developers → API keys. Requests from other sources are refused with 403.
Rate limits
Requests are served at the lower of the key's own limit and your plan's per-minute API limit: 60/min on Starter, 120 on Growth, 300 on Business, 600 on Enterprise, 1200 on Platform, 300 on the API plan, 60 on the Sandbox. The plan's limit is shared by every key in the workspace, so minting another key does not raise it. rate_limited (429) responses carry x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset headers, always for whichever ceiling binds first, plus Retry-After: wait that many seconds, then retry. x-ratelimit-reset is the same moment as an ISO-8601 timestamp, not a number of seconds. Failed authentication is throttled separately, per calling address: past 30 failed attempts a minute with an unrecognised key prefix, a missing or malformed Authorization header or an invalid OAuth token, or 60 across every key prefix, further attempts answer 429 rate_limited with Retry-After. Wrong secrets for a recognised prefix have a separate failure budget: the higher of 30 a minute and the key's configured request limit, still subject to the shared 60-failure ceiling. Valid secrets do not consume the authentication-failure budget; their requests use the key and plan quotas.
The header
curl "https://app.blueticked.com/api/v1/channels" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"

Scopes

Everything a key can be allowed to do, grouped as the create-key dialog groups them.

Each endpoint in the reference names the scope it requires.

Available API key scopes by category
Workspace
workspace:read
Read the organization, accessible businesses and effective credential permissions.
businesses:read
List the businesses in this workspace. A platform reads this to reconcile its own customer records against ours.
businesses:write
Create a business and mint a credential scoped to it — how a platform onboards its own customers without a human in our dashboard. Powerful: grant it only to the one organization-wide key that does onboarding, never to the per-customer keys it issues.
Messaging
messages:send
Send WhatsApp, SMS and email messages — the umbrella send scope. Use a per-channel scope below to grant just one.
whatsapp:send
Send WhatsApp messages only — a least-privilege alternative to messages:send for WhatsApp-only integrations.
sms:send
Send SMS only — a least-privilege alternative to messages:send for SMS-only integrations.
email:send
Send email only — a least-privilege alternative to messages:send for email-only integrations.
events:send
Trigger Blueticked flows from booking systems, CRMs, websites and other apps.
messages:read
Fetch the status and content of messages.
Analytics
conversions:write
Report conversions/revenue so campaigns and journeys can attribute them to email engagement.
Contacts
contacts:read
List and fetch contacts in your workspace.
contacts:write
Create and update contacts.
Commerce
commerce:read
List products, stock levels and orders.
commerce:write
Create and update products, adjust stock, mark orders fulfilled.
Campaigns
campaigns:read
List campaigns and inspect delivery counters.
campaigns:write
Create, schedule and queue campaign sends.
Templates
templates:read
List WhatsApp templates and approval statuses.
templates:write
Create and submit WhatsApp templates for Meta approval.
Channels
channels:read
Inspect connected channels and WhatsApp launch readiness.
channels:write
Configure channel settings such as the email sending identity.
Flows
flows:read
List WhatsApp Flows and reusable flow bundles.
flows:write
Create and publish WhatsApp Flows. Reserved for the Flows API.
Automations
automations:read
List and read Flow Studio flows: their definitions, status and what stops them going live.
automations:write
Create and update Flow Studio flows switched off, and switch flows off. Nothing made here messages anyone until a person switches it on in Flow Studio.
AI agents
ai_agents:read
List AI agents and read their personas, autonomy settings and channel bindings.
ai_agents:write
Stop an AI agent replying — the safe direction. Configuring or re-enabling one stays a dashboard job.
ai_agents:chat
Converse with a live agent from your own surface — each reply runs a real model and is metered from the prepaid wallet. Send-class: it spends money on every call, so it sits outside the Read-only and Prepare presets.
Journeys
journeys:read
List journeys (sequences) and read their steps, status and enrolment counts.
journeys:enroll
Put contacts onto a live journey. Send-class: a journey messages people over time, so this sits outside the Prepare profile.
Sites
sites:read
List the workspace's sites with their slugs, statuses and live addresses.
sites:write
Work on sites without changing what the public sees — including taking a live site offline. Publishing needs sites:publish.
sites:publish
Put a site's draft live on the public internet. Deliberately separate from sites:write so a Prepare-profile agent can never publish.
forms:read
List what visitors submitted through site forms — the leads intake.
forms:write
Flip a submission's read state after an external system ingests it.
Conversations
conversations:read
List conversations and inspect the message history of each.
conversations:write
Assign, resolve and reopen conversations.
Tickets
tickets:read
List tickets, read one ticket, and read its comment trail.
tickets:write
Raise tickets and change status, priority, title or assignee.
Tables
tables:read
List tables with their columns and statuses, and read their rows and each row's status timeline.
tables:write
Add rows for your contacts and move them on or correct them. Tables themselves are made in the dashboard.
Suppression
suppression:read
List opted-out identifiers (do-not-contact entries).
suppression:write
Add and remove do-not-contact entries.
Webhooks
webhooks:read
List webhook subscriptions and inspect delivery history.
webhooks:write
Create, update, test and delete webhook subscriptions.
Integrations
integrations:read
List outbound integrations and inspect their delivery history.
integrations:write
Create, update, delete and test-fire outbound HTTP integrations.
Billing
wallet:read
Read the prepaid wallet balance and transaction ledger.

Sends accept either the umbrella messages:send or the per-channel scope: whatsapp:send, sms:send, email:send. The per-channel one is the least-privilege choice for a single-channel integration, which is why no endpoint lists it as its required scope.