ZevCampaign Docs
Sign up

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 here

Core concepts

Contacts, topics, lists and brands — and why topics are the one that matters.

Understand the model

API reference

Every endpoint, every error code, with the conventions stated once.

Read the reference

Webhooks

Hear about subscribes, unsubscribes, bounces and campaign progress.

Receive events

Building 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.

What to tell your agent