Base URL
Authentication
All requests require your Workspace API Key in theX-API-Key header.
Prerequisites
Evergreen campaigns must be created and configured in the BluBash platform before you can use this API. The API covers audience ingestion and message dispatch only.Create an evergreen campaign in the platform
In the BluBash admin panel, create a new campaign with
kind = EVERGREEN.Configure channel, message, and rate limits
Set up the channel, message template, and rate limit rules for the campaign.
Add contacts to audience
items array represents one contact and its scheduling configuration.
Request body
An IANA timezone name (e.g.
America/New_York) applied to all items whose datetime has no UTC offset and no schedule.timezone specified.An array of contact + schedule objects. At least one item is required.
Contact resolution
When you provideidentifier instead of contact_id, the platform resolves the contact in this order:
- Looks up the contact by the channel identifier (e.g. normalized WhatsApp number).
- If not found and
emailis provided, searches by email (case-insensitive).- If found without a channel identifier, links the
identifierto the contact. - If found with a different channel identifier, returns a
400error to prevent silent identity merging.
- If found without a channel identifier, links the
- If still not found, creates a new contact using
name,email, andidentifier.
Scheduling rules
datetime format | Behavior |
|---|---|
With Z or numeric offset (e.g. +03:00, -0500) | Treated as an absolute instant; timezone is ignored |
Without offset (e.g. 2026-03-11T09:00:00) | Requires schedule.timezone or default_schedule_timezone for UTC conversion |
Example request
Response fields
One entry per input item, in the same order as the request.
Example response
Cancel a queued message
Only messages with status
QUEUED can be cancelled. Messages that are already SENDING, SENT, or FAILED cannot be cancelled.Response
List campaign messages
Query parameters
Number of results to return per page.
Number of results to skip for pagination.
Get a specific message
Message statuses
| Status | Description |
|---|---|
PENDING | Awaiting processing |
QUEUED | Queued for delivery — can be cancelled |
SENDING | Currently being sent |
SENT | Delivered successfully |
FAILED | Delivery failed |
CANCELLED | Cancelled via API |
Recommended workflow
Configure the campaign in the platform
Create an evergreen campaign in the BluBash admin panel and copy the
campaignId.Add contacts to the audience
Call
POST /api/v1/campaigns/:campaignId/audience with your items array.Choose a schedule per contact
Use
schedule.type = immediate for instant delivery, or schedule.type = absolute with a datetime for scheduled delivery.Cancel if needed
If you need to stop a queued message, call
POST /api/v1/campaigns/:campaignId/messages/:messageId/cancel.Code examples
Error reference
| Status | Message | Cause |
|---|---|---|
400 | Each item must provide contact_id or identifier | An item has neither contact_id nor identifier |
400 | Identifier is invalid | identifier is empty or invalid after normalization |
400 | schedule.timezone (IANA) is required when datetime has no UTC offset | datetime has no offset and no timezone was provided |
400 | Campaign is not an evergreen campaign | The campaignId belongs to a non-evergreen campaign |
400 | Cannot add contacts to cancelled or failed campaigns | Campaign status is CANCELLED or FAILED |
400 | Cannot add contacts while the campaign is paused. Resume the campaign first. | Campaign status is PAUSED |
400 | Contact found by email already has a different identifier for this campaign channel | Email lookup found a contact with a conflicting channel identifier |
400 | Contact does not have a valid channel identifier for this campaign channel | The resolved contact has no valid identifier for the campaign’s channel |
401 | — | Missing or invalid API key |
403 | Campaigns feature is not available in your current plan | The Campaigns feature is not enabled on your subscription |
404 | Campaign not found | The campaignId does not exist in your workspace |