API-Referenz
Jeder Endpoint, den ein API-Key aufrufen kann — generiert aus den Routendefinitionen der Plattform selbst.
92 Endpoints in 13 Bereichen. Diese Liste wird aus den Routendefinitionen der Plattform generiert, kann also keinen Endpoint beschreiben, der nicht existiert — sie ist aber eine Momentaufnahme vom 2026-09-04, keine Live-Ansicht. Endpoints, die nur mit Dashboard-Session funktionieren, fehlen absichtlich: ein API-Key antwortet dort mit 401, und die Guides sagen, welche Bereiche das sind.
Basis-URL: https://api.wezend.com
API key heißt, dass X-API-Key genügt. API key or login heißt, dass derselbe Endpoint auch eine Dashboard-Session akzeptiert — die nutzt die eigene UI des Produkts.
/v1/events
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
POST | /v1/events | API key | single event OR { events: [...] } / a bare array for batch. |
/v1/mcp
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
POST | /v1/mcp | API key | MCP endpoint (streamable-HTTP style: single JSON-RPC request → single JSON response). |
POST | /v1/mcp/act | API key | Plain REST for a ChatGPT GPT Action: { tool, arguments }. |
/v1/webhook-endpoints
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/webhook-endpoints | API key or login | list + the catalogue of subscribable events |
POST | /v1/webhook-endpoints | API key or login | { url, events? } — creates + returns the signing secret ONCE |
DELETE | /v1/webhook-endpoints/:id | API key or login | |
PATCH | /v1/webhook-endpoints/:id | API key or login | { url?, events?, status? } |
POST | /v1/webhook-endpoints/:id/test | API key or login | deliver a ping |
Account
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
POST | /v1/account/ai-assist | API key or login | per-block text assist for the email builder (F2). action ∈ rewrite|shorten|lengthen|friendly|professional|fix|generate|subjects. Always responds (degrades gracefully without an AI key), so the ✨ menu never dead-ends. |
POST | /v1/account/ai-coach-request | API key or login | customer asks to enable the paid add-on |
GET | /v1/account/ai-coach-status | API key or login | is the coach enabled / requested? |
POST | /v1/account/ai-recommendations | API key or login | personalised marketing advice (cached daily) Paid add-on: only available to customers with ai_coach_enabled. |
POST | /v1/account/ai-write | API key or login | generate a full email from a brief |
POST | /v1/account/ai-writer-request | API key or login | |
GET | /v1/account/ai-writer-status | API key or login | |
GET | /v1/account/analytics | API key or login | |
GET | /v1/account/balance | API key or login | |
GET | /v1/account/billing-currency | API key or login | current currency + available options |
PUT | /v1/account/billing-currency | API key or login | |
PUT | /v1/account/billing-details | API key or login | customer chooses their invoice/billing currency. Converts any existing balance to the new currency at the effective rate. PUT /v1/account/billing-details — company/tax details used on invoices |
GET | /v1/account/brand-voice | API key or login | current profile |
PUT | /v1/account/brand-voice | API key or login | set (or clear with null/{}) |
GET | /v1/account/channel-deliverability | API key or login | delivery/failure rates for EVERY channel (sms/rcs/whatsapp/voice/email + push), not just email reputation. |
GET | /v1/account/deliverability | API key or login | bounce/complaint rates + health from the email feedback loop (the deliverability signals the platform already captures). |
GET | /v1/account/email-domains | API key or login | list domains + their DNS records |
POST | /v1/account/email-domains | API key or login | add a domain to verify |
DELETE | /v1/account/email-domains/:id | API key or login | |
PUT | /v1/account/email-domains/:id/bimi | API key or login | { logo_url } — set/clear the BIMI SVG logo. |
POST | /v1/account/email-domains/:id/check-signing | API key or login | the ONLY honest DKIM confirmation. /verify above resolves DNS. It cannot see whether the outbound relay actually signs, and presenting those two as one green tick is exactly what let an account show "DKIM verified" while its delivered mail carried no DKIM-Signature header at all. The definitive test is the one a customer spelled out for us: send a mail to an address you can read, open "show original", and look for a DKIM-Signature with d=<your domain>. This endpoint takes those pasted headers and answers it — no guessing, no DNS inference — and records the verdict against the domain so the dashboard stops claiming more than it knows. Body: { headers: "<raw header blob or JSON map>", authentication_results?: "<optional>" } |
GET | /v1/account/email-domains/:id/dmarc | API key or login | recent reports + rollup for a domain |
POST | /v1/account/email-domains/:id/dmarc | API key or login | Upload a DMARC aggregate (rua) XML report — parsed to a pass/fail-alignment summary so the customer sees spoofing / auth failures on their sending domain. POST /v1/account/email-domains/:id/dmarc { xml } |
GET | /v1/account/email-domains/:id/dmarc/readiness | API key or login | can THIS domain move to p=quarantine? The same four criteria the platform holds itself to, asked for one customer's domain. Answers the decision rather than the data: a table of source IPs is not what tells someone whether it is safe to ask receivers to quarantine their own mail. It also hands back the two records to publish. The second one — RFC 7489 §7.1's external destination authorisation — is the step people miss, and missing it means Google and Microsoft refuse to send anything at all, silently. It is returned next to the first, not in a footnote. |
POST | /v1/account/email-domains/:id/verify | API key or login | run live DNS checks |
POST | /v1/account/email-domains/:id/warmup | API key or login | { action: start|pause|resume|stop } While active, marketing email beyond the day's cap is held (21-day ramp, no cron). |
GET | /v1/account/link-domains | API key or login | list with the CNAME record + the target host |
POST | /v1/account/link-domains | API key or login | { domain } |
DELETE | /v1/account/link-domains/:id | API key or login | |
POST | /v1/account/link-domains/:id/verify | API key or login | live DNS (CNAME) check |
GET | /v1/account/list-growth | API key or login | subscriber growth over time |
GET | /v1/account/me | API key or login | works with both X-API-Key and Bearer JWT |
GET | /v1/account/plan | API key or login | current tier/band, included volumes (annual-adjusted), this month's usage, region mode and the self-serve upgrade options. |
GET | /v1/account/pricing | API key or login | Returns ONLY sell prices — never cost prices |
POST | /v1/account/spam-check | API key or login | { subject, html, text } → { score, rating, issues } |
GET | /v1/account/tracking-identity | API key or login | the secret your BACKEND signs contact identifiers with, so the browser SDK can prove a visitor is a particular contact. Needs the settings capability. |
PUT | /v1/account/tracking-identity | API key or login | { require_identity: boolean }. Turning it off lets anyone holding the public tracking key name any contact, so the response says so. |
POST | /v1/account/tracking-identity/rotate | API key or login | issue a new identity secret, invalidating every user_hash already computed with the old one. |
GET | /v1/account/tracking-key | API key or login | the customer's public, write-only tracking key plus the ready-to-paste <script> snippet for the browser SDK. Created on first request. |
PUT | /v1/account/tracking-origins | API key or login | restrict which website origins may use the key (e.g. ["https://shop.example.com"]). Empty list = accept any origin. |
GET | /v1/account/usage | API key or login |
Account — Unsubscribes
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/account/unsubscribes/api/list | API key or login | a customer's own suppressions. flexAuth, not requireAuth: this was JWT-only, so a customer's BACKEND could not read it — only a signed-in browser could. That left the contact.unsubscribed webhook as the single way to get opt-outs into their own consent records, with no way to reconcile if their endpoint was down. Reported by a customer on 2026-08-31, and they were right that it made the webhook a single point of failure for data they are obliged to keep. requireCapability("read") covers both callers: an API key must carry the read scope, a dashboard user must have a role that allows reads. It is the customer's own suppression list either way. |
Contacts
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/contacts | API key or login | list contacts |
POST | /v1/contacts | API key or login | create a single contact manually (e.g. to send a test) |
DELETE | /v1/contacts/:id | API key or login | |
PATCH | /v1/contacts/:id | API key or login | PATCH /v1/contacts/:id — update a contact (standard fields + custom fields) |
GET | /v1/contacts/fields | API key or login | list this customer's custom field definitions |
POST | /v1/contacts/fields | API key or login | define a new custom field |
DELETE | /v1/contacts/fields/:id | API key or login | remove a field definition (existing data on contacts is kept) |
POST | /v1/contacts/import | API key or login | upload CSV |
Conversations
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/conversations | API key or login | |
PATCH | /v1/conversations/:id | API key or login | |
GET | /v1/conversations/:id/messages | API key or login | |
POST | /v1/conversations/:id/reply | API key or login |
Integrations
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
POST | /v1/integrations | API key or login | create integration (accepts JWT or API key) Uses flexAuth middleware that tries API key first, then JWT |
Lists
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/lists | API key or login | |
POST | /v1/lists | API key or login | |
DELETE | /v1/lists/:id | API key or login | |
GET | /v1/lists/:id | API key or login | |
PATCH | /v1/lists/:id | API key or login | |
POST | /v1/lists/:id/contacts | API key or login | add a single contact to list |
DELETE | /v1/lists/:id/contacts/:contactId | API key or login | |
PATCH | /v1/lists/:id/favorite | API key or login | pin/unpin a list to the top |
POST | /v1/lists/:id/import | API key or login | import CSV into this list |
Messages
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
DELETE | /v1/messages/:id | API key or login | A send with scheduled_at in the future is stored as status='scheduled' (see processOutboundMessage) — but this endpoint only accepted 'queued', so the one thing it exists for, cancelling a scheduled message, answered "Message already sent — cannot cancel". Both pre-dispatch states are cancellable now, claimed atomically so a message the scheduled worker or queue worker has already picked up can't be cancelled from under it. |
GET | /v1/messages/:id | API key or login | flexAuth, not requireApiKey: the dashboard is a first-class client of its own API, and an API-key-only status/cancel pair meant a signed-in user could see a scheduled message in the history but had no way to look it up or stop it. Matches /history and /:id/timeline. |
POST | /v1/messages/:id/resend | API key or login | Creates a NEW message to the same recipient with the same content. |
GET | /v1/messages/:id/timeline | API key or login | |
POST | /v1/messages/bulk | API key or login | Send up to 10,000 messages in one call. Each item accepts the same per-send options as /send (transactional, reply_to, from_name, headers); an item with an invalid value is counted failed. |
GET | /v1/messages/history | API key or login | Must be defined BEFORE GET /:id so "history" isn't captured as an :id. |
POST | /v1/messages/send | API key or login | Send one message. Body: to, channel, message. `message` (plain text) is ALWAYS required — even for email, where it is the text/plain alternative; add `htmlmessage` (+ `subject`) for the HTML body. A body with only `htmlmessage` and no `message` is rejected with 400. Optional: transactional (bool — exempt from the marketing quota cap), reply_to, from_name and headers (email; headers are safelisted — reserved names are rejected with 400). |
POST | /v1/messages/send-by-tag | API key |
Segments
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/segments | API key or login | list all segments (with a live contact count each) |
POST | /v1/segments | API key or login | create |
DELETE | /v1/segments/:id | API key or login | |
PUT | /v1/segments/:id | API key or login | update |
GET | /v1/segments/:id/contacts | API key or login | resolve to actual contacts (preview the members) |
POST | /v1/segments/preview | API key or login | count matches for a rule set WITHOUT saving (live preview) |
GET | /v1/segments/schema | API key or login | the fields + operators the builder can offer |
Sender
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/sender/rules | API key | |
POST | /v1/sender/validate | API key |
Senders
| Methode | Pfad | Auth | Was er tut |
|---|---|---|---|
GET | /v1/senders | API key or login | |
POST | /v1/senders | API key or login | |
DELETE | /v1/senders/:id | API key or login |
Eine Plattform. Jede Kundeninteraktion.
Ersetzen Sie Ihren Flickenteppich aus Messaging-APIs, CDP und Automatisierungstools durch eine Engagement-Plattform, die für Skalierung gebaut ist.
Keine Kreditkarte · EU-Datenhaltung · 99,99 % Uptime-SLA