WhatsApp Templates API
WhatsApp-beskedskabeloner er forudskrevne beskeder, der er godkendt til afsendelse uden for det normale 24-timers samtalevindue — for eksempel en velkomstbesked, en aftalepåmindelse eller et lille puf til genaktivering. Denne API giver dig mulighed for programmatisk at liste, oprette, redigere, indsende, kontrollere, slette og sende skabeloner.
Alle stier herunder er relative til API’ets base-URL:
https://api.youraiconnector.com/v1
Enhver anmodning skal godkendes. Se Godkendelse for de fire accepterede metoder. Eksemplerne på denne side bruger X-API-Key-headeren (og én forespørgselsparameter-form til cURL).
Bemærk: Skabeloner kører på WhatsApp Business API-kanalen, så denne del af API’en kræver både API-adgang og en plan, der inkluderer WhatsApp-kanaler. Uden disse vil anmodninger blive afvist med en 403.
Arbejde med underkonti (bureauer)
Godkendelsesstatusser
Da beskeder, der sendes uden for en åben samtale, først skal gennemgås af WhatsApp, har hver skabelon en godkendelses-status:
| Status | Betydning |
|---|---|
draft |
Oprettet eller gemt, men endnu ikke sendt til gennemsyn. Du kan stadig redigere den. |
received |
Indsendt og accepteret i køen til gennemsyn. |
pending |
Under gennemsyn. |
approved |
Godkendt til afsendelse. |
rejected |
Afvist. Feltet rejection_reason forklarer hvorfor; ret det, og indsend derefter igen. |
Kun draft- og rejected-skabeloner kan redigeres eller (gen)indsendes. Når en skabelon er approved, er den låst — opret en ny, hvis du har brug for ændringer.
Automatisk godkendelse: Nogle kanaler kræver ikke et eksternt gennemsynstrin. Skabeloner, der oprettes eller indsendes til en kampagne på en sådan kanal, gemmes straks som
approveduden et indholds-id (sid).
Skabeloner på Meta-forbundne konti
Disse slutpunkter fungerer på samme måde, uanset hvilken WhatsApp-forbindelse din konto kører på, men hvad der sker bag dem, er forskelligt:
- På en administreret WhatsApp-forbindelse registreres skabeloner hos beskedudbyderen, og
sider udbyderens indholds-id (HXXXXXXXX…). - På en konto, hvis nummer kører på sin egen WhatsApp Business-konto (begge Meta-forbindelsesmuligheder), oprettes og gennemgås skabeloner i den pågældende WhatsApp Business-konto, og
sider Metas eget skabelon-id — en numerisk streng såsom"3394843740694756".statusbruger stadig værdierne i tabellen ovenfor, ogrejection_reasonindeholder stadig Metas forklaring.
Der findes to ekstra slutpunkter til dette: et til at spørge, hvilken forbindelse du er på, og et til at afstemme din skabelonliste med din WhatsApp Business-konto. Skabeloner, der allerede findes i WhatsApp Business-kontoen, importeres til dit bibliotek ved synkroniseringen, så en GET /whatsapp-templates bagefter viser dem som enhver anden skabelon.
Tjek hvilken forbindelse skabeloner kører på
GET /whatsapp-templates/provider
| Felt | Beskrivelse |
|---|---|
provider |
twilio når skabeloner er registreret hos den administrerede beskedudbyder, meta når de ligger i din egen WhatsApp Business-konto. |
lane |
Hvilken Meta-forbindelse der er i brug — meta_cloud_api (din egen Meta-app) eller meta_embedded (forbundet via vores Meta-app). null på en administreret forbindelse. |
waba_id |
Den WhatsApp Business-konto, som skabelonerne er oprettet i, eller null. |
templates_enabled |
false når Meta-forbindelsen endnu ikke er færdig (ingen WhatsApp Business-konto eller adgangstoken gemt). Oprettelse eller indsendelse af skabeloner fejler med en 400, indtil den er det. |
cURL
curl "https://api.youraiconnector.com/v1/whatsapp-templates/provider?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/provider", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/whatsapp-templates/provider",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"provider": "meta",
"lane": "meta_cloud_api",
"waba_id": "2357661648036355",
"templates_enabled": true
}
Synkroniser skabeloner fra Meta
Opdaterer godkendelsesstatus for hver skabelon, der ligger i din WhatsApp Business-konto, og importerer enhver skabelon, der findes der, men som endnu ikke er i dit bibliotek. Det er sikkert at kalde så ofte, du vil. På en administreret forbindelse er der intet at synkronisere, så kaldet gør intet og rapporterer blot, hvor mange skabeloner du har.
POST /whatsapp-templates/meta-sync
| Felt | Beskrivelse |
|---|---|
imported |
Skabeloner fundet i WhatsApp Business-kontoen, som blev tilføjet til dit bibliotek ved dette kald. |
updated |
Eksisterende skabeloner, hvis status eller detaljer er ændret. |
total |
Skabeloner i dit bibliotek efter synkroniseringen. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"provider": "meta",
"imported": 2,
"updated": 5,
"total": 12
}
Kommuniker direkte med Meta (avanceret)
Hvis du har brug for noget, som slutpunkterne ovenfor ikke eksponerer — skabelonoverskrifter, sidefødder, knapper eller en fuldt manuelt opbygget skabelon — sender /v1/meta-templates din anmodning direkte videre til Metas egen skabelon-API uden at gemme noget i dit skabelonbibliotek. Det virker kun på konti, hvis nummer kører på deres egen WhatsApp Business-konto; på en administreret forbindelse returnerer hvert kald 400 med anmodning om først at forbinde en Meta-app.
| Slutpunkt | Hvad det gør |
|---|---|
GET /meta-templates |
Lister skabelonerne på din WhatsApp Business-konto med deres seneste status. Tilføj ?name= for at filtrere til ét specifikt skabelonnavn. Returnerer { "success": true, "templates": [...] }. |
POST /meta-templates |
Opretter en skabelon og indsender den til Meta-gennemgang i ét trin. Kræver name, language og body (eller et komplet components-array i stedet for body). Valgfrit: variables (array af strenge), category (MARKETING, UTILITY eller AUTHENTICATION), header, footer, buttons. Returnerer 201 med { "success": true, "template": {...} }. |
DELETE /meta-templates/{name} |
Sletter skabelonen ud fra dens Meta-navn — alle sprog af den. Tilføj ?hsm_id= med Metas skabelon-id for kun at fjerne ét sprog. Returnerer { "success": true, "name": "..." }. |
En skabelon, som Meta afviser, returnerer 400 med Metas egen forklaring i error.
List skabeloner
Returnerer alle skabeloner på din konto med et let resumé af hver enkelt.
GET /whatsapp-templates
cURL
curl "https://api.youraiconnector.com/v1/whatsapp-templates?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/whatsapp-templates",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"data": [
{
"id": "template_abc123",
"name": "welcome_message",
"status": "approved",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!"
},
{
"id": "template_def456",
"name": "appointment_reminder",
"status": "pending",
"language": "en",
"body": "Hi {{first_name}}, this is a reminder about your appointment."
}
]
}
Hent en skabelon
Returnerer alle detaljer om en enkelt skabelon, herunder dens variabler, status og tidsstempler.
GET /whatsapp-templates/{templateId}
cURL
curl "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"template": {
"id": "template_abc123",
"name": "welcome_message",
"body": "Hi {{first_name}}, thanks for reaching out!",
"language": "en",
"variables": ["first_name"],
"status": "approved",
"sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"type": "general",
"category": "marketing",
"rejection_reason": null,
"campaign_id": "campaign123",
"date_created": "2026-06-01T10:00:00.000Z",
"date_updated": "2026-06-02T08:30:00.000Z",
"submitted_at": "2026-06-01T10:05:00.000Z",
"approved_at": "2026-06-02T08:30:00.000Z"
}
}
En skabelon, der ikke findes på din konto, returnerer 404 med { "success": false, "error": "Template not found" }.
Opret en skabelon
Opretter en skabelon til en kampagnes åbningsbesked og sender den til godkendelse i ét trin.
POST /whatsapp-templates
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
campaign_id |
Ja | Den kampagne, som skabelonen tilhører. |
name |
Ja | Et navn til skabelonen. |
language |
Ja | Sprogkode, for eksempel en, es, de, pt_BR, zh_CN. |
body |
Ja | Beskedteksten, op til 1024 tegn. |
variables |
Nej | Ordnet liste over variabelnavne, der bruges i brødteksten. |
Variabel-pladsholdere kan skrives som {{first_name}}, {first_name} eller [first_name] — de bliver alle normaliseret til formen med dobbelte krøllede parenteser.
Resultatet afhænger af kampagnens kanaler:
- WhatsApp Business API-kampagne: indholdet sendes til WhatsApp-gennemgang. Svaret indeholder
campaign_status(receivedellerpending) og entemplate_sid. - En kanal uden et eksternt gennemgangstrin: skabelonen gemmes og godkendes automatisk (
campaign_status: "approved",template_sid: null). - Ingen WhatsApp-kanal på kampagnen: intet oprettes, og
campaign_statusernot_applicable.
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": "campaign123",
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"]
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
campaign_id: "campaign123",
name: "welcome_message",
language: "en",
body: "Hi {{first_name}}, thanks for reaching out!",
variables: ["first_name"],
}),
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"campaign_id": "campaign123",
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"],
},
)
data = res.json()
Svar (sendt til gennemgang)
{
"success": true,
"campaign_status": "pending",
"template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Opret en selvstændig skabelon
Opretter en skabelon i dit skabelonbibliotek uden at knytte den til en kampagnes åbningsbesked. Dette er oprettelsestrinnet i den livscyklus, som resten af denne side følger: opret den her, rediger den, indsend den til gennemgang, forespørg om dens status, og slet den, når du ikke længere har brug for den.
POST /whatsapp-templates/docs
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
name |
Ja | Et navn til skabelonen. |
language |
Ja | Sprogkode, for eksempel en, es, de, pt_BR, zh_CN. |
body |
Ja | Beskedteksten, op til 1024 tegn. |
variables |
Nej | Ordnet liste over variabelnavne, der bruges i brødteksten. |
status |
Nej | draft (standard) gemmer den uden at indsende; submitted sætter den i kø til WhatsApp-gennemgang med det samme. |
type |
Nej | general (standard) eller smart_followup. |
category |
Nej | marketing, utility, authentication eller authentication-international. |
campaign_id |
Nej | Knytter skabelonen til en af dine kampagner. |
Skabeloner til godkendelse (engangskode). WhatsApp accepterer ikke fritekst-skabeloner til godkendelse: beskedteksten er foruddefineret af WhatsApp, og skabelonen skal indeholde en “kopiér kode”-knap. Når du opretter en skabelon med
category: "authentication", indsender vi den i den faste form for dig. Dinbodybevares som det eksempel, der vises i appen, men den tekst, din kontaktperson modtager, er WhatsApps egen ordlyd (koden, en sikkerhedspåmindelse og en note om, at den udløber om 10 minutter). Angiv præcis én variabel, for eksempel["code"], og send koden, når du sender beskeden (se feltetvariablesunder Send en skabelon til en kontaktperson). Koden skal være kortere end 15 tegn.
Hvilken oprettelse skal jeg bruge? Brug denne, når du ønsker en skabelon, som du selv kan redigere og indsende. Brug
POST /whatsapp-templates(ovenfor), når du vil indstille en kampagnes åbningsbesked — den krævercampaign_idog skriver direkte ind i kampagnen.
En skabelon oprettet som submitted sendes til WhatsApp-gennemgang i baggrunden, så tjek status-slutpunktet for resultatet i stedet for at forvente det i svaret.
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/docs?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"],
"status": "draft",
"category": "marketing"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/docs", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "welcome_message",
language: "en",
body: "Hi {{first_name}}, thanks for reaching out!",
variables: ["first_name"],
status: "draft",
category: "marketing",
}),
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/docs",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"],
"status": "draft",
"category": "marketing",
},
)
data = res.json()
Svar
{
"success": true,
"template_id": "template_abc123",
"status": "draft"
}
En manglende name, language eller body, et sprog der ikke understøttes, en status der ikke er draft eller submitted, en ukendt type eller category, eller en brødtekst på over 1024 tegn returnerer 400 med en forklarende error. En campaign_id, der ikke er en af dine kampagner, returnerer 404.
Opdater en skabelon
Redigerer en skabelon, der endnu ikke er blevet godkendt. Kun skabeloner med status draft eller rejected kan redigeres. Angiv en vilkårlig kombination af name, body, language og variables — kun de felter, du sender, bliver ændret.
PUT /whatsapp-templates/{templateId}
Redigering sender ikke skabelonen til gennemgang igen. Brug submit-endepunktet bagefter.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi {{first_name}}, here is an update for you.",
"variables": ["first_name"]
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
body: "Hi {{first_name}}, here is an update for you.",
variables: ["first_name"],
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"body": "Hi {{first_name}}, here is an update for you.",
"variables": ["first_name"],
},
)
data = res.json()
Svar
{
"success": true,
"template_id": "template_abc123"
}
Forsøg på at redigere en skabelon, der allerede er approved (eller på anden måde ikke kan redigeres), afsendelse af tomme felter eller afsendelse af en ugyldig værdi returnerer 400 med en forklarende error.
Indsend en skabelon til godkendelse
Indsender en draft- eller rejected-skabelon til gennemgang. Skabeloner på en kanal, der ikke kræver ekstern gennemgang, godkendes med det samme; alle andre sendes til WhatsApp, og den returnerede status (typisk received eller pending) gemmes på skabelonen.
POST /whatsapp-templates/{templateId}/submit
Opfølgningsskabeloner skal deklarere og bruge deres påkrævede variabler, før de kan indsendes: en pladsholder til fornavn samt en pladsholder til personlig kontekst for smarte opfølgninger.
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"template_id": "template_abc123",
"status": "pending",
"sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Tjek godkendelsesstatus
Et letvægts-endepunkt til polling af en skabelons aktuelle status. Status læses fra den gemte post, som opdateres periodisk i baggrunden, så en meget nylig godkendelse eller afvisning kan tage et kort øjeblik om at blive vist.
GET /whatsapp-templates/{templateId}/status
cURL
curl "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"template_id": "template_abc123",
"name": "welcome_message",
"status": "approved",
"sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"rejection_reason": null,
"date_updated": "2026-06-02T08:30:00.000Z"
}
Slet en skabelon
Fjerner skabelonposten fra din konto.
DELETE /whatsapp-templates/{templateId}
Vigtigt: Ved en administreret forbindelse fjernes kun den gemte post – indhold, som WhatsApp allerede har godkendt, kan forblive registreret hos beskedudbyderen. På en konto, der kører på sin egen WhatsApp Business-konto, slettes skabelonen også fra den konto. Uanset hvad, hvis en kampagne stadig bruger denne skabelon, skal du omdirigere kampagnen til en anden skabelon, før du sletter, ellers vil afsendelser, der er afhængige af den, fejle.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"template_id": "template_abc123",
"note": "The template record was removed from your account. Content already approved by WhatsApp may remain registered with the messaging provider."
}
Send en skabelon til en kontakt
Sender en godkendt skabelon til en kontakt, selv når der ikke er nogen åben samtale — dette genåbner chatsessionen. Du kan målrette kontakten via contactId eller via phoneNumber, og vælge skabelonen via whatsappTemplateId eller via templateName.
POST /whatsapp-templates/send
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
contactId |
En af disse to | Kontaktpersonens ID. |
phoneNumber |
En af disse to | Kontaktpersonens telefonnummer (med landekode, ingen mellemrum). Slås op eller oprettes efter behov. |
whatsappTemplateId |
En af disse to | Skabelonens ID. |
templateName |
En af disse to | Skabelonens navn, som det vises i appen. |
firstName |
Nej | Bruges til at udfylde en nyoprettet kontaktperson. |
lastName |
Nej | Bruges til at udfylde en nyoprettet kontaktperson. |
email |
Nej | Bruges til at udfylde en nyoprettet kontaktperson. |
variables |
Nej | Eksplicitte værdier for skabelonens variabler, angivet efter variabelnavn, for eksempel { "code": "482913" }. En værdi angivet her har forrang over kontaktpersonens felter for den pågældende variabel; variabler, du udelader, udfyldes stadig fra kontaktpersonen som beskrevet nedenfor. Dette er måden, du sender en engangskode til en godkendelsesskabelon på. |
Skabelonens brødtekst understøtter avanceret variabel-substitution:
- Grundlæggende variabler:
{{first_name}},{{email}},{{company}} - Standardværdier:
{{first_name|there}}viserthere, hvis feltet er tomt - Transformationer:
{{company|uppercase}},{{name|lowercase}},{{name|capitalize}} - Kombineret:
{{company|Your Company|uppercase}}
Kreditter: Afsendelse af en skabelon forbruger kreditter. Den nøjagtige pris afhænger af modtagerens land og skabelonens kategori.
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactId": "contact123",
"whatsappTemplateId": "template_abc123"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/send", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contactId: "contact123",
whatsappTemplateId: "template_abc123",
}),
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/send",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"contactId": "contact123",
"whatsappTemplateId": "template_abc123",
},
)
data = res.json()
Svar
{
"success": true,
"data": "WhatsApp template message sent successfully"
}
En anmodning, der mangler både en kontaktidentifikator og begge skabelonidentifikatorer, returnerer 400. Hvis din konto mangler de besked-legitimationsoplysninger, der kræves for at sende, er svaret 403.
Opret eller opdater en kampagnes live-skabelon
Et andet par slutpunkter til en kampagnes åbningsskabelon, afgrænset af sti i stedet for af en campaign_id i brødteksten. Disse skal bruges til en kampagne, der allerede er live: i modsætning til Opret en skabelon ovenfor, genindsender opdatering her også kampagnens opfølgningskladder til gennemsyn, så åbningsskabelonen og dens opfølgninger forbliver synkroniserede.
POST /whatsapp-templates/campaign/{campaignId} opretter kampagnens åbningsskabelon. PUT /whatsapp-templates/campaign/{campaignId} redigerer den — kampagnen skal allerede have en skabelon, ellers returneres 400.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
name |
Ja | Et navn til skabelonen. |
language |
Ja | Sprogkode, for eksempel en, es, de, pt_BR, zh_CN. |
body |
Ja | Beskedteksten, op til 1024 tegn. |
variables |
Ja | Sorteret liste over variabelnavne brugt i brødteksten. Send et tomt array, hvis skabelonen ikke bruger nogen. |
cURL (opret)
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"]
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "welcome_message",
language: "en",
body: "Hi {{first_name}}, thanks for reaching out!",
variables: ["first_name"],
}),
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"name": "welcome_message",
"language": "en",
"body": "Hi {{first_name}}, thanks for reaching out!",
"variables": ["first_name"],
},
)
data = res.json()
Svar
{
"success": true,
"campaign_status": "pending",
"template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"message": "WhatsApp template created and campaign updated successfully."
}
For at redigere skal du skifte metoden til PUT og bruge de samme felter — dette genindsender åbningsskabelonen (og kampagnens opfølgningskladder på en WhatsApp API-kampagne) til gennemsyn.
En kampagne, der ikke tilhører din konto, returnerer 404; en kampagne, der tilhører en anden konto, du ikke har tilladelse til, returnerer 403. Redigering af en kampagne uden en eksisterende skabelon returnerer 400.
Send en skabelon til en eksisterende kontakt
Et enklere, sti-afgrænset alternativ til Send en skabelon til en kontakt ovenfor: både skabelonen og kontakten skal allerede eksistere — intet bliver slået op efter navn eller oprettet på stedet.
POST /whatsapp-templates/{templateId}/send-to-contact
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
contactId |
Ja | Kontaktens ID. Skal tilhøre din konto. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "contactId": "contact123" }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ contactId: "contact123" }),
}
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"contactId": "contact123"},
)
data = res.json()
Svar
{
"success": true,
"data": "WhatsApp template message sent successfully"
}
Kreditter: Afsendelse forbruger kreditter, prissat på samme måde som slutpunktet ovenfor. En
contactId, der mangler eller ikke er på din konto, returnerer403; entemplateId, der ikke eksisterer, returnerer404.
Masseafsendelse af en skabelon
Send én skabelon til mange kontakter i et enkelt kald, med et prisoverslag, som du kan vise, før du bekræfter.
Estimer prisen først
Returnerer hvad afsendelse vil koste, opdelt efter destinationsland, uden at sende noget eller bruge kreditter. Skabelonpriser er pr. destinationsland, så dette skal beregnes på serversiden mod de faktiske kontakter i stedet for at blive estimeret på klientsiden.
POST /whatsapp-templates/{templateId}/estimate-bulk-cost
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
contactIds |
Ja | Kontakter der skal prissættes, op til 500 pr. kald. Dubletter tælles én gang. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "contactIds": ["contact123", "contact456"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ contactIds: ["contact123", "contact456"] }),
}
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"contactIds": ["contact123", "contact456"]},
)
data = res.json()
Svar
{
"success": true,
"data": {
"countries": [
{
"countryCode": "1",
"name": "United States",
"iso": "US",
"flag": "🇺🇸",
"contactCount": 120,
"costPerContact": 0.5,
"subtotal": 60.0
}
],
"totalContacts": 120,
"totalTemplateCost": 60.0,
"templateCategory": "marketing",
"skippedContacts": 2
}
}
skippedContacts tæller id’er, der manglede, ikke var dine, eller ikke havde et telefonnummer — estimatet dækker kun resten, så en værdi, der ikke er nul, betyder, at den faktiske afsendelse vil nå færre kontakter, end du valgte.
Send batchet
Sender skabelonen til hver kontakt på listen, løser eventuelle smarte variabler pr. kontakt og trækker kreditter pr. afsendelse.
POST /whatsapp-templates/{templateId}/bulk-send
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
contactIds |
Ja | Kontakter der skal sendes til, op til 5000 pr. kald. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "contactIds": ["contact123", "contact456"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ contactIds: ["contact123", "contact456"] }),
}
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"contactIds": ["contact123", "contact456"]},
)
data = res.json()
Svar
{
"success": true,
"data": { "sent": 118, "failed": 2, "total": 120 }
}
En kontakt, der fejler (ikke fundet, ikke på din konto, eller en afsendelsesfejl), springes over og tælles i failed i stedet for at stoppe batchet. Et tomt contactIds, mere end 5000 id’er ved en afsendelse (500 ved et estimat), eller et manglende templateId returnerer 400.
Forsøg en fejlet besked igen
To slutpunkter til genafsendelse af en besked, der fejlede, uden at oprette en ny beskedpost eller bruge kreditter igen.
POST /whatsapp-templates/messages/{contactId}/{messageId}/retry-template forsøger specifikt en fejlet skabelonbesked igen — den løser skabelonindholdet fra kampagnen igen, hvis den fejlede besked ikke allerede indeholder det. Kun beskeder med status failed og type template kan forsøges igen på denne måde.
POST /whatsapp-templates/messages/{contactId}/{messageId}/retry er kanal-agnostisk og fungerer til enhver fejlet ikke-skabelonbesked (f.eks. WhatsApp Web), og sender den til den rigtige afsendelsesvej baseret på beskedens kanal. Den accepterer status failed, failed_connection, limit_exceeded eller queued_retry.
Ingen af slutpunkterne tager en anmodningskrop.
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"data": "Message retry initiated successfully"
}
For den kanal-agnostiske version skal du skifte stien til .../msg_abc789/retry. En besked, hvis status ikke er berettiget til et nyt forsøg, eller (på skabelonslutpunktet) som ikke er en skabelonbesked, returnerer 400. En manglende kontakt eller besked returnerer 404.
WhatsApp Business-profil
Administrer den WhatsApp Business-profil (om, adresse, beskrivelse, e-mail, websteder, virksomhedskategori og logo), der vises for kontakter på WhatsApp. Fungerer både på en administreret forbindelse og en konto, der kører sin egen WhatsApp Business-konto.
Gem profilen
PUT /whatsapp-templates/profile
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
phoneNumber |
Ja | Det WhatsApp-nummer, som denne profil tilhører. Skal være forbundet til din konto. |
about |
Nej | Kort “Om”-tekst, der vises på profilen. |
address |
Nej | Virksomhedsadresse. |
description |
Nej | Længere virksomhedsbeskrivelse. |
email |
Nej | Kontakt-e-mail, der vises på profilen. |
websites |
Nej | Array af websteds-URL’er. Hver skal være en gyldig URL. |
vertical |
Nej | Virksomhedskategori, for eksempel Retail eller Professional Services. |
profilePictureHandle |
Nej | Det håndtag, der returneres af billed-upload-slutpunktet nedenfor, for at indstille profilbilledet. |
cURL
curl -X PUT "https://api.youraiconnector.com/v1/whatsapp-templates/profile?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "+31612345678",
"about": "We reply within a few hours",
"email": "support@example.com",
"websites": ["https://example.com"]
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/profile", {
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
phoneNumber: "+31612345678",
about: "We reply within a few hours",
email: "support@example.com",
websites: ["https://example.com"],
}),
});
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/whatsapp-templates/profile",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"phoneNumber": "+31612345678",
"about": "We reply within a few hours",
"email": "support@example.com",
"websites": ["https://example.com"],
},
)
data = res.json()
Svar
{
"success": true,
"data": "WhatsApp Business profile updated successfully"
}
Et manglende phoneNumber, en ugyldig websteds-URL eller et phoneNumber, der ikke er forbundet til din konto, returnerer 400 eller 404.
Upload et profilbillede
Downloader et billede fra en URL, du angiver, og uploader det til WhatsApp, hvorefter et håndtag returneres. Send dette håndtag som profilePictureHandle i kaldet til at gemme profilen ovenfor for at indstille det som foto – dette slutpunkt uploader kun billedet, det indstiller det ikke af sig selv.
POST /whatsapp-templates/profile/picture
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
phoneNumber |
Ja | Det WhatsApp-nummer, som denne profil tilhører. |
fileUrl |
Ja | En offentligt tilgængelig URL til billedet, der skal uploades. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "+31612345678",
"fileUrl": "https://example.com/logo.png"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
phoneNumber: "+31612345678",
fileUrl: "https://example.com/logo.png",
}),
});
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"phoneNumber": "+31612345678",
"fileUrl": "https://example.com/logo.png",
},
)
data = res.json()
Svar
{
"success": true,
"data": "1234567890123456"
}
data er det uploadede billedes håndtag. Et manglende phoneNumber eller fileUrl, eller et phoneNumber uden et WhatsApp-adgangstoken i arkivet, returnerer 400; en utilgængelig eller ugyldig fileUrl returnerer en fejl, der beskriver, hvorfor downloadet mislykkedes.
Tjek en afsenders status
Poller (og opdaterer) et forbundet WhatsApp-nummers live-afsendelsesstatus hos beskedudbyderen. Nyttigt til at bekræfte, at et nummer faktisk er i stand til at sende, før du stoler på det.
GET /whatsapp-templates/sender-status/{phoneNumber}
cURL
curl "https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true,
"data": "ONLINE"
}
data er en af ONLINE (sender normalt), PENDING (bliver stadig verificeret) eller DELETED (udbyderen genkender ikke længere denne afsender – genforbind nummeret). Et phoneNumber uden WhatsApp-virksomhedsoplysninger i arkivet returnerer 404.
Generer opfølgningsskabeloner med AI
Platformen kan skrive en kampagnes WhatsApp-opfølgningsskabeloner for dig — de påmindelser, der sendes, når en samtale går i stå — ud fra kampagnens egne instruktioner og mål. Der er ét job-endepunkt, der kører i baggrunden, plus tre ældre endepunkter, der bevares til eksisterende integrationer. De bruger alle AI-kreditter.
Start et genereringsjob
POST /campaigns/{campaignId}/template-generation
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
type |
Nej | all (standard) skriver hele opfølgningssættet. cold_only skriver kun beskederne til kontakter, der aldrig svarede. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "all" }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ type: "all" }),
}
);
const data = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"type": "all"},
)
data = res.json()
Respons (202)
{ "success": true, "campaign_id": "campaign_abc123", "type": "all" }
Kaldet returnerer, så snart jobbet er sat i kø. Læs kampagnen (GET /campaigns/{campaignId}, se Campaigns API) og hold øje med dens template_generation_status-objekt, indtil det er færdigt:
| Felt | Beskrivelse |
|---|---|
status |
processing mens jobbet kører, derefter completed eller failed. |
progress |
0 til 100. |
current_template, total_templates |
Hvor mange skabeloner der er skrevet indtil videre, ud af hvor mange jobbet vil skrive — 11 for en udgående eller kombineret kampagne, 9 ellers. |
error |
Hvorfor et failed-job stoppede, for eksempel ikke nok kreditter. |
started_at, completed_at |
Hvornår jobbet startede og sluttede. |
De genererede skabeloner lander på kampagnen som alle andre, så de vises i List templates og skal stadig gennem WhatsApp-godkendelse, før de kan sendes. En 400 betyder, at type var noget andet end all eller cold_only; en 404 betyder, at kampagnen ikke eksisterer eller tilhører en anden konto.
Agenter har en tvilling af dette kald, POST /agents/{agentId}/template-generation, som skriver opfølgningerne for en agent og afsluttes under selve kaldet i det normale tilfælde — se Generate follow-up messages i AI Agents API’et.
De ældre genererings-endepunkter
Tre tidligere endepunkter udfører det samme arbejde og bevares, så eksisterende integrationer fortsat kan køre. Ny kode bør bruge job-endepunktet ovenfor.
| Endepunkt | Hvad det gør |
|---|---|
POST /whatsapp-templates/campaign/{campaignId}/generate-async |
Starter opfølgningsgenerering for kampagnen i baggrunden og returnerer 202 med { "success": true, "data": { "result": "success", "message": "..." } }. Kreditter trækkes på forhånd (springes over på en konto, der medbringer sin egen AI-nøgle), og kampagnens template_generation_status rapporterer status præcis som ovenfor. |
POST /whatsapp-templates/campaign/{campaignId}/generate-followups |
Genererer alle ni opfølgningsskabeloner under kaldet — til en kampagne oprettet før automatiske opfølgninger eksisterede, eller en der skal have dem skrevet igen — og returnerer 200 med templatesGenerated inde i data. |
POST /whatsapp-templates/agent/{agentId}/generate-followups |
Den samme synkrone generering adresseret af Agent. Svaret tilføjer agent_id, campaign_id og target: "campaign" når skabelonerne blev skrevet på agentens kampagne, "agent" (med campaign_id: null) når agenten ikke har nogen kampagne, og de blev gemt på selve agenten. En manglende eller fremmed agent er en 404. |
Alle tre kræver automatiske opfølgninger på kontoen og nok kreditter — en 400 angiver hvilken der mangler — og parret adresseret til kampagnen returnerer 403, når kampagnen tilhører en anden konto.
Skabelon-API-fejl
Skabelon-slutpunkter returnerer standardfejlkuverten:
{
"success": false,
"error": "Template not found"
}
En 404 på disse slutpunkter betyder normalt, at ressourcen ikke blev fundet — enten eksisterer den ikke, eller også tilhører den en anden konto. Et par slutpunkter (oprettelse/opdatering med kampagne-scope og afsendelser til en eksisterende kontakt) returnerer i stedet 403, når kampagnen eller kontakten tilhører en anden person frem for slet ikke at eksistere. Nogle slutpunkter inkluderer også et error_code-felt, der afspejler HTTP-statuskoden. De delte koder, som alle slutpunkter kan returnere — 400, 401, 403 (din plan inkluderer ikke API-adgang), 429 (rate limit) og 500 — er angivet med vejledning om genforsøg i Fejl & Sidetal.
Næste skridt
- Godkendelse — de fire måder at godkende en anmodning på.
- Fejl og hastighedsbegrænsninger — statuskoder og grænsen på 300 anmodninger/min.
- Kampagne-API — administrer de kampagner, som skabeloner er tilknyttet.