Connect Bulko to your process
REST API for campaigns and data, IMAP sync for replies, separate SMTP Access, and setup guides for popular SMTP providers.
Basic primitives
Three ways to interact with the platform. Choose whichever suits your task best.
REST API
Push model. Create campaigns, import subscribers, read statistics. JSON-only, Bearer-token authorization.
Go to documentationJSON import
Add addresses to an existing list or create a new one. Invalid and unsubscribed addresses are skipped.
API ExampleIMAP Reply-Sync
Connect IMAP to each SMTP. Bulko retrieves responses every 5 minutes and classifies them using AI. Nothing needs to be done manually.
IMAP configurationCode samples
Launch a campaign from any language
Minimal example: creating a campaign and starting the send. Input — a list of emails and a template. Output — campaign_id and the statistics dashboard URL.
/api/v1/campaigns/launchCreate and launch a campaign/api/v1/campaigns/{id}/statsCampaign statistics/api/v1/subscribers/importImport Addresses (JSON)/api/v1/replies/?status=positiveReply list with filters/api/v1/smtp/accessesSMTP Access Limits/api/v1/account/balanceEmail and AI creditsThe API token is generated in your profile settings. Rate limit: 60 requests/min per token.
# Launch a campaign curl -X POST 'https://bulko.io/api/v1/campaigns/launch' \ -H 'Authorization: Bearer YOUR_API_TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "name": "Q2 Outreach", "subject": "{Hi|Hello} {{name}}", "body": "<p>Hi {{name}}, ...</p>", "subscriber_list_id": 42, "ai_rotation": true }'
import requests resp = requests.post( "https://bulko.io/api/v1/campaigns/launch", headers={"Authorization": f"Bearer {API_TOKEN}"}, json={ "name": "Q2 Outreach", "subject": "{Hi|Hello} {{name}}", "body": "<p>Hi {{name}}, ...</p>", "subscriber_list_id": 42, "ai_rotation": True, }, ) campaign = resp.json() print("Campaign", campaign["id"], "started")
const resp = await fetch( 'https://bulko.io/api/v1/campaigns/launch', { method: 'POST', headers: { 'Authorization': `Bearer ${API_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ name: 'Q2 Outreach', subject: '{Hi|Hello} {{name}}', body: '<p>Hi ...</p>', subscriber_list_id: 42, ai_rotation: true, }), } ); const campaign = await resp.json(); console.log('Campaign', campaign.id, 'started');
$ch = curl_init('https://bulko.io/api/v1/campaigns/launch'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $API_TOKEN, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'name' => 'Q2 Outreach', 'subject' => '{Hi|Hello} {{name}}', 'body' => '<p>Hi ...</p>', 'subscriber_list_id' => 42, 'ai_rotation' => true, ]), ]); $campaign = json_decode(curl_exec($ch), true);
Webhooks are the next API stage
Outbound webhooks are not currently available in production. The events below are planned after the REST API is stabilized. For current automation, poll the statistics and replies endpoints.
deliveredThe email was successfully accepted by the recipient's SMTP server. Contains campaign_id, recipient, smtp_used, timestamp.
openedThe recipient opened the email. Unique opens (one event per address).
clickedClick on a link. Contains url, recipient, and campaign_id.
repliedA reply was received. Contains body, AI classification (positive/negative/question), confidence.
bouncedBounce. Contains SMTP error code (550, 553, 421...) and raw bounce-reason.
unsubscribedThe recipient clicked the unsubscribe link. The email is added to the global suppression list.
// Planned "replied" payload — not yet a production API { "event": "replied", "campaign_id": 142, "recipient": "[email protected]", "reply": { "subject": "Re: Quick question", "body": "Sounds great, when can we talk?", "received_at": "2026-05-09T14:32:11Z", "ai_classification": "positive", "ai_confidence": 0.94 }, "timestamp": "2026-05-09T14:32:14Z" }
Payment gateways
Optimal payment methods for each region. All providers process payments on their end; Bulko does not store card details.
Stripe
Visa / Mastercard / Apple Pay / Google Pay. All international cards.
USDC
Crypto payments with extended stablecoin support.
No-code and CRM
You can call the REST API through a generic HTTP Request/Webhooks action. Bulko does not yet have listed apps in these service directories.
Use Webhooks by Zapier to POST to the address import and campaign launch endpoints.
The HTTP Request node gives full control over the JSON body and can periodically retrieve statistics and replies.
Connect your CRM to the REST API through its built-in HTTP actions or an intermediate Zapier/n8n workflow. This is not a native integration.
Need a custom integration?
Describe your task — we'll help you choose the best approach. SDK examples for Python and Node.js on request.