REST API • V1

One token.
Every endpoint.

A clean, resource-oriented HTTP API for campaigns, lists, subscribers, automations, sending servers, and customer billing. Authenticate with a single token, query JSON, ship in minutes. The same API plugins use is the same API external clients use — no second-class endpoints.

WHAT YOU CAN BUILD
SaaS Frontend
Mobile App
CRM Sync
Automation Triggers
Reseller Dashboards
GET /api/v1/campaigns
{
  "campaign": {
    "uid": "abc123",
    "name": "Welcome",
    "subject": "Hi friend",
    "status": "ready",
    "track_open": true,
    "created_at": "...",
    "links": {
        "self": "/api/v1/..."
    }
  }
}
WHY THIS API

No surprises. No second-class endpoints. The same API your plugins use.

Token-authenticated

Every request carries a single bearer token. Generated per user from Profile → API token. Pass via Authorization: Bearer header or api_token query string. Revoke and rotate at any time.

Resource-oriented

Every concept is a resource with predictable verbs. GET /lists returns the collection, POST /lists creates one, PATCH /lists/:uid updates, delete removes. Sub-resources nest naturally: /lists/:uid/subscribers.

Same as plugins use

There is no internal-vs-external split. The endpoints Senddera's own UI hits, the endpoints your plugins extend, and the endpoints your external clients read — identical. See the plugin SDK →

Self-hosted endpoint

The base URL is on your own server — https://your-senddera.com/api/v1/. No vendor proxy, no shared rate limit, no per-request fee. Throughput is whatever your hardware ships in core.

QUICK START

From zero to first response in four steps.

Each Senddera install hosts its own API at /api/v1/. Replace your-senddera.com with your installation hostname.

Step 1

Generate a token

Sign in to your Senddera install. Open your profile menu and click API token. Copy the value — it is unique per user and tied to that user's permissions.

# In your shell: export SENDDERA_BASE="https://your-senddera.com/api/v1" export ACELLE_TOKEN="your-token-here"
Step 2

Verify the token

Hit /me. If the token is valid you get back your user record. If not, you get a 401 — check the token and base URL.

$ curl $SENDDERA_BASE/me \ -H "Authorization: Bearer $ACELLE_TOKEN" { "id": 1, "email": "you@...", "uid": "..." }
Step 3

Create a list

Resources are created with POST. The required body fields for a mailing list are name, from_email, from_name, subject, plus a contact block.

# POST a JSON list payload...
Step 4

Add a subscriber

Use the list's UID from Step 3. Custom fields are passed as uppercase params (FIRST_NAME, LAST_NAME, ...) matching your list's field configuration.

$ curl -X POST $SENDDERA_BASE/subscribers \ -H "Authorization: Bearer $ACELLE_TOKEN" \ -d list_uid="abc123yz" \ -d EMAIL="alice@example.com" \ -d FIRST_NAME="Alice" \ -d tag=newsletter,beta
RESOURCES

Eight resources. Forty-plus endpoints. Every verb you'd expect.

All endpoints below are namespaced under /api/v1/ and require auth:api token authentication unless marked otherwise. Lifecycle actions (run, pause, resume) are surfaced as POST sub-routes. Log downloads stream the underlying CSV.

Authentication Global

VERB PATH DESCRIPTION
POST /user/login Exchange email + password for an API token. Public endpoint.
GET /me Returns the authenticated user's record. Use this to verify a token.

Lists Collection

GET /lists Paginated index of lists owned by the token's user.
POST /lists Create a new list. Required: name, from_email, from_name, subject + contact block.
GET /lists/:uid Fetch a single list with its fields and stats.
PATCH /lists/:uid Update list metadata, sender identity, or opt-in settings.

Subscribers Entity

GET /subscribers?list_uid=... Paginated index. Filter with open=yes, click=yes|no.
POST /subscribers Create. Required: list_uid, EMAIL. Custom fields as uppercase params.
PATCH /subscribers/:uid Update fields, tags, or status (active, unsubscribed, etc).

This is a summary of our primary endpoints. For the exhaustive list including Campaigns, Automations, Sending Servers, and Customer management, please visit our executable reference.

View Executable Reference →
WEBHOOKS

Push events out, instead of polling for them.

Senddera ships two webhook surfaces. Lifecycle webhooks fire on customer + subscription + automation transitions and are configured globally. Per-recipient tracking pings fire on opens / clicks / unsubscribes and are configured per-campaign. Both retry on failure with exponential backoff.

Example: Subscription Ping
POST /your-webhook-url
Content-Type: application/json
X-Senddera-Event: new_subscription
X-Senddera-Signature: sha256=...

{
  "event": "new_subscription",
  "customer_id": 1234,
  "plan_id": "extended-monthly",
  "fired_at": "2026-05-14T19:51:48Z"
}
RESPONSES & ERRORS

Predictable JSON.
Conventional status codes.

Every successful response is JSON. Every yard for failure is JSON, with a top-level message and a errors Map for validation failures. Status codes follow REST convention — you can branch your client on the code alone.

200 OK Successful read or update.
201 Created Successful create.
401 Unauth Missing or invalid token.
422 Unproc Validation error. Check errors map in body.
HTTP/1.1 422 Unprocessable Entity
{
  "message": "The given data was invalid.",
  "errors": {
    "sender_email": [
      "The sender_email field is required."
    ],
    "subject": [
      "The subject must be at least 10 characters."
    ]
  }
}
CLIENTS

Any HTTP client. No proprietary SDK.

There is no official Senddera SDK. The API speaks JSON over HTTP — reach for whatever client your stack already has. Three of the most common in practice:

CURL • ONE-LINERS
curl -H "Authorization: Bearer $TOKEN" \
$BASE/api/v1/customers \
| jq .data[].name
LARAVEL HTTP CLIENT
$response = Http::withToken($token)
    ->get("$base/api/v1/customers");

return $response->json();
BROWSER • NODE FETCH
const res = await fetch(`${base}/me`, {
    headers: { Authorization: `Bearer ${token}` }
});

const data = await res.json();

Building an open-source SDK? Email us — we'll link it from this page.

Run Senddera. Get a token. Make a call.

One-time license. Full source. Self-hosted endpoint. The API is included — no add-on, no rate plan.

RESOURCES & COMMUNITY

Build with the API, ship as a plugin,
ask when you're stuck.

For Developers

Plugin SDK, Hook system, Hello World plugin in 5 minutes, and 14 extension surfaces with real production examples.

/developers →

Full API Reference

Live, executable reference for every endpoint — parameters, returns, working curl snippets, schema.

api.senddera.com →

Knowledge Base

Setup, deliverability, sending-server config, ship as v2.10 upgrade guide, and server-side billing.

senddera.com/kb →

Run your email marketing on your own server, your own terms

Join thousands of companies that have taken control of their email marketing with full source code, no recurring fees, and unlimited sending. $199 one-time license, lifetime updates.

Get Senddera — $199 one-time

Self-hosted email marketing built on Laravel. Full source code, unlimited emails, your server. Try the demo