Kerne-API'er
Afsendelse af beskeder
Alle felter POST /v1/messages/send accepterer, kanal-fallback, og hvordan frekvensgrænser pr. kategori fungerer.
POST /v1/messages/send er det ene endpoint til alle kanaler.
Påkrævede felter
to, channel (én af sms, rcs, whatsapp, email, voice) og message er påkrævet — eller send et channels-array i stedet for channel/fallback (se nedenfor).
Kanal-fallback
Angiv en ordnet fallback-liste, eller det nyere channels-array med primær kanal først:
{
"to": "+4512345678",
"channels": ["whatsapp", "sms"],
"message": "Din ordre er afsendt."
}
Hvis WhatsApp-levering fejler, forsøger platformen automatisk igen via SMS — uden et separat API-kald.
Kanal-specifikke felter
- Email: sæt
subject, oghtmlmessage(eller det ældre aliashtml) til HTML-body'en.messageer plain-text-fallbacken. - WhatsApp: send et
whatsapp-objekt, fx{ "template": "order_shipped" }, til skabelonbeskeder uden for 24-timers sessionsvinduet. - Voice: send et
voice-objekt (fx{ "voice": "female", "language": "da-DK" }) til TTS-parametre. - Afsender-ID:
senderskal være et afsender-ID godkendt i Indstillinger → Afsender-ID'er til SMS/RCS — medmindre jeres konto harallow_unverified_senderaktiveret til systemintegrationer.
Reply-To, afsendernavn og egne headers
Tre valgfrie email-felter:
reply_to— hvor svar skal havne. Enten en ren adresse (support@jeresfirma.dk) eller formen med visningsnavn (Support <support@jeresfirma.dk>); adressedelen valideres som en email. Feltet er bevidst ikke domænelåst — Reply-To er ikke envelope-afsenderen, så I kan sende svar til enhver indbakke, I selv kontrollerer.from_name— visningsnavnet i From, sat uafhængigt af From-adressen.headers— et objekt med header-navn → værdi, fx{ "X-Order-Id": "10432" }. Navne skal matche[A-Za-z0-9][A-Za-z0-9-]*.
headers er en safelist, ikke passthrough. Disse navne er reserverede og kan ikke sættes: List-Unsubscribe, List-Unsubscribe-Post, From, Sender, Return-Path, Reply-To, DKIM-Signature, Received, og alt der starter med X-WeZend — alle matchet uden hensyn til store/små bogstaver. De beskytter overholdelse af one-click-afmelding, email-autentificering og envelope-identitet. Reply-To er reserveret, fordi det har sit eget validerede reply_to-felt; en rå header ville omgå den validering.
Et reserveret navn afvises og droppes ikke i stilhed, og fejlen navngiver den pågældende header:
{
"to": "kunde@example.com",
"channel": "email",
"subject": "Jeres kvittering",
"message": "Tak for din ordre.",
"headers": { "List-Unsubscribe": "<mailto:opt-out@example.com>" }
}
{ "error": "Header \"List-Unsubscribe\" is reserved and cannot be set" }
Alle tre felter gemmes i beskedens send_options, så de overlever køen.
Planlægning og pr.-besked-webhooks
scheduled_at (ISO-tidsstempel) udsætter afsendelsen. webhook_url modtager leveringsstatusopdateringer for netop denne besked — se Webhooks.
Frekvenslofter for marketing
Send en category med (fx "newsletter") for at lade denne afsendelse tælle mod den pågældende kategoris frekvensloft, som konfigureres kontodækkende i messaging policy — uafhængigt af det globale loft på tværs af kanaler og af eventuelle lofter pr. kanal.
Transaktionelle afsendelser
Send transactional: true (boolean, eller strengen "true") for at markere en afsendelse som transaktionel — en nulstilling af adgangskode, en kvittering, en opt-in-bekræftelse. Standarden er false: en almindelig afsendelse er marketing.
Transaktionel mail er undtaget marketing-loftet for jeres bånd. Over loftet afregnes den pr. besked som overage i stedet for at blive afvist med quota_exceeded, så en tung kampagnemåned ikke kan sætte jeres adgangskode-mails helt i stå. Den tælles fortsat, så volumen forbliver synlig i forbrugsrapporteringen, og flaget gemmes på beskedrækken — det overlever køen og eventuelle genforsøg.
Der findes præcis ét kvote-tilfælde, hvor transaktionel mail stadig blokeres: en free-plan uden kort tilknyttet, hvor der ikke er nogen måde at afregne overage. region_blocked og payment_method_required er ikke kvotebeslutninger, så transactional tilsidesætter heller ikke dem.
transactional: true undtager desuden afsendelsen fra frekvenslofter og stilletimer.
Alle fire pr.-besked-felter — transactional, reply_to, from_name og headers — accepteres også pr. element i POST /v1/messages/bulk. Der fejler en ugyldig reply_to eller et reserveret header-navn kun det pågældende element (det tælles i failed) i stedet for at afvise hele batchen.
Response
{
"message_id": "3fa1e2c0-...",
"status": "queued",
"channel": "sms",
"to": "+4512345678",
"cost": 0.045,
"currency": "EUR",
"created_at": "2026-07-08T10:00:00.000Z"
}
En 402 betyder utilstrækkelig saldo eller manglende betalingsmetode; 403 betyder at kontoen er suspenderet, afventer aktivering, eller at afsender-ID'et ikke er godkendt; 409 betyder at modtageren er afmeldt den kanal.
Byg forespørgslen
Udfyld de felter du har brug for, og kopiér forespørgslen i cURL, Node, Python eller PHP — den bygger koden, den sender ingenting.
På SMS og RCS skal dette være et afsender-ID godkendt under Indstillinger → Afsender-ID'er — en ikke-godkendt værdi afvises med 403. Lad feltet stå tomt for at bruge kontoens standard, som altid virker.
Tomme felter udelades af forespørgslen. Email-felter vises når kanalen er email.
curl https://api.wezend.com/v1/messages/send \
-H "X-API-Key: $WEZEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+4512345678",
"channel": "sms",
"message": "Hello from WeZend"
}'Én platform. Hver eneste kundeinteraktion.
Erstat dit kludetæppe af messaging-API'er, CDP og automatiseringsværktøjer med én engagement-platform bygget til skala.
Intet kreditkort · EU-datalagring · 99,99 % oppetids-SLA