BluetickedDeveloper docs

Channels

6 endpoints, each with examples that open in the console prefilled.

All resources
GET/api/v1/channels/whatsapp/readinesschannels:readTry in console

WhatsApp readiness

Check WABA connection, template, test send, reply and webhook readiness.

  • Run this before live pilots and after Meta account changes.
  • Overall status is "ready", "needs_attention" (warnings only) or "blocked" (at least one failing check).
  • Each check reports status "ok", "warn" or "fail" with keys channel_connected, channel_credentials, approved_templates, recent_outbound and recent_inbound.
  • action_url and each channel's settings_url are in-dashboard deep links: the account area is /settings, a specific number is /settings/whatsapp/{wabaId} (falling back to /settings when no WABA id is known), templates live at /templates, a pilot send at /whatsapp/campaigns/new and inbound proof at /conversations.
  • Pass ?channel_id= to scope the snapshot to a single WhatsApp channel; an unknown id returns 404 not_found.
  • Gate launch flow on status === "ready" (or accept needs_attention if warnings are acceptable).
curl -X GET "https://app.blueticked.com/api/v1/channels/whatsapp/readiness" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "status": "blocked",
  "checks": [
    {
      "key": "channel_connected",
      "label": "WhatsApp channel connected",
      "status": "ok",
      "message": "1 connected WhatsApp channel found.",
      "action_url": "/settings"
    },
    {
      "key": "approved_templates",
      "label": "Approved templates",
      "status": "fail",
      "message": "Create and submit at least one WhatsApp template.",
      "action_url": "/templates"
    }
  ],
  "summary": {
    "connected_channels": 1,
    "approved_templates": 0,
    "pending_templates": 1,
    "rejected_templates": 0,
    "recent_outbound": 0,
    "recent_successful_outbound": 0,
    "recent_inbound": 0
  },
  "channels": [
    {
      "id": "1891a644-c71d-4a79-b679-6db1db14e065",
      "business_id": "8070c984-41f6-4bfa-900b-1ce8750ad439",
      "display_name": "Main number",
      "identifier": "+27210000000",
      "status": "connected",
      "connected_at": "2026-07-01T08:00:00Z",
      "last_error": null,
      "settings_url": "/settings/whatsapp/1234567890"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/channels/{id}/whatsapp-spendchannels:readTry in console

WhatsApp spend

What Meta billed the business for WhatsApp on one channel, by category and country, in Meta's currency.

Query parameters
daysstring
  • Meta bills the business directly for WhatsApp; Blueticked never resells or meters it. This is Meta's own pricing analytics for the channel's WhatsApp Business Account, so currency is the currency Meta bills in, and the figures are approximate until Meta's billing settles.
  • days is a whole number from 1 to 90 (default 30); the window ends now. Anything else is 400 validation_failed.
  • cost is what Meta charged: 0 for free messages (a customer-service reply, for one), and null only where Meta reports messages without a cost. Lines are ordered by cost, highest first.
  • An id that is not a UUID is 400 validation_failed. A channel that is not WhatsApp is 400 validation_failed with details.reason "not_whatsapp_channel"; one with no Meta connection, or whose token Meta refuses, is 503 channel_unavailable ("whatsapp_token_missing": reconnect it, retrying will not help). When Meta fails or cannot be reached the answer is 502 provider_error or 503 service_unavailable ("meta_unavailable"), never an empty spend.
  • Each channel can be read 30 times a minute, whichever key asks; a key confined to other businesses gets 404 not_found, as for another workspace's channel.
curl -X GET "https://app.blueticked.com/api/v1/channels/{id}/whatsapp-spend?days=30" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "channel_id": "1891a644-c71d-4a79-b679-6db1db14e065",
  "window": {
    "days": 30,
    "start": "2026-09-18T09:00:00.000Z",
    "end": "2026-10-18T09:00:00.000Z"
  },
  "currency": "USD",
  "totals": {
    "messages": 1240,
    "cost": 31.85
  },
  "by_category": [
    {
      "category": "marketing",
      "messages": 820,
      "cost": 28.7
    },
    {
      "category": "utility",
      "messages": 300,
      "cost": 3.15
    },
    {
      "category": "service",
      "messages": 120,
      "cost": 0
    }
  ],
  "by_country": [
    {
      "country": "ZA",
      "messages": 1180,
      "cost": 30.4
    },
    {
      "country": "BW",
      "messages": 60,
      "cost": 1.45
    }
  ],
  "source": "meta_pricing_analytics",
  "approximate": true,
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/channelschannels:readTry in console

List channels

Inventory of connected channels and their connection status.

  • Credentials are never exposed; use the dashboard to connect or disconnect channels.
  • The SMS entry is always present (synthesized when no stored row exists): id and created_at can be null, status becomes 'unavailable' when the platform SMS provider is not configured, and sender_id describes the alphanumeric originator used at send time.
curl -X GET "https://app.blueticked.com/api/v1/channels" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "1891a644-c71d-4a79-b679-6db1db14e065",
      "channel": "whatsapp",
      "display_name": "Main practice line",
      "identifier": "+27210000000",
      "status": "connected",
      "created_at": "2026-07-01T08:00:00Z"
    },
    {
      "id": "72f1f6de-f90f-438b-b5a8-e57c0e4c45ce",
      "channel": "sms",
      "display_name": "SMS",
      "identifier": "Blueticked",
      "status": "connected",
      "created_at": "2026-10-12T08:00:00.000Z",
      "sender_id": "Blueticked",
      "uses_default_sender": false,
      "provider": "smsportal"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
POST/api/v1/channels/connect-sessionschannels:writeTry in console

Create a WhatsApp connect link

Mint a single-use link that lets your customer connect their WhatsApp Business account themselves, no Blueticked login required.

Body parameters
business_idstring
expires_in_minutesnumber
referencestring
redirect_urlstring
  • Connecting WhatsApp is a human act performed by the business owner in Meta's Embedded Signup; no API key can do it for them. This turns that step into a link you send, instead of asking your customer to create a Blueticked account and find a screen.
  • The url is returned ONCE and is not stored in plaintext. If you lose it, mint another and let this one expire.
  • The link is single-use, expires (default 24 hours, 5 minutes to 7 days), and authorises exactly one thing: attaching a WhatsApp channel to this workspace. It cannot read, send, or write anything else.
  • reference is opaque to us and comes back on the channel.connected webhook, so you can match a completed connect to your own customer record without storing a map of our ids.
  • redirect_url must be https: your customer's browser follows it after a successful connect.
  • Pass business_id to say WHOSE channel this becomes. Omit it and the link binds to the workspace default business, which silently collapses every customer onto one. The sends still return 202, from the wrong number.
  • Subscribe to channel.connected to learn when your customer finished; it fires once per connect. If you would rather poll, GET /api/v1/readiness?business_id=... flips can_send.whatsapp to true for THAT business. Either way, do not ask your customer whether they finished.
curl -X POST "https://app.blueticked.com/api/v1/channels/connect-sessions" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "business_id": "22222222-2222-4222-9222-222222222222",
  "expires_in_minutes": 1440,
  "reference": "your-customer-id-8842",
  "redirect_url": "https://yourapp.example/onboarding/whatsapp/done"
}'
Response
{
  "id": "55da18e2-8acb-46cb-9d58-1bc94a287783",
  "url": "https://app.blueticked.com/connect/8Kq2v...",
  "expires_at": "2026-08-10T03:00:00.000Z",
  "business_id": "22222222-2222-4222-9222-222222222222",
  "reference": "your-customer-id-8842",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/channels/connect-sessionschannels:readTry in console

List WhatsApp connect links

The connect links you have sent, newest first, with the status of each.

Query parameters
limitstring
  • status is one of active, used, expired or revoked. It is derived when you read, so a link never reports active here while the page already refuses it.
  • The token is never returned, only token_prefix, which is enough to identify a link in a support conversation and not enough to use it.
  • A key narrowed to specific businesses sees only those businesses' links.
  • limit defaults to 25, maximum 100.
curl -X GET "https://app.blueticked.com/api/v1/channels/connect-sessions?limit=25" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "55da18e2-8acb-46cb-9d58-1bc94a287783",
      "status": "used",
      "token_prefix": "8Kq2vTok",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "reference": "your-customer-id-8842",
      "redirect_url": "https://yourapp.example/onboarding/whatsapp/done",
      "expires_at": "2026-08-10T03:00:00.000Z",
      "used_at": "2026-08-09T14:12:08.000Z",
      "revoked_at": null,
      "created_at": "2026-08-09T03:00:00.000Z"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
DELETE/api/v1/channels/connect-sessions/{id}channels:writeTry in console

Revoke a WhatsApp connect link

Kill a link you have sent: wrong address, forwarded, or simply no longer wanted.

  • The customer holding a revoked link is told it was cancelled, not that it is invalid. That is a more useful answer, and the row is kept so you can still see the link existed.
  • A link that has ALREADY been used cannot be revoked: 409 resource_in_use. Revoking it would imply the connection it created had been undone, and it has not. Undoing that means disconnecting the channel instead.
  • Revoking an already-revoked link succeeds. You wanted it dead; it is dead.
  • An id from another workspace returns 404 rather than confirming it exists.
curl -X DELETE "https://app.blueticked.com/api/v1/channels/connect-sessions/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "id": "55da18e2-8acb-46cb-9d58-1bc94a287783",
  "status": "revoked",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}