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.
{
"campaign": {
"uid": "abc123",
"name": "Welcome",
"subject": "Hi friend",
"status": "ready",
"track_open": true,
"created_at": "...",
"links": {
"self": "/api/v1/..."
}
}
}
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.
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.
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 →
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.
Each Senddera install hosts its own API at /api/v1/. Replace your-senddera.com with your installation hostname.
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.
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.
Resources are created with POST. The required body fields for a mailing list are name, from_email, from_name, subject, plus a contact block.
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.
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.
| 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. |
| 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. |
| 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 →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.
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"
}
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.
{
"message": "The given data was invalid.",
"errors": {
"sender_email": [
"The sender_email field is required."
],
"subject": [
"The subject must be at least 10 characters."
]
}
}
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 -H "Authorization: Bearer $TOKEN" \
$BASE/api/v1/customers \
| jq .data[].name
$response = Http::withToken($token)
->get("$base/api/v1/customers");
return $response->json();
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.
One-time license. Full source. Self-hosted endpoint. The API is included — no add-on, no rate plan.
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-timeSelf-hosted email marketing built on Laravel. Full source code, unlimited emails, your server. Try the demo