Migration Guide: TakeBroadcast API to Growth API (Active Campaign) August 14, 2026 12:38 Updated Why are we making this change? What changes in practice? What is the impact on you? Practical guide Why are we making this change?The TakeBroadcast API was Blip’s first solution for sending proactive messages. It served its purpose, but it was built outside the platform’s native ecosystem and no longer receives new features or corrective maintenance.All evolution related to proactive messaging now happens in the Growth API (Active Campaign), which is native to Blip, integrated with dashboards, number health management, and the LIME protocol — the same protocol used by all extensions in the platform’s ecosystem.In summary: TakeBroadcast is in discontinuation mode. Those still using it are relying on an unsupported API without access to improvements and new features released by the platform. What changes in practice?The main change: from external API to LIME commandThe most important difference is structural. TakeBroadcast is called as a conventional HTTP API on an external domain (takebroadcast.cs.blip.ai). The Growth API uses the native LIME command protocol of your contract, the same used by all Blip extensions. Aspect TakeBroadcast API Growth API (Active Campaign) Base endpoint https://takebroadcast.cs.blip.ai/api/v2/Broadcast/... https://<contract>.http.msging.net/commands Protocol HTTP with proprietary headers LIME command (method: set) Recipient Identified in headers (identifier, organization) postmaster@activecampaign.msging.net Resource (action) Defined in HTTP path (/list, /csv) Defined in the uri field inside JSON Template parameters Query string (namespace, template, languageCode) message object inside resource Variables and media Loose fields in payload (var1, image, url) Mapped in audience.messageParams + message.messageParams Send via CSV Physical file upload (multipart/form-data) Public file URL in campaign.fileUrl The new structure: three pillarsAny send operation in the Growth API is organized into three blocks: campaign — general settings: name, type (Individual or Batch), channel, and return flow in Builder. audience / audiences — who receives: recipient number, variable values, and media per contact. message — what is sent: approved template name, language, and list of expected parameters. How parameters work nowIn TakeBroadcast, values were passed as loose fields (var1, image). In the Growth API: audience.messageParams — dictionary with the values of variables per recipient. message.messageParams — array with the names of the keys expected (schema). The order here must follow the order of the components in the template registered in Meta. Important: message.messageParams contains key names, not values. Passing values in this field is a common migration error.Parameter ordering ruleThe order in message.messageParams must follow the template structure:Regular templates:[ ...header, ...URL buttons, ...body ]Templates with Limited Time Offer: [ ...header, offer expiration, ...buttons, ...body ]Carousel templates:[ ...main body, ...card 0 (header → buttons → body), ...card 1, ... ] Component Number of variables Text header with {{1}} 1 Media header (IMAGE / VIDEO / DOCUMENT) 1 (media URL) URL button with dynamic suffix 1 per button COPY_CODE button 1 (the coupon code) Body 1 per {{n}} variable present in the text What is the impact on you?What you lose by staying on TakeBroadcast Send and delivery data are not updated in real time. The platform’s new campaign dashboards do not read data from TakeBroadcast. No access to new features, such as sending via BSUID. No individual throughput control per bot — risk of concurrency between sends. No visibility of WhatsApp number health in the Growth interface. No support for business validations, such as checking if the user is already in service before sending. What you gain by migrating Real-time campaign data, visible directly on the platform. Complete tracking per recipient (delivery status, read, failure, and reason). Throughput control per bot without concurrency. Integration with Builder flows via flowId and stateId for routing audience responses. Campaign scheduling via the scheduled field. Access to all new features released for the Growth API. Practical guideHow to identify if you use the TakeBroadcast APICheck the URLs your integrations and send scripts call. If the domain below appears, the integration uses the legacy API: https://takebroadcast.cs.blip.ai/The most common endpoints to check: Send type Legacy endpoint Send via list (JSON) /api/v2/Broadcast/list or /api/v1/Broadcast/list Send via CSV /api/v2/Broadcast/csv or /api/v1/Broadcast/csv Individual notification /api/v2/Notification or /api/v1/Notification What and where needs to be changedStep 1 — Change the HTTP endpoint Before After POST https://takebroadcast.cs.blip.ai/api/v2/Broadcast/list POST https://<contract>.http.msging.net/commands POST https://takebroadcast.cs.blip.ai/api/v2/Broadcast/csv POST https://<contract>.http.msging.net/commands <contract> is your identifier on the Blip platform.Step 2 — Change authentication headers Before (TakeBroadcast) After (Growth) identifier: <BOT_ID> Authorization: Key <BOT_ACCESS_KEY> accessKey: <BOT_ACCESS_KEY> (removed) organization: <ORGANIZATION_ID> (removed) The Growth API Authorization uses the bot access key found in the Blip portal under Settings → Connection Information.Attention for router bot architecture: the key must always be the router bot’s, not the subbot’s. The masterState field needs to be informed in these cases.Step 3 — Restructure the payloadThe payload is no longer a simple list but becomes a LIME command with three internal blocks.Scenario 1 — Template without variables (individual)Before:curl --location 'https://takebroadcast.cs.blip.ai/api/v2/Broadcast/list?phoneColumn=telefone&namespace=<NAMESPACE>&template=<TEMPLATE>&languageCode=<LANGUAGE>&scheduleTime=0' \ --header 'identifier: <BOT_ID>' \ --header 'accessKey: <BOT_ACCESS_KEY>' \ --data '[{ "telefone": "<PHONE>" }]'After: { "id": "{{$guid}}", "to": "postmaster@activecampaign.msging.net", "method": "set", "uri": "/campaign/full", "type": "application/vnd.iris.activecampaign.full-campaign+json", "resource": { "campaign": { "name": "Campaign Name", "campaignType": "Individual", "channelType": "WhatsApp", "sourceApplication": "MyApp" }, "audience": { "recipient": "+55119999999999" }, "message": { "messageTemplate": "<TEMPLATE>", "messageTemplateLanguage": "<LANGUAGE>", "channelType": "WhatsApp" } } }Scenario 2 — Template with text variables (individual)Before:--data '[{ "telefone": "<PHONE>", "var1": "<VALUE>" }]'After: values go in audience.messageParams, and keys go in message.messageParams:"audience": { "recipient": "+55119999999999", "messageParams": { "1": "<VALUE>" } }, "message": { "messageTemplate": "<TEMPLATE>", "messageTemplateLanguage": "<LANGUAGE>", "messageParams": ["1"], "channelType": "WhatsApp" }Scenario 3 — Template with image in headerBefore:--data '[{ "telefone": "<PHONE>", "image": "<IMAGE_URL>", "var1": "<VALUE>" }]'After: the image goes first in messageParams (it is the header parameter):"audience": { "recipient": "+55119999999999", "messageParams": { "image": "<IMAGE_URL>", "username": "<VALUE>" } }, "message": { "messageTemplate": "<TEMPLATE>", "messageTemplateLanguage": "<LANGUAGE>", "messageParams": ["image", "username"], "channelType": "WhatsApp" } Scenario 4 — Batch send (multiple recipients in payload)Change campaignType to Batch and use audiences (plural) with an array:"campaign": { "name": "Batch Campaign", "campaignType": "Batch", "channelType": "WhatsApp" }, "audiences": [ { "recipient": "+55119999999991", "messageParams": { "1": "Value for contact 1" } }, { "recipient": "+55119999999992", "messageParams": { "1": "Value for contact 2" } } ], "message": { "messageTemplate": "<TEMPLATE>", "messageTemplateLanguage": "<LANGUAGE>", "messageParams": ["1"], "channelType": "WhatsApp" }Scenario 5 — Mass send via CSVBefore, you uploaded the file physically. Now, you must host the CSV at a public URL and provide it in fileUrl. The endpoint changes to /campaign/full/v2:Before:curl --form 'formFile=@"/path/to/file.csv"' \ 'https://takebroadcast.cs.blip.ai/api/v2/Broadcast/csv?...'After:{ "id": "{{$guid}}", "to": "postmaster@activecampaign.msging.net", "method": "set", "uri": "/campaign/full/v2", "type": "application/vnd.iris.activecampaign.full-campaign+json", "resource": { "campaign": { "name": "CSV Campaign", "campaignType": "Batch", "channelType": "WhatsApp", "fileUrl": "<PUBLIC_CSV_URL>" }, "message": { "messageTemplate": "<TEMPLATE>", "messageTemplateLanguage": "<LANGUAGE>", "channelType": "WhatsApp" } } }Attention: The CSV file must be accessible via a public URL (HTTP/HTTPS). You can no longer send the binary file in the request.CSV rules: The first column identifies the recipient (e.g., phone). Columns whose names are listed in message.messageParams are used as template parameters — in the same order. Columns not listed in message.messageParams are saved in contact.extras of the contact. Migration checklist [ ] Identify all calls to the domain takebroadcast.cs.blip.ai. [ ] Change the endpoint to https://<contract>.http.msging.net/commands. [ ] Replace authentication headers with Authorization: Key <ACCESS_KEY>. [ ] Restructure the payload with the blocks campaign, audience/audiences, and message. [ ] Move variable values to audience.messageParams. [ ] Declare key names in message.messageParams (in the correct template order). [ ] For CSV: host the file at a public URL and use campaign.fileUrl with uri /campaign/full/v2. [ ] Validate the template language in the message.messageTemplateLanguage field. [ ] Test in staging with controlled numbers before going to production. Frequent points of attention Reported symptom Likely cause Guidance "Parameters appear in the wrong order in the message" Incorrect order in message.messageParams Check the order of components in the template registered in Meta "Message does not send with CSV" File is not at a public URL The CSV must be accessible via HTTP/HTTPS "Error sending fileUrl along with audiences" Conflict: both cannot be provided simultaneously Use only one: either fileUrl or audiences "Variables end up in contact.extras" CSV column is not listed in message.messageParams Add the column name to the message.messageParams array "Campaign created but not sent" message.messageParams received values instead of key names message.messageParams must contain key names, not values Related articles How to send notifications via Active Campaign API (Growth) — Blip Help Center Audience file configuration — Mass notification sending Need more help? Explore our content at Blip Academy or Blip Community, watch tutorials on our YouTube channel or ask your questions in our support channel 😃 Related articles Sending Active WhatsApp Messages in Blip Desk Sending Active Messages with BSUID How to Send Notifications via the Active Campaign API (Growth)