WhatsApp Templates API
WhatsApp-berichtsjablonen zijn vooraf geschreven berichten die zijn goedgekeurd voor verzending buiten het normale 24-uurs gespreksvenster — bijvoorbeeld een welkomstbericht, een afspraakherinnering of een herinnering om opnieuw contact op te nemen. Met deze API kun je sjablonen programmatisch weergeven, aanmaken, bewerken, indienen, controleren, verwijderen en verzenden.
Alle onderstaande paden zijn relatief ten opzichte van de API-basis-URL:
https://api.youraiconnector.com/v1
Elk verzoek moet worden geauthenticeerd. Zie Authenticatie voor de vier geaccepteerde methoden. De voorbeelden op deze pagina gebruiken de X-API-Key-header (en één query-parameter-vorm voor cURL).
Let op: Sjablonen maken gebruik van het WhatsApp Business API-kanaal, dus dit onderdeel van de API vereist zowel API-toegang als een abonnement dat WhatsApp-kanalen bevat. Zonder deze worden verzoeken afgewezen met een 403.
Werken met subaccounts (bureaus)
Goedkeuringsstatussen
Omdat berichten die buiten een open gesprek worden verzonden eerst door WhatsApp moeten worden beoordeeld, heeft elk sjabloon een goedkeurings-status:
| Status | Betekenis |
|---|---|
draft |
Aangemaakt of opgeslagen, maar nog niet ingediend voor beoordeling. Je kunt het nog bewerken. |
received |
Ingediend en geaccepteerd in de beoordelingswachtrij. |
pending |
In beoordeling. |
approved |
Goedgekeurd voor verzending. |
rejected |
Afgewezen. Het rejection_reason-veld legt uit waarom; pas het aan en dien het opnieuw in. |
Alleen draft- en rejected-sjablonen kunnen worden bewerkt of (opnieuw) worden ingediend. Zodra een sjabloon approved is, is het vergrendeld — maak een nieuwe aan als je wijzigingen nodig hebt.
Automatische goedkeuring: Sommige kanalen vereisen geen externe beoordelingsstap. Sjablonen die voor een campagne op een dergelijk kanaal zijn aangemaakt of ingediend, worden onmiddellijk opgeslagen als
approved, zonder inhouds-ID (sid).
Sjablonen op Meta-gekoppelde accounts
Deze eindpunten werken op dezelfde manier, ongeacht op welke WhatsApp-verbinding uw account draait, maar wat er achter de schermen gebeurt, verschilt:
- Bij een beheerde WhatsApp-verbinding worden sjablonen geregistreerd bij de berichtprovider en is
sidde content-ID van de provider (HXXXXXXXX…). - Bij een account waarvan het nummer op een eigen WhatsApp Business-account draait (beide Meta-verbindingsopties), worden sjablonen aangemaakt en beoordeeld in dat WhatsApp Business-account en is
sidMeta’s eigen sjabloon-ID — een numerieke reeks zoals"3394843740694756".statusgebruikt nog steeds de waarden in de tabel hierboven, enrejection_reasonbevat nog steeds de uitleg van Meta.
Hiervoor bestaan twee extra eindpunten: één om te vragen op welke verbinding u zit, en één om uw sjabloonlijst te synchroniseren met uw WhatsApp Business-account. Sjablonen die al in het WhatsApp Business-account bestaan, worden door de synchronisatie in uw bibliotheek geïmporteerd, zodat een GET /whatsapp-templates ze daarna weergeeft zoals elk ander sjabloon.
Controleren op welke verbinding sjablonen draaien
GET /whatsapp-templates/provider
| Veld | Beschrijving |
|---|---|
provider |
twilio wanneer sjablonen zijn geregistreerd bij de beheerde berichtprovider, meta wanneer ze in uw eigen WhatsApp Business-account staan. |
lane |
Welke Meta-verbinding in gebruik is — meta_cloud_api (uw eigen Meta-app) of meta_embedded (gekoppeld via onze Meta-app). null bij een beheerde verbinding. |
waba_id |
Het WhatsApp Business-account waarin de sjablonen zijn aangemaakt, of null. |
templates_enabled |
false wanneer de Meta-verbinding nog niet voltooid is (geen WhatsApp Business-account of toegangstoken opgeslagen). Het aanmaken of indienen van sjablonen mislukt met een 400 totdat dit wel het geval is. |
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()
Antwoord
{
"success": true,
"provider": "meta",
"lane": "meta_cloud_api",
"waba_id": "2357661648036355",
"templates_enabled": true
}
Sjablonen synchroniseren vanuit Meta
Vernieuwt de goedkeuringsstatus van elk sjabloon dat in uw WhatsApp Business-account staat, en importeert elk sjabloon dat daar wel bestaat maar nog niet in uw bibliotheek staat. Kan veilig zo vaak worden aangeroepen als u wilt. Bij een beheerde verbinding valt er niets te synchroniseren, dus de aanroep doet niets en rapporteert simpelweg hoeveel sjablonen u heeft.
POST /whatsapp-templates/meta-sync
| Veld | Beschrijving |
|---|---|
imported |
Sjablonen gevonden in het WhatsApp Business-account die door deze aanroep aan uw bibliotheek zijn toegevoegd. |
updated |
Bestaande sjablonen waarvan de status of details zijn gewijzigd. |
total |
Sjablonen in uw bibliotheek na de synchronisatie. |
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()
Antwoord
{
"success": true,
"provider": "meta",
"imported": 2,
"updated": 5,
"total": 12
}
Direct communiceren met Meta (geavanceerd)
Als u iets nodig heeft dat de bovenstaande eindpunten niet bieden — sjabloonheaders, voetteksten, knoppen of een volledig handmatig opgebouwd sjabloon — stuurt /v1/meta-templates uw verzoek direct door naar de eigen sjabloon-API van Meta, zonder iets op te slaan in uw sjabloonbibliotheek. Dit werkt alleen op accounts waarvan het nummer op hun eigen WhatsApp Business-account draait; bij een beheerde verbinding retourneert elke aanroep 400 met het verzoek om eerst een Meta-app te koppelen.
| Eindpunt | Wat het doet |
|---|---|
GET /meta-templates |
Geeft de sjablonen in uw WhatsApp Business-account weer met hun laatste status. Voeg ?name= toe om te filteren op één specifieke sjabloonnaam. Retourneert { "success": true, "templates": [...] }. |
POST /meta-templates |
Maakt een sjabloon aan en dient het in één stap in voor beoordeling door Meta. Vereist name, language en body (of een volledige components-array in plaats van body). Optioneel: variables (array van strings), category (MARKETING, UTILITY of AUTHENTICATION), header, footer, buttons. Retourneert 201 met { "success": true, "template": {...} }. |
DELETE /meta-templates/{name} |
Verwijdert het sjabloon op basis van de Meta-naam — elke taal ervan. Voeg ?hsm_id= toe met de sjabloon-ID van Meta om slechts één taal te verwijderen. Retourneert { "success": true, "name": "..." }. |
Een sjabloon dat door Meta wordt geweigerd, retourneert 400 met de eigen uitleg van Meta in error.
Sjablonen weergeven
Geeft alle sjablonen in je account terug, met een beknopte samenvatting van elk.
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()
Antwoord
{
"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."
}
]
}
Een sjabloon ophalen
Geeft de volledige details van een enkel sjabloon terug, inclusief de variabelen, status en tijdstempels.
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()
Antwoord
{
"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"
}
}
Een sjabloon dat niet bestaat in uw account geeft 404 terug met { "success": false, "error": "Template not found" }.
Een sjabloon maken
Maakt een sjabloon voor het openingsbericht van een campagne en dient dit in één stap in voor goedkeuring.
POST /whatsapp-templates
| Veld | Verplicht | Beschrijving |
|---|---|---|
campaign_id |
Ja | De campagne waartoe het sjabloon behoort. |
name |
Ja | Een naam voor het sjabloon. |
language |
Ja | Taalkode, bijvoorbeeld en, es, de, pt_BR, zh_CN. |
body |
Ja | De berichttekst, tot 1024 tekens. |
variables |
Nee | Geordende lijst met variabelenamen die in de hoofdtekst worden gebruikt. |
Variabele-placeholders kunnen worden geschreven als {{first_name}}, {first_name} of [first_name] — ze worden allemaal genormaliseerd naar de vorm met dubbele accolades.
Het resultaat hangt af van de kanalen van de campagne:
- WhatsApp Business API-campagne: de inhoud wordt verzonden voor WhatsApp-beoordeling. Het antwoord bevat
campaign_status(receivedofpending) en eentemplate_sid. - Een kanaal zonder externe beoordelingsstap: het sjabloon wordt opgeslagen en automatisch goedgekeurd (
campaign_status: "approved",template_sid: null). - Geen WhatsApp-kanaal in de campagne: er wordt niets aangemaakt en
campaign_statusisnot_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()
Antwoord (ingediend voor beoordeling)
{
"success": true,
"campaign_status": "pending",
"template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Een zelfstandig sjabloon maken
Hiermee maakt u een sjabloon in uw sjabloonbibliotheek zonder deze te koppelen aan het openingsbericht van een campagne. Dit is de aanmaakstap van de levenscyclus die de rest van deze pagina volgt: maak het hier aan, bewerk het, dien het in voor beoordeling, vraag de status op en verwijder het wanneer u het niet meer nodig heeft.
POST /whatsapp-templates/docs
| Veld | Vereist | Beschrijving |
|---|---|---|
name |
Ja | Een naam voor het sjabloon. |
language |
Ja | Taalkode, bijvoorbeeld en, es, de, pt_BR, zh_CN. |
body |
Ja | De berichttekst, maximaal 1024 tekens. |
variables |
Nee | Geordende lijst met variabelenamen die in de body worden gebruikt. |
status |
Nee | draft (standaard) slaat het op zonder in te dienen; submitted plaatst het direct in de wachtrij voor WhatsApp-beoordeling. |
type |
Nee | general (standaard) of smart_followup. |
category |
Nee | marketing, utility, authentication of authentication-international. |
campaign_id |
Nee | Koppelt het sjabloon aan een van uw campagnes. |
Sjablonen voor authenticatie (eenmalige code). WhatsApp accepteert geen vrije-tekst-authenticatiesjablonen: de berichtinhoud is vooraf ingesteld door WhatsApp en het sjabloon moet een “code kopiëren”-knop bevatten. Wanneer u een sjabloon maakt met
category: "authentication", dienen wij deze in die vaste vorm voor u in. Uwbodywordt bewaard als het voorbeeld dat in de app wordt getoond, maar de tekst die uw contactpersoon ontvangt is de eigen bewoording van WhatsApp (de code, een beveiligingsherinnering en een melding dat deze na 10 minuten verloopt). Declareer precies één variabele, bijvoorbeeld["code"], en geef de code door wanneer u verzendt (zie het veldvariablesop Een sjabloon naar een contactpersoon sturen). De code moet korter zijn dan 15 tekens.
Welke ‘create’ moet ik gebruiken? Gebruik deze wanneer u een sjabloon wilt dat u zelf kunt bewerken en indienen. Gebruik
POST /whatsapp-templates(hierboven) wanneer u het openingsbericht van een campagne wilt instellen — die vereistcampaign_iden schrijft direct naar de campagne.
Een sjabloon dat is aangemaakt als submitted wordt op de achtergrond verzonden voor WhatsApp-beoordeling. Controleer daarom het status-eindpunt voor het resultaat in plaats van dit in het antwoord te verwachten.
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()
Antwoord
{
"success": true,
"template_id": "template_abc123",
"status": "draft"
}
Een ontbrekende name, language of body, een niet-ondersteunde taal, een status anders dan draft of submitted, een onbekende type of category, of een body van meer dan 1024 tekens resulteert in 400 met een verklarende error. Een campaign_id die niet een van uw campagnes is, resulteert in 404.
Een sjabloon bijwerken
Bewerkt een sjabloon dat nog niet is goedgekeurd. Alleen sjablonen met status draft of rejected kunnen worden bewerkt. Geef een willekeurige combinatie van name, body, language en variables op — alleen de velden die u verzendt, worden gewijzigd.
PUT /whatsapp-templates/{templateId}
Bewerken zorgt er niet voor dat de sjabloon opnieuw wordt ingediend voor beoordeling. Gebruik daarna het submit-eindpunt.
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()
Antwoord
{
"success": true,
"template_id": "template_abc123"
}
Het proberen te bewerken van een sjabloon die al approved is (of anderszins niet bewerkbaar), het niet verzenden van velden of het verzenden van een ongeldige waarde resulteert in 400 met een verklarende error.
Een sjabloon indienen voor goedkeuring
Dient een draft of rejected sjabloon in voor beoordeling. Sjablonen op een kanaal waarvoor geen externe beoordeling vereist is, worden onmiddellijk goedgekeurd; alle andere worden naar WhatsApp verzonden en de geretourneerde status (meestal received of pending) wordt opgeslagen bij de sjabloon.
POST /whatsapp-templates/{templateId}/submit
Follow-up sjablonen moeten hun vereiste variabelen declareren en gebruiken voordat ze kunnen worden ingediend: een voornaam-placeholder, plus een persoonlijke-context-placeholder voor slimme follow-ups.
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()
Antwoord
{
"success": true,
"template_id": "template_abc123",
"status": "pending",
"sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Goedkeuringsstatus controleren
Een lichtgewicht eindpunt voor het pollen van de huidige status van een sjabloon. De status wordt gelezen uit het opgeslagen record, dat periodiek op de achtergrond wordt vernieuwd, dus een zeer recente goedkeuring of afwijzing kan even duren voordat deze zichtbaar is.
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()
Antwoord
{
"success": true,
"template_id": "template_abc123",
"name": "welcome_message",
"status": "approved",
"sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"rejection_reason": null,
"date_updated": "2026-06-02T08:30:00.000Z"
}
Een sjabloon verwijderen
Verwijdert het sjabloonrecord uit uw account.
DELETE /whatsapp-templates/{templateId}
Belangrijk: Bij een beheerde verbinding wordt alleen het opgeslagen record verwijderd — inhoud die WhatsApp al heeft goedgekeurd, kan geregistreerd blijven bij de messaging-provider. Bij een account dat op een eigen WhatsApp Business-account draait, wordt de sjabloon ook uit dat account verwijderd. Hoe dan ook, als een campagne deze sjabloon nog gebruikt, wijs die campagne dan vóór het verwijderen naar een andere sjabloon, anders zullen verzendingen die ervan afhankelijk zijn mislukken.
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()
Antwoord
{
"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."
}
Een sjabloon naar een contactpersoon sturen
Verstuurt een goedgekeurde sjabloon naar een contactpersoon, zelfs als er geen open gesprek is — dit heropent de chatsessie. Je kunt de contactpersoon targeten via contactId of via phoneNumber, en de sjabloon kiezen via whatsappTemplateId of via templateName.
POST /whatsapp-templates/send
| Veld | Vereist | Beschrijving |
|---|---|---|
contactId |
Een van deze twee | Het ID van de contactpersoon. |
phoneNumber |
Een van deze twee | Het telefoonnummer van de contactpersoon (met landcode, zonder spaties). Wordt opgezocht of aangemaakt indien nodig. |
whatsappTemplateId |
Een van deze twee | Het ID van het sjabloon. |
templateName |
Een van deze twee | De naam van het sjabloon, zoals getoond in de app. |
firstName |
Nee | Wordt gebruikt om een nieuw aangemaakte contactpersoon in te vullen. |
lastName |
Nee | Wordt gebruikt om een nieuw aangemaakte contactpersoon in te vullen. |
email |
Nee | Wordt gebruikt om een nieuw aangemaakte contactpersoon in te vullen. |
variables |
Nee | Expliciete waarden voor de variabelen van het sjabloon, gesleuteld op variabelenaam, bijvoorbeeld { "code": "482913" }. Een waarde die hier wordt opgegeven, krijgt voorrang op de velden van de contactpersoon voor die variabele; variabelen die u weglaat, worden nog steeds ingevuld vanuit de contactpersoon zoals hieronder beschreven. Dit is hoe u een eenmalige code doorgeeft aan een authenticatiesjabloon. |
De hoofdtekst van de sjabloon ondersteunt geavanceerde variabele-substitutie:
- Basisvariabelen:
{{first_name}},{{email}},{{company}} - Standaardwaarden:
{{first_name|there}}toontthereals het veld leeg is - Transformaties:
{{company|uppercase}},{{name|lowercase}},{{name|capitalize}} - Gecombineerd:
{{company|Your Company|uppercase}}
Credits: Het versturen van een sjabloon verbruikt credits. De exacte kosten hangen af van het land van de ontvanger en de categorie van de sjabloon.
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()
Antwoord
{
"success": true,
"data": "WhatsApp template message sent successfully"
}
Een verzoek waarbij zowel een contact-ID als beide sjabloon-ID’s ontbreken, retourneert 400. Als je account niet beschikt over de messaging-inloggegevens die nodig zijn om te verzenden, is het antwoord 403.
Een live sjabloon voor een campagne maken of bijwerken
Een tweede paar eindpunten voor het openingssjabloon van een campagne, gespecificeerd via het pad in plaats van via een campaign_id in de body. Deze zijn bedoeld voor een campagne die al live is: in tegenstelling tot Een sjabloon maken hierboven, zorgt het bijwerken hier er ook voor dat de vervolgconcepten van de campagne opnieuw ter beoordeling worden ingediend, zodat het openingssjabloon en de vervolgberichten synchroon blijven.
POST /whatsapp-templates/campaign/{campaignId} maakt het openingssjabloon van de campagne aan. PUT /whatsapp-templates/campaign/{campaignId} bewerkt het — de campagne moet al een sjabloon hebben, anders wordt 400 geretourneerd.
| Veld | Vereist | Beschrijving |
|---|---|---|
name |
Ja | Een naam voor het sjabloon. |
language |
Ja | Taalcode, bijvoorbeeld en, es, de, pt_BR, zh_CN. |
body |
Ja | De berichttekst, maximaal 1024 tekens. |
variables |
Ja | Geordende lijst met variabelenamen die in de body worden gebruikt. Geef een lege array door als het sjabloon er geen gebruikt. |
cURL (maken)
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()
Antwoord
{
"success": true,
"campaign_status": "pending",
"template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"message": "WhatsApp template created and campaign updated successfully."
}
Om te bewerken, wijzigt u de methode naar PUT en gebruikt u dezelfde velden — dit dient het openingssjabloon (en de vervolgconcepten van de campagne, bij een WhatsApp API-campagne) opnieuw in voor beoordeling.
Een campagne die niet bij uw account hoort, retourneert 404; een campagne die bij een ander account hoort waarvoor u niet geautoriseerd bent, retourneert 403. Het bewerken van een campagne zonder bestaand sjabloon retourneert 400.
Een sjabloon naar een bestaande contactpersoon sturen
Een eenvoudiger, pad-gebaseerd alternatief voor Een sjabloon naar een contactpersoon sturen hierboven: zowel het sjabloon als de contactpersoon moeten al bestaan — er wordt niets op naam opgezocht of ter plekke aangemaakt.
POST /whatsapp-templates/{templateId}/send-to-contact
| Veld | Vereist | Beschrijving |
|---|---|---|
contactId |
Ja | Het ID van de contactpersoon. Moet bij uw account horen. |
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()
Antwoord
{
"success": true,
"data": "WhatsApp template message sent successfully"
}
Credits: Het verzenden verbruikt credits, geprijsd op dezelfde manier als het bovenstaande eindpunt. Een
contactIddie ontbreekt of niet bij uw account hoort, retourneert403; eentemplateIddie niet bestaat, retourneert404.
Een sjabloon in bulk verzenden
Verzend één sjabloon naar vele contactpersonen in één aanroep, met een kostenoverzicht dat u kunt tonen voordat u bevestigt.
Eerst de kosten schatten
Geeft de kosten van verzending terug, uitgesplitst per land van bestemming, zonder iets te verzenden of credits te verbruiken. De prijs voor sjablonen is per land van bestemming, dus dit moet aan de serverzijde worden berekend op basis van de werkelijke contacten in plaats van aan de clientzijde te worden geschat.
POST /whatsapp-templates/{templateId}/estimate-bulk-cost
| Veld | Vereist | Beschrijving |
|---|---|---|
contactIds |
Ja | Contacten om te prijzen, maximaal 500 per aanroep. Duplicaten worden eenmaal geteld. |
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()
Antwoord
{
"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 telt id’s die ontbraken, niet van jou waren of geen telefoonnummer bevatten — de schatting dekt alleen de rest, dus een waarde die niet nul is, betekent dat de werkelijke verzending minder contacten zal bereiken dan je hebt geselecteerd.
De batch verzenden
Verzendt het sjabloon naar elk contact in de lijst, waarbij eventuele slimme variabelen per contact worden opgelost en credits per verzending in rekening worden gebracht.
POST /whatsapp-templates/{templateId}/bulk-send
| Veld | Vereist | Beschrijving |
|---|---|---|
contactIds |
Ja | Contacten om naar te verzenden, maximaal 5000 per aanroep. |
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()
Antwoord
{
"success": true,
"data": { "sent": 118, "failed": 2, "total": 120 }
}
Een contact dat faalt (niet gevonden, niet op je account of een verzendfout) wordt overgeslagen en geteld in failed in plaats van de batch te stoppen. Een lege contactIds, meer dan 5000 id’s bij een verzending (500 bij een schatting) of een ontbrekende templateId retourneert 400.
Een mislukt bericht opnieuw proberen
Twee eindpunten voor het opnieuw verzenden van een mislukt bericht, zonder een nieuw berichtrecord aan te maken of opnieuw credits te verbruiken.
POST /whatsapp-templates/messages/{contactId}/{messageId}/retry-template probeert specifiek een mislukt sjabloonbericht opnieuw — het lost de sjablooninhoud opnieuw op vanuit de campagne als het mislukte bericht deze nog niet bevat. Alleen berichten met status failed en type template kunnen op deze manier opnieuw worden geprobeerd.
POST /whatsapp-templates/messages/{contactId}/{messageId}/retry is kanaalonafhankelijk en werkt voor elk mislukt niet-sjabloonbericht (bijvoorbeeld WhatsApp Web), waarbij het wordt verzonden naar het juiste verzendpad op basis van het kanaal van het bericht. Het accepteert status failed, failed_connection, limit_exceeded of queued_retry.
Geen van beide eindpunten vereist een aanvraagbody.
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()
Antwoord
{
"success": true,
"data": "Message retry initiated successfully"
}
Voor de kanaalonafhankelijke versie, wissel het pad naar .../msg_abc789/retry. Een bericht waarvan de status niet in aanmerking komt voor een nieuwe poging, of (op het sjablooneindpunt) dat geen sjabloonbericht is, retourneert 400. Een ontbrekend contact of bericht retourneert 404.
WhatsApp Business-profiel
Beheer het WhatsApp Business-profiel (over, adres, beschrijving, e-mail, websites, bedrijfscategorie en logo) dat aan contacten op WhatsApp wordt getoond. Werkt zowel op een beheerde verbinding als op een account dat een eigen WhatsApp Business-account gebruikt.
Het profiel opslaan
PUT /whatsapp-templates/profile
| Veld | Vereist | Beschrijving |
|---|---|---|
phoneNumber |
Ja | Het WhatsApp-nummer waar dit profiel bij hoort. Moet verbonden zijn met uw account. |
about |
Nee | Korte “Over”-tekst die op het profiel wordt getoond. |
address |
Nee | Bedrijfsadres. |
description |
Nee | Langere bedrijfsbeschrijving. |
email |
Nee | Contact-e-mailadres dat op het profiel wordt getoond. |
websites |
Nee | Array van website-URL’s. Elke URL moet geldig zijn. |
vertical |
Nee | Bedrijfscategorie, bijvoorbeeld Retail of Professional Services. |
profilePictureHandle |
Nee | De handle die wordt geretourneerd door het onderstaande endpoint voor het uploaden van afbeeldingen, om de profielfoto in te stellen. |
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()
Antwoord
{
"success": true,
"data": "WhatsApp Business profile updated successfully"
}
Een ontbrekende phoneNumber, een ongeldige website-URL of een phoneNumber die niet is verbonden met uw account resulteert in 400 of 404.
Een profielfoto uploaden
Downloadt een afbeelding van een URL die u opgeeft en uploadt deze naar WhatsApp, waarbij een handle wordt geretourneerd. Geef die handle door als profilePictureHandle bij de bovenstaande aanroep voor het opslaan van het profiel om deze als foto in te stellen — dit endpoint uploadt de afbeelding alleen, het stelt deze niet zelf in.
POST /whatsapp-templates/profile/picture
| Veld | Vereist | Beschrijving |
|---|---|---|
phoneNumber |
Ja | Het WhatsApp-nummer waar dit profiel bij hoort. |
fileUrl |
Ja | Een publiek toegankelijke URL naar de afbeelding die geüpload moet worden. |
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()
Antwoord
{
"success": true,
"data": "1234567890123456"
}
data is de handle van de geüploade afbeelding. Een ontbrekende phoneNumber of fileUrl, of een phoneNumber zonder WhatsApp-toegangstoken in het bestand, resulteert in 400; een onbereikbare of ongeldige fileUrl resulteert in een foutmelding die beschrijft waarom het downloaden is mislukt.
De status van een afzender controleren
Pollt (en ververst) de live verzendstatus van een verbonden WhatsApp-nummer bij de messaging-provider. Handig om te bevestigen dat een nummer daadwerkelijk kan verzenden voordat u erop vertrouwt.
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()
Antwoord
{
"success": true,
"data": "ONLINE"
}
data is een van ONLINE (verzendt normaal), PENDING (wordt nog geverifieerd) of DELETED (de provider herkent deze afzender niet langer — verbind het nummer opnieuw). Een phoneNumber zonder WhatsApp-bedrijfsinformatie in het bestand resulteert in 404.
Genereer follow-up-sjablonen met AI
Het platform kan de WhatsApp follow-up-sjablonen van een campagne voor je schrijven — de herinneringen die worden verstuurd wanneer een gesprek stilvalt — op basis van de instructies en het doel van de campagne zelf. Er is één taak-endpoint dat op de achtergrond draait, plus drie oudere endpoints die behouden zijn voor bestaande integraties. Ze verbruiken allemaal AI-credits.
Start een generatietaak
POST /campaigns/{campaignId}/template-generation
| Veld | Vereist | Beschrijving |
|---|---|---|
type |
Nee | all (de standaard) schrijft de volledige set follow-ups. cold_only schrijft alleen de berichten voor contacten die nooit hebben gereageerd. |
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()
Antwoord (202)
{ "success": true, "campaign_id": "campaign_abc123", "type": "all" }
De aanroep keert terug zodra de taak in de wachtrij staat. Lees de campagne (GET /campaigns/{campaignId}, zie de Campaigns API) en houd het template_generation_status-object in de gaten totdat deze is voltooid:
| Veld | Beschrijving |
|---|---|
status |
processing terwijl de taak draait, daarna completed of failed. |
progress |
0 tot 100. |
current_template, total_templates |
Hoeveel sjablonen er tot nu toe zijn geschreven, van het totaal aantal dat de taak zal schrijven — 11 voor een uitgaande of gecombineerde campagne, anders 9. |
error |
Waarom een failed-taak is gestopt, bijvoorbeeld door onvoldoende credits. |
started_at, completed_at |
Wanneer de taak begon en eindigde. |
De gegenereerde sjablonen komen net als alle andere op de campagne terecht, dus ze verschijnen in Sjablonen weergeven en moeten nog steeds door WhatsApp-goedkeuring voordat ze kunnen worden verzonden. Een 400 betekent dat type iets anders was dan all of cold_only; een 404 betekent dat de campagne niet bestaat of bij een ander account hoort.
Agents hebben een tegenhanger van deze aanroep, POST /agents/{agentId}/template-generation, die de follow-ups voor een Agent schrijft en in het normale geval tijdens de aanroep wordt voltooid — zie Follow-up-berichten genereren in de AI Agents API.
De oudere generatie-endpoints
Drie eerdere endpoints doen hetzelfde werk en worden behouden zodat bestaande integraties blijven werken. Nieuwe code moet het bovenstaande taak-endpoint gebruiken.
| Endpoint | Wat het doet |
|---|---|
POST /whatsapp-templates/campaign/{campaignId}/generate-async |
Start de follow-up-generatie voor de campagne op de achtergrond en retourneert 202 met { "success": true, "data": { "result": "success", "message": "..." } }. Credits worden vooraf in rekening gebracht (overgeslagen bij een account dat een eigen AI-sleutel meebrengt) en het template_generation_status van de campagne rapporteert de voortgang precies zoals hierboven. |
POST /whatsapp-templates/campaign/{campaignId}/generate-followups |
Genereert alle negen follow-up-sjablonen tijdens de aanroep — voor een campagne die is aangemaakt voordat automatische follow-ups bestonden, of een campagne die opnieuw moet worden geschreven — en retourneert 200 met templatesGenerated in data. |
POST /whatsapp-templates/agent/{agentId}/generate-followups |
Dezelfde synchrone generatie als geadresseerd door Agent. Het antwoord voegt agent_id, campaign_id en target toe: "campaign" wanneer de sjablonen op de campagne van de Agent zijn geschreven, "agent" (met campaign_id: null) wanneer de Agent geen campagne heeft en ze op de Agent zelf zijn opgeslagen. Een ontbrekende of vreemde Agent is een 404. |
Alle drie vereisen automatische follow-ups op het account en voldoende credits — een 400 benoemt welke ontbreekt — en het paar dat op de campagne is gericht, retourneert 403 wanneer de campagne bij een ander account hoort.
Fouten in de Templates API
Template-endpoints retourneren de standaard fouten-envelop:
{
"success": false,
"error": "Template not found"
}
Een 404 op deze eindpunten betekent meestal dat de resource niet is gevonden — ofwel deze bestaat niet, ofwel deze behoort tot een ander account. Een paar eindpunten (het aanmaken/bijwerken met campagne-scope, en verzendingen naar een bestaand contact) retourneren in plaats daarvan 403 wanneer de campagne of het contact toebehoort aan iemand anders in plaats van helemaal niet te bestaan. Sommige eindpunten bevatten ook een error_code-veld dat de HTTP-status weerspiegelt. De gedeelde codes die elk eindpunt kan retourneren — 400, 401, 403 (uw abonnement bevat geen API-toegang), 429 (snelheidslimiet) en 500 — worden vermeld met richtlijnen voor opnieuw proberen in Fouten & Paginering.
Volgende stappen
- Authenticatie — de vier manieren om een verzoek te authenticeren.
- Fouten & Snelheidslimieten — statuscodes en de limiet van 300 verzoeken per minuut.
- Campagnes API — beheer de campagnes waaraan sjablonen zijn gekoppeld.