ZevCampaign
Email marketing, built around consent.
Collect subscribers from your own site, keep their permission straight, and send newsletters people actually asked for. Transactional mail is its sibling, ZevSend.
The loop
One endpoint takes a signup from a browser. Everything that makes it trustworthy happens behind it.
// A signup form on your own site. Publishable key, safe in the browser.
await fetch('https://api.zevcampaign.com/v1/subscribe', {
method: 'POST',
headers: {
Authorization: 'Bearer pk_live_...',
'Content-Type': 'application/json',
},
body: JSON.stringify({
topic_id: 'tp_7xk2m9qv4w',
email: 'ada@example.com',
first_name: 'Ada',
}),
});
// { "data": { "status": "confirmation_sent" } }
//
// We email Ada a confirmation link from YOUR brand. When she clicks
// it, the subscription becomes real and your webhook fires. Until
// then she is not on the list and no campaign reaches her. And when they leave
An unsubscribe changes who you may contact everywhere, not just here. That is what webhooks are for.
// Your server, when somebody leaves.
app.post('/webhooks/zevcampaign', express.raw({ type: 'application/json' }), (req, res) => {
if (!verifySignature(req)) return res.sendStatus(401);
res.sendStatus(200);
const event = JSON.parse(req.body.toString('utf8'));
if (event.type === 'contact.unsubscribed') {
// scope is 'topic', 'brand' or 'all' — read it. Treating a
// single-topic opt-out as a global one loses you a subscriber
// who wanted to stay on everything else.
await crm.recordOptOut(event.data.email, event.data.scope);
}
}); Quickstart
A form on your site to a confirmed subscriber, in about five minutes.
Start hereCore concepts
Contacts, topics, lists and brands — and why topics are the one that matters.
Understand the modelAPI reference
Every endpoint, every error code, with the conventions stated once.
Read the referenceWebhooks
Hear about subscribes, unsubscribes, bounces and campaign progress.
Receive eventsBuilding with an AI agent
Every page here has a machine-readable twin. Point your model at
/llms.txt
for an index, or append
.md
to any URL for that page's clean markdown.