Ontwikkelaars
API-documentatie
Een REST API met tokenauthenticatie voor berichten, templates, contacten, campagnes, flows en de afleverstatus en kosten per bericht. Maak een API-sleutel aan onder Ontwikkelaarstools in je account en authenticeer daarna elke aanroep met Authorization: Bearer <token>.
Volledige voorbeelden in PHP, Node.js, Python, Java en Ruby staan in de documentatie in de app, zodra je een account aanmaakt.
Machineleesbare referentie: OpenAPI 3.1 (JSON) · Postman-collectie
Voordat je begint
Authenticatie
Elk verzoek draagt een API-sleutel in de Authorization-header als Bearer-token. Sleutels maak je aan onder Ontwikkelaarstools > API-sleutels en worden één keer getoond.
Een sleutel heeft scopes: read (elke GET), send (de send-endpoints, campagnes en het starten van flows) en manage (aanmaken, wijzigen en verwijderen van contacten, groepen, automatische antwoorden, webhooks en templates, plus de inbox-acties). Een sleutel zonder de scope krijgt 403 met de naam van de ontbrekende scope.
Een sleutel kan verlopen: een verlopen sleutel krijgt 401 met "This API key has expired". Een ontbrekend of onbekend token is ook 401.
Een sandbox-sleutel valideert elk verzoek, registreert het bericht met status "sandbox" en stuurt niets naar WhatsApp - bouw tegen de echte API zonder WhatsApp-lijn en zonder kosten.
Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>
Rate limit
60 verzoeken per minuut per API-sleutel; verzoeken zonder sleutel worden per IP-adres geteld.
Elk antwoord draagt X-RateLimit-Limit en X-RateLimit-Remaining. Boven de limiet is het antwoord 429 met statusCode 429, een message en een Retry-After-header in seconden.
GET /api/usage geeft de limiet terug onder rate_limit.per_minute. /api en /api/v2 delen één bucket per sleutel.
HTTP/1.1 429 Too Many Requests
Retry-After: 42
{"statusCode": 429, "message": "Too many requests. Try again in 42 seconds."}
Idempotentie
Stuur een Idempotency-Key-header (1 tot 128 tekens, uniek per bewerking) mee op de POST-endpoints die iets aanmaken: de sends, campagnes, contacten, groepen en automatische antwoorden.
Dezelfde sleutel met hetzelfde verzoek binnen 24 uur geeft het opgeslagen antwoord terug met de header Idempotent-Replayed: true, en er wordt niets opnieuw uitgevoerd. Een client die na een time-out opnieuw probeert, verstuurt niet langer twee keer.
Dezelfde sleutel met een ander verzoek is 422; dezelfde sleutel terwijl het eerste verzoek nog loopt, is 409. Alleen 2xx- en 4xx-antwoorden worden opgeslagen, dus een 5xx kan met dezelfde sleutel opnieuw worden geprobeerd.
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Datums en tijdzones
Elke datum die de API teruggeeft is UTC in ISO-8601 met offset, ongeacht de tijdzone die de organisatie in het dashboard gebruikt.
Datums die je verstuurt (scheduled_at, since) worden als UTC gelezen, tenzij ze een offset hebben.
"created_at": "2026-10-05T09:30:00+00:00"
Fouten
Elk antwoord is JSON met statusCode en message; een geweigerde payload voegt errors toe, een map van veldnaam naar de lijst met problemen.
400 ongeldige invoer; 401 sleutel ontbreekt, is ongeldig of verlopen; 403 scope, abonnement, planlimiet of account in beoordeling; 404 onbekende uuid, of een die bij een andere werkruimte hoort; 409 conflict (een campagneovergang die niet kan, een Idempotency-Key die nog loopt); 422 geweigerd door een regel (het venster van 24 uur, STOP, templatevariabelen); 429 rate limit; 500 onze fout.
De inbox-acties (assign, close en reopen op /api/conversations/{contact_uuid}) antwoorden 409 zolang ticketing uitstaat onder Instellingen > Tickets; het gesprek lezen en een notitie toevoegen werken in beide gevallen.
Op /api (v1) is een weigering door WhatsApp zelf een 200 met data.success false en de reden in data.data.error (code, message, type). Op /api/v2 is dezelfde weigering een HTTP 422 - zie Versiebeheer.
{"statusCode": 400, "message": "The given data was invalid.", "errors": {"phone": ["The phone number is not valid."]}}
Paginering
De lijst-endpoints accepteren page (vanaf 1) en per_page (standaard 10, max. 100; /api/messages standaard 25) en zijn gesorteerd met de nieuwste eerst.
Contacten, groepen, automatische antwoorden, templates, campagnes en campagnelogs antwoorden met data, links en meta (current_page, last_page, per_page, total). /api/messages antwoordt met statusCode, data en meta (page, per_page, total, last_page).
Een gesprek wordt daarentegen met een cursor gepagineerd: GET /api/contacts/{uuid}/messages en GET /api/conversations/{contact_uuid} antwoorden nieuwste eerst met next_before; geef die door als before om de oudere berichten te krijgen.
Een template verzenden
Een templateverzending moet precies zoveel parameters bevatten als de goedgekeurde template placeholders heeft; Meta weigert een afwijking met fout 132000.
GET /api/templates/{uuid} geeft example_payload terug: een complete body voor POST /api/send/template met het juiste aantal parameters voor de header, de body en de URL-knoppen - vervang de waarden en verstuur hem.
POST /api/templates dient een template in bij Meta vanuit een platte JSON-vorm en antwoordt met de reden van Meta als die wordt afgewezen; POST /api/templates/sync haalt de templates op bij Meta na een wijziging in Meta Business Manager.
GET https://whapier.com/api/templates/{{uuid}}
{"data": {"name": "order_update", "variables": {"header": 0, "body": 1, "buttons": 0}, "example_payload": {"phone": "+40721000001", "template": {"name": "order_update", "language": {"code": "en"}, "components": [{"type": "body", "parameters": [{"type": "text", "text": "Ana"}]}]}}}}
Webhooks
Uitgaande webhooks stel je in onder Ontwikkelaarstools > Webhooks of via de API (POST /api/webhooks): een https-URL en de events die je wilt ontvangen. Het ondertekeningssecret wordt voor je gegenereerd en één keer getoond. Elke levering is een POST met een JSON-body met event en data.
De X-Whapier-Signature-header is "sha256=" gevolgd door de HMAC-SHA256 van de ruwe request-body met dat secret, in hex. Bereken die opnieuw over de bytes die je hebt ontvangen en vergelijk voordat je de payload vertrouwt.
Antwoord met 2xx binnen 15 seconden. Een mislukte levering wordt nog twee keer opnieuw geprobeerd, na 60 seconden en na 5 minuten; na de derde mislukking wordt het event weggegooid.
De events: message.received en message.sent; message.status wanneer Meta een bericht als delivered, read of failed meldt (met de fout en de campagne waar het uit kwam); campaign.finished met de eindtellingen; ticket.created en ticket.closed; contact.opted_out en contact.opted_in; contact, group en autoreply created, updated en deleted; template.status.update, template.quality.update en account.update zoals Meta ze stuurt. GET /api/webhooks/events toont ze met een beschrijving en POST /api/webhooks/{uuid}/test levert een voorbeeld.
X-Whapier-Signature: sha256=5d41402abc4b2a76b9719d911017c592...
{"event": "message.status", "data": {"uuid": "64968a32-fdd9-4c1d-8941-b8e538036616", "wam_id": "wamid.HBgM...", "status": "delivered", "timestamp": "2026-10-05T09:30:00+00:00", "failure": null, "contact": {"uuid": "81a2d165-41e2-43f2-847e-d69e08cba0e0", "phone": "+40721000001"}, "campaign": null}}
{"event": "campaign.finished", "data": {"uuid": "3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f", "name": "October offers", "status": "completed", "counts": {"contacts": 120, "sent": 118, "delivered": 110, "read": 64, "failed": 2}, "finished_at": "2026-10-05T09:30:00+00:00"}}
message.received
message.sent
message.status
message.status.update
contact.created
contact.updated
contact.deleted
contact.opted_out
contact.opted_in
group.created
group.updated
group.deleted
autoreply.created
autoreply.updated
autoreply.deleted
campaign.finished
ticket.created
ticket.closed
template.status.update
template.quality.update
account.update
Versiebeheer: v1 en v2
/api (versie 1) blijft ondersteund zoals het is. /api/v2 biedt dezelfde endpoints, payloads en velden met één verschil: de HTTP-status draagt de uitkomst.
Op v2 is een weigering door WhatsApp bij een verzending een HTTP 422 waarvan de body statusCode 422, de message, error (code, message en type van WhatsApp) en data (het v1-antwoord) bevat, in plaats van een 200 met data.success false. Wanneer statusCode in een body afwijkt van de HTTP-status, volgt de HTTP-status statusCode.
Alles verder - authenticatie, scopes, rate limit, idempotentie, datums, paginering - is identiek, en dezelfde sleutel werkt op beide.
POST https://whapier.com/api/v2/send
{"statusCode": 422, "message": "Template name does not exist", "error": {"code": 132001, "message": "Template name does not exist", "type": "OAuthException"}, "data": {"success": false, "message": "Template name does not exist", "data": {"error": {"code": 132001}}}}
Verificatie
GET
/api/verify
API-sleutel verifiëren
# Controleert of het Bearer-token geldig is en het abonnement van de organisatie actief is, voordat je andere endpoints aanroept. # HTTP 200: token in orde. 401: token ontbreekt of is ongeldig. 403: abonnement niet actief. curl -X GET \ https://whapier.com/api/verify \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
Contacten
GET
/api/contacts
Contactlijst ophalen
# Optionele query: ?page=1&per_page=10 (per_page maximaal 100). # Nieuwste eerst. Antwoord: data (contactobjecten), links en meta (current_page, last_page, per_page, total). # Een contact: id, uuid, phone, first_name, last_name, email, address, metadata, groups (uuid, name), source, opted_in_at, opted_out_at, created_at, updated_at. # Zoekfilters, gecombineerd met AND: phone (elk formaat dat het land van de organisatie kan lezen; 400 als het geen nummer is), email (exact, hoofdletterongevoelig), q (2 tot 128 tekens, gezocht in naam, e-mail en nummer), group (de uuid van een contactgroep; 400 als die onbekend is), opted_out (true | false), updated_since (een datum, UTC), source (api, manual, import, entry point...). curl -X GET \ "https://whapier.com/api/contacts?page=1&per_page=10" \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
GET
/api/contacts/{uuid}
Eén contact ophalen
# Het contactobject van Contactlijst ophalen plus unread_messages, last_message_at en ticket (status, assigned_to: name, email).
# ticket is null zolang ticketing uitstaat onder Instellingen > Tickets, of wanneer het gesprek nog geen ticket heeft. 404 wanneer de uuid onbekend is, verwijderd is of bij een andere werkruimte hoort.
curl -X GET \
https://whapier.com/api/contacts/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/contacts
Contact toevoegen
# Velden in de JSON-body:
# phone (verplicht) — internationaal nummer; gevalideerd en opgeslagen als E.164. Moet uniek zijn binnen de organisatie (400 bij een duplicaat).
# first_name, last_name, email (optioneel) — weglaten, null of "" voor contacten zonder naam.
# street, city, state, zip, country (optioneel) — opgeslagen in address (JSON).
# metadata (optioneel) — willekeurige waarde die naar JSON te serialiseren is.
# group (optioneel) — array met UUID-strings van contactgroepen.
# marketing_opt_in (optioneel, boolean) — true legt marketingtoestemming vast op het contact (toestemmingsregistratie volgens de AVG, source: api); false legt een afmelding vast. Weglaten laat de toestemming ongewijzigd.
# Antwoorden: 200 succes { statusCode, id, message }; 400 validatie; 403 abonnement niet actief of contactlimiet bereikt.
# Accepteert een Idempotency-Key-header (zie Voordat je begint).
curl -X POST \
https://whapier.com/api/contacts \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"first_name": "Ana",
"last_name": "Pop",
"email": "ana@example.com",
"group": [
"d746e4c5-db24-4fb2-be03-590421344d69"
],
"marketing_opt_in": true
}'
POST
/api/contacts/bulk
Contacten in bulk aanmaken of bijwerken
# contacts (verplicht, 1 tot 500 objecten) met de velden van Contact toevoegen per rij. Een rij waarvan de phone al in de werkruimte bestaat wordt bijgewerkt met de aanwezige velden (zoals Contact bewerken doet); een nieuw nummer wordt aangemaakt.
# Elke rij staat op zichzelf: één foute rij mislukt alleen en de rest gaat door. Antwoord: { statusCode, created, updated, failed: [ { index, phone, errors } ], limit_reached, message }.
# Aanmaken stopt bij de contactlimiet van het plan: limit_reached wordt true en de rijen die er niet meer in pasten staan in failed. Updates tellen nooit mee voor de limiet. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/contacts/bulk \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"contacts": [
{
"phone": "+40721000001",
"first_name": "Ana",
"last_name": "Pop",
"email": "ana@example.com"
},
{
"phone": "0721 000 002",
"first_name": "Ion",
"group": [
"d746e4c5-db24-4fb2-be03-590421344d69"
]
},
{
"phone": "not-a-phone",
"first_name": "Nobody"
}
]
}'
PUT
/api/contacts/{uuid}
Contact bewerken
# Dezelfde JSON-velden als bij Contact toevoegen. {uuid} in het pad is de id van het contact die je bij het aanmaken terugkrijgt.
# phone is bij een update optioneel; als je het wijzigt, mag het nieuwe nummer niet bij een ander contact horen (400 duplicaat).
# Bijwerken met dezelfde waarde voor phone als dit contact al heeft, is toegestaan.
# Velden die je weglaat, behouden hun waarde; stuur een veld als null of "" om het te wissen. Sleutels in metadata die je meestuurt, worden samengevoegd met de opgeslagen sleutels; de overige blijven behouden.
# marketing_opt_in (optioneel, boolean) — true legt marketingtoestemming vast (source: api), false legt een afmelding vast; weglaten laat de toestemming ongewijzigd.
# 404 wanneer de uuid onbekend is, verwijderd is of bij een andere werkruimte hoort.
curl -X PUT \
https://whapier.com/api/contacts/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"first_name": "Ana",
"last_name": "Popescu",
"metadata": {
"plan": "platinum"
}
}'
DELETE
/api/contacts/{uuid}
Contact verwijderen
# Verwijdert het contact zacht (soft delete); het verdwijnt meteen uit elke lijst. 404 wanneer de uuid onbekend is of al verwijderd.
# Antwoord: { statusCode, id, message }.
curl -X DELETE \
https://whapier.com/api/contacts/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
Contactgroepen
GET
/api/contact-groups
Lijst van contactgroepen ophalen
# Optionele query: ?page=1&per_page=10 (per_page maximaal 100). # Elke groep: uuid, name, contacts_count (actieve leden), created_at, updated_at. curl -X GET \ "https://whapier.com/api/contact-groups?page=1&per_page=10" \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
POST
/api/contact-groups
Contactgroep toevoegen
# name (verplicht) moet uniek zijn binnen de groepen van de organisatie (400 als de naam al in gebruik is).
# Antwoord: { statusCode, id, message }. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/contact-groups \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "Lead 5"
}'
PUT
/api/contact-groups/{uuid}
Contactgroep bewerken
# Dezelfde body als bij Contactgroep toevoegen. 404 bij een onbekende uuid.
curl -X PUT \
https://whapier.com/api/contact-groups/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "Lead 5"
}'
DELETE
/api/contact-groups/{uuid}
Contactgroep verwijderen
# Verwijdert de groep en de lidmaatschappen; de contacten zelf blijven bestaan. 404 bij een onbekende uuid.
curl -X DELETE \
https://whapier.com/api/contact-groups/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
Automatische antwoorden
GET
/api/canned-replies
Lijst van automatische antwoorden ophalen
# Optionele query: ?page=1&per_page=10 (per_page maximaal 100). # Elk antwoord: uuid, name, trigger, match_criteria, response_type, response (de tekst, of null bij media), file (name, url) of null, created_at, updated_at. curl -X GET \ "https://whapier.com/api/canned-replies?page=1&per_page=10" \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
POST
/api/canned-replies
Automatisch antwoord toevoegen
# Body: name en trigger (max. 255), match_criteria (exact match | contains), response_type (text | image | audio), response.
# Bij text is response het antwoord (max. 4096). Bij image of audio stuur je multipart/form-data met het bestand als response (png/jpg tot 5 MB; mp3/aac/ogg/amr/opus/m4a tot 16 MB); zonder bestand is het verzoek een 400.
# Antwoord: { statusCode, id, message }. 403 wanneer de limiet van het abonnement voor automatische antwoorden is bereikt. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/canned-replies \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "About Us",
"trigger": "what do you do?",
"match_criteria": "contains",
"response_type": "text",
"response": "We sell shoes"
}'
PUT
/api/canned-replies/{uuid}
Automatisch antwoord bewerken
# Dezelfde velden als bij Automatisch antwoord toevoegen. Een update zonder bestand behoudt de media die er al zijn. 404 bij een onbekende uuid.
curl -X PUT \
https://whapier.com/api/canned-replies/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "About Us",
"trigger": "what do you do?",
"match_criteria": "contains",
"response_type": "text",
"response": "We sell shoes and clothes"
}'
DELETE
/api/canned-replies/{uuid}
Automatisch antwoord verwijderen
# 404 bij een onbekende uuid. Antwoord: { statusCode, id, message }.
curl -X DELETE \
https://whapier.com/api/canned-replies/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
WhatsApp-lijnen
GET
/api/whatsapp-connections
Koppelingen weergeven
# Geeft de uuid van elke lijn terug (te gebruiken als whatsapp_connection bij /api/send). Interne databasesleutels worden niet teruggegeven. # Elke rij: uuid, type, name, phone, display_phone_number en, voor een WhatsApp Business-lijn, verified_name en number_status. 403 wanneer er geen lijn gekoppeld is. curl -X GET \ https://whapier.com/api/whatsapp-connections \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
Berichten
POST
/api/send
Bericht versturen
# Optioneel: whatsapp_connection (UUID uit GET /api/whatsapp-connections). Laat weg om de standaardlijn van de organisatie te gebruiken.
# phone (verplicht) — elk formaat; genormaliseerd naar E.164 met het land van de organisatie. Een nieuw nummer wordt een contact (first_name, last_name, email optioneel).
# message (verplicht, max. 4096); header en footer (optioneel, max. 60); buttons (optioneel, maximaal 3 van { id, title }).
# Vrije berichten vereisen een open venster van 24 uur: 422 wanneer het laatste bericht van de klant ouder is dan een dag. 403: abonnement, planlimiet, dagelijkse triallimiet of een account in beoordeling.
# Antwoord: 200 { statusCode, data: { success, data: { chat: { uuid, wam_id, status, type, created_at, contact } } } }. Een weigering door WhatsApp is een 200 met data.success false en data.data.error op /api; een HTTP 422 op /api/v2.
# Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/send \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"message": "Hello Ana, how are you?",
"whatsapp_connection": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"header": "Example Shoes",
"footer": "Reply STOP to opt out",
"buttons": [
{
"id": "yes",
"title": "Fine"
},
{
"id": "no",
"title": "Not well"
}
]
}'
POST
/api/send/media
Media versturen
# Optioneel: whatsapp_connection (UUID uit GET /api/whatsapp-connections). Laat weg om de standaardlijn van de organisatie te gebruiken.
# media_type (image | video | audio | document | sticker); media_url (https, een openbare host; gecontroleerd met één HEAD-verzoek tegen de grootte- en typelimieten van WhatsApp - anders 400 met de reden); caption (optioneel, niet voor audio); file_name (verplicht bij document).
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/media \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"media_type": "image",
"media_url": "https://cdn.example.com/offers/october.jpg",
"caption": "Our October offers"
}'
POST
/api/send/template
Templatebericht versturen
# Optioneel: "whatsapp_connection": "<uuid>" voor een specifieke WABA-lijn (UUID uit GET /api/whatsapp-connections).
# template.name en template.language ("en" of { "code": "en" }) zijn verplicht; components volgen de eigen structuur van WhatsApp (header, body, buttonparameters).
# Werkt buiten het venster van 24 uur. Een contact dat zich heeft afgemeld (STOP) krijgt geen MARKETING-template: 422. Utility- en authenticatietemplates gaan wel door.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/template \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"template": {
"name": "order_update",
"language": {
"code": "en"
},
"components": [
{
"type": "header",
"parameters": [
{
"type": "text",
"text": "48213"
}
]
},
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "Ana"
},
{
"type": "text",
"text": "48213"
},
{
"type": "date_time",
"date_time": {
"fallback_value": "October 7, 2026"
}
}
]
},
{
"type": "button",
"sub_type": "url",
"index": "0",
"parameters": [
{
"type": "text",
"text": "48213"
}
]
}
]
}
}'
POST
/api/send/location
Locatie versturen
# latitude (-90 tot 90) en longitude (-180 tot 180) verplicht; name en address optioneel.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/location \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"latitude": 46.77120000000000032969182939268648624420166015625,
"longitude": 23.623599999999999710098563809879124164581298828125,
"name": "Example Shoes",
"address": "Str. Memorandumului 12, Cluj-Napoca"
}'
POST
/api/send/contacts
Contactkaarten versturen
# contacts (1 tot 10 kaarten) in de contacts[]-structuur van WhatsApp: name.formatted_name verplicht; phones[], emails[], addresses[], org optioneel.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/contacts \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"contacts": [
{
"name": {
"formatted_name": "Example Shoes Support",
"first_name": "Support"
},
"phones": [
{
"phone": "+40700000000",
"type": "WORK"
}
],
"emails": [
{
"email": "support@example.com",
"type": "WORK"
}
]
}
]
}'
POST
/api/send/reaction
Reactie versturen
# message_id (de wam_id van het bericht waarop je reageert) en emoji (verplicht; "" verwijdert de reactie).
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/reaction \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"message_id": "wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA",
"emoji": "👍"
}'
POST
/api/send/location-request
Locatie opvragen
# message (verplicht, max. 1024): de tekst die boven de knop "Locatie versturen" wordt getoond.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/location-request \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"message": "Where should we deliver?"
}'
POST
/api/send/request-contact-info
Contactgegevens opvragen
# message (verplicht, max. 1024): vraagt een WhatsApp-gebruiker met alleen een gebruikersnaam om zijn telefoonnummer te delen.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/request-contact-info \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"message": "Could you share your number so we can call you back?"
}'
POST
/api/send/carousel
Carrousel versturen
# message (verplicht, max. 1024) en cards (2 tot 10): header { type: image | video, link } verplicht; body (max. 160), url_button { text, url } en quick_replies (maximaal 3 van { id, title }) optioneel.
# Dezelfde controles en hetzelfde antwoord als bij Bericht versturen.
curl -X POST \
https://whapier.com/api/send/carousel \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"phone": "+40721000001",
"message": "Our new arrivals",
"cards": [
{
"header": {
"type": "image",
"link": "https://cdn.example.com/shoes/1.jpg"
},
"body": "Runner, 89 EUR",
"url_button": {
"text": "See it",
"url": "https://example.com/shoes/1"
}
},
{
"header": {
"type": "image",
"link": "https://cdn.example.com/shoes/2.jpg"
},
"body": "Trail, 119 EUR",
"quick_replies": [
{
"id": "trail",
"title": "Tell me more"
}
]
}
]
}'
Flows
POST
/api/flows/{uuid}/start
Een flow starten
# contact (verplicht): de uuid of phone van het contact (genormaliseerd met het land van de organisatie).
# 200 { statusCode, success: true, message }; 404 flow of contact onbekend; 422 flow niet gepubliceerd; 409 het contact zit al in een flowsessie.
# Alles wat de flow verstuurt, valt onder het venster van 24 uur, tenzij de flow templatenodes gebruikt.
curl -X POST \
https://whapier.com/api/flows/{{uuid}}/start \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"contact": "+40721000001"
}'
Campagnes
GET
/api/campaigns
Campagnes weergeven
# Optioneel: ?page=1&per_page=10&search= # Elke campagne: uuid, name, status, scheduled_at, created_at, template (uuid, name, language, category, status), whatsapp_connection (uuid, name, type), audience (type: all | group | segment, uuid, name), counts (contacts, sent, delivered, read, failed). curl -X GET \ "https://whapier.com/api/campaigns?page=1&per_page=10" \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
POST
/api/campaigns
Campagne aanmaken (WABA-template met variabelen)
# Gebruik dit wanneer whatsapp_connection een WhatsApp Cloud-lijn (WABA) uit GET /api/whatsapp-connections is.
#
# VOORWAARDEN
# - template: UUID van een rij uit GET /api/templates (binnen de organisatie), NIET de publieke naam van de template als string.
# - Laat het aantal variabelen overeenkomen met je goedgekeurde template: open de metadata van de template in de UI of bij Meta — BODY gebruikt {{1}}, {{2}}, … op volgorde.
# - Je moet voor elke placeholder in BODY één body-parameter meegeven, in dezelfde volgorde. Een aantal dat niet overeenkomt met de goedgekeurde template wordt vooraf geweigerd (422), niet achteraf door WhatsApp.
#
# TOELICHTING BIJ DE VELDEN
# - contacts: "all" of de uuid van een contactgroep; of segment: de uuid van een opgeslagen segment (één van de twee, niet beide). send_immediately: true, of scheduled_at (een datum, gelezen als UTC).
# - header: optioneel object; weglaten betekent { "format": "TEXT", "parameters": [] }.
# - body: gebruik body.parameters[] voor variabelen. API-formaat (aanbevolen): { "type": "text", "value": "literal for {{1}}" } per positie.
# Alternatief (zoals in het dashboard): { "selection": "static", "value": "..." } of { "selection": "dynamic", "value": "first name" } (koppelt contactvelden).
# - footer / buttons: optioneel; gebruik [] of {} als je ze niet nodig hebt. Templates met URL- of quick-reply-variabelen hebben buttons[] nodig met dezelfde opbouw als het campagneformulier op het web.
# - Media-header (IMAGE|VIDEO|DOCUMENT): header.parameters[] met type (IMAGE|VIDEO|DOCUMENT), "selection": "link", "value": "https://..." (openbare URL; de API kan geen bestanden uploaden).
#
# ANTWOORD: 200 { "statusCode": 200, "uuid": "...", "message": "..." }. Vraag GET /api/campaigns/{uuid} op voor het rapport en GET /api/campaigns/{uuid}/logs voor de status per ontvanger, of abonneer je op de webhook campaign.finished.
# 403 wanneer de campagnelimiet van het abonnement is bereikt. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/campaigns \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "Billing reminder blast",
"whatsapp_connection": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"contacts": "all",
"send_immediately": true,
"template": "281a3383-985c-4084-bcb0-9ec523c952de",
"header": {
"format": "TEXT",
"parameters": []
},
"body": {
"parameters": [
{
"type": "text",
"value": "Ana"
},
{
"type": "text",
"value": "48213"
},
{
"type": "text",
"value": "7 October 2026"
}
]
},
"footer": {},
"buttons": []
}'
GET
/api/campaigns/{uuid}
Eén campagne met rapport ophalen
# Het campagneobject van Campagnes weergeven plus report: counts (contacts, sent, delivered, read, failed, pending), failure_reasons (code, title, count - de tien meest voorkomende), started_at, finished_at (null tot de campagne klaar is), paused_reason, paused_detail en paused_at (null tenzij de status paused is).
# paused_reason is user (gepauzeerd vanuit het dashboard of de API), admin, failing, failure_rate of quality (gepauzeerd door het platform; paused_detail zegt waarom). 404 bij een onbekende campagne.
curl -X GET \
https://whapier.com/api/campaigns/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/campaigns/{uuid}/pause
Een campagne pauzeren
# Geen body. Alleen een campagne met status scheduled of ongoing kan worden gepauzeerd: anders 409, met de status waarin de campagne zich bevindt. De logs blijven zoals ze zijn en hervatten pakt ze weer op.
# Antwoord: { statusCode, status, message } - status is de nieuwe status van de campagne. 404 bij een onbekende campagne.
curl -X POST \
https://whapier.com/api/campaigns/{{uuid}}/pause \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
POST
/api/campaigns/{uuid}/resume
Een campagne hervatten
# Geen body. Alleen een campagne met status paused kan worden hervat: anders 409. Een campagne die vóór haar tijdstip is gepauzeerd gaat terug naar scheduled; een die tijdens het verzenden is gepauzeerd gaat terug naar ongoing.
# Antwoord: { statusCode, status, message }. 404 bij een onbekende campagne.
curl -X POST \
https://whapier.com/api/campaigns/{{uuid}}/resume \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
POST
/api/campaigns/{uuid}/cancel
Een campagne annuleren
# Geen body. Een campagne met status scheduled, ongoing of paused kan worden geannuleerd: anders 409. Wat niet verzonden is blijft onverzonden; het rapport blijft tonen wie bereikt is.
# Antwoord: { statusCode, status, message }. 404 bij een onbekende campagne.
curl -X POST \
https://whapier.com/api/campaigns/{{uuid}}/cancel \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
GET
/api/campaigns/{uuid}/logs
Campagnelogs
# Optioneel: ?page=1&per_page=10&search= (zoekt op naam/telefoonnummer van het contact).
# Elke rij: contact (uuid, phone, first_name, last_name), status, message (uuid, wam_id, status) of null, error (code, title, reason) of null, retry_count, created_at, updated_at. 404 bij een onbekende campagne.
curl -X GET \
"https://whapier.com/api/campaigns/{{uuid}}/logs?page=1&per_page=10" \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
Templates
GET
/api/templates
Templates weergeven
# Optionele query: ?page=1&per_page=10 (per_page maximaal 100). # Elke template: uuid, name, language, category, status, components (zoals WhatsApp ze heeft goedgekeurd), variables (header, body, buttons: hoeveel placeholders elk onderdeel heeft), rejection (waarom de template is afgewezen, of null), quality_score, updated_at. curl -X GET \ "https://whapier.com/api/templates?page=1&per_page=10" \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
GET
/api/templates/{uuid}
Eén template met een verzendklaar voorbeeld ophalen
# Het templateobject van Templates weergeven plus example_payload: een complete body voor POST /api/send/template met één parameter per placeholder (de voorbeelden waarmee de template is ingediend, anders een waarde die de plek benoemt), een link voor een media-header en een suffix voor elke URL-knop met een variabele.
# Optionele query: whatsapp_connection (de uuid van een lijn) wanneer dezelfde template op meerdere lijnen bestaat. 404 bij een onbekende uuid.
curl -X GET \
https://whapier.com/api/templates/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/templates
Template aanmaken
# name (kleine letters, cijfers en underscores), category (MARKETING | UTILITY) en language (een Meta-taalcode zoals en of pt_BR) zijn verplicht; whatsapp_connection (de uuid van een WhatsApp Business-lijn) is optioneel - anders de standaardlijn.
# header (optioneel): { format: TEXT, text (max. 60, één {{1}} toegestaan), examples } of { format: IMAGE | VIDEO | DOCUMENT, media_url: een openbare https-link naar een voorbeeldbestand }.
# body.text (verplicht, max. 1024, placeholders {{1}}, {{2}}, ...) met body.examples, één per placeholder; footer (optioneel, max. 60); buttons (optioneel, tot 10): { type: QUICK_REPLY | URL | PHONE_NUMBER | COPY_CODE, text, url, phone_number, example }.
# Antwoord: 200 { statusCode, uuid, status, message } - status is PENDING tot Meta de template heeft beoordeeld (de webhook template.status.update meldt het). 400 met de reden van Meta als Meta de template afwijst; AUTHENTICATION-templates kunnen nog niet via de API worden ingediend. Een sandbox-sleutel kan niet indienen (403). Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/templates \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"name": "order_update",
"category": "UTILITY",
"language": "en",
"header": {
"format": "TEXT",
"text": "Order {{1}}",
"examples": [
"48213"
]
},
"body": {
"text": "Hi {{1}}, your order {{2}} ships on {{3}}.",
"examples": [
"Ana",
"48213",
"October 7"
]
},
"footer": "Example Shoes",
"buttons": [
{
"type": "URL",
"text": "Track",
"url": "https://example.com/track/{{1}}",
"example": "48213"
},
{
"type": "QUICK_REPLY",
"text": "Stop updates"
}
]
}'
POST
/api/templates/sync
Templates synchroniseren vanuit Meta
# Geen body. Haalt de templates van elke WhatsApp Business-lijn op bij Meta, zoals de verversknop van het dashboard doet, zodat een template die in Meta Business Manager is gewijzigd hier ook verschijnt.
# Antwoord: { statusCode, synced, message } - synced is het aantal templates dat is toegevoegd of gewijzigd. Een sandbox-sleutel kan niet synchroniseren (403); 400 als Meta het verzoek heeft geweigerd.
curl -X POST \
https://whapier.com/api/templates/sync \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
Webhooks
GET
/api/webhooks
Webhooks weergeven
# Elke rij: uuid, url, events, secret_preview (de laatste zes tekens van het ondertekeningssecret), created_at, updated_at. Het volledige secret wordt één keer getoond, in het antwoord op Webhook toevoegen. # 403 als de module Webhooks niet in het plan zit. curl -X GET \ https://whapier.com/api/webhooks \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
GET
/api/webhooks/events
Events weergeven
# Elk event dat een webhook kan ontvangen: data (name, description). De pagina Webhooks in het dashboard leest dezelfde catalogus.
# Een levering is { event, data }; de vorm van data per event staat onder Voordat je begint > Webhooks, en POST /api/webhooks/{uuid}/test levert van elk ervan een voorbeeld.
curl -X GET \
https://whapier.com/api/webhooks/events \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/webhooks
Webhook toevoegen
# url (verplicht, https, uniek per organisatie) en events (verplicht, een of meer namen uit GET /api/webhooks/events).
# Antwoord: { statusCode, uuid, secret, message } - de enige keer dat het volledige secret wordt teruggegeven; bewaar het om X-Whapier-Signature te controleren. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/webhooks \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"url": "https://example.com/hooks/whapier",
"events": [
"message.received",
"message.status",
"campaign.finished"
]
}'
PUT
/api/webhooks/{uuid}
Webhook bewerken
# Dezelfde body als Webhook toevoegen. De lijst events vervangt de opgeslagen lijst; het secret blijft zoals het is. 404 bij een onbekende uuid.
curl -X PUT \
https://whapier.com/api/webhooks/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"url": "https://example.com/hooks/whapier",
"events": [
"message.received",
"message.status"
]
}'
DELETE
/api/webhooks/{uuid}
Webhook verwijderen
# Verwijdert het endpoint en zijn abonnementen; er wordt niets meer aan geleverd. Antwoord: { statusCode, uuid, message }. 404 bij een onbekende uuid.
curl -X DELETE \
https://whapier.com/api/webhooks/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/webhooks/{uuid}/test
Een testevent sturen
# event (verplicht): een naam uit GET /api/webhooks/events. De voorbeeldpayload wordt met POST naar de url gestuurd als { event, data, test: true }, ondertekend met het secret in X-Whapier-Signature.
# Antwoord: { statusCode, event, delivered, http_status, message } - delivered is false met de status waarmee je endpoint antwoordde, of http_status null als het niet bereikbaar was. 404 bij een onbekende uuid.
curl -X POST \
https://whapier.com/api/webhooks/{{uuid}}/test \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"event": "message.status"
}'
Berichtstatus
GET
/api/messages
Berichten weergeven
# Optionele query: status (sent | delivered | read | failed | accepted | played), direction (inbound | outbound), since en until (datums, UTC), contact (de uuid van een contact), campaign (de uuid van een campagne: de berichten die zij heeft voortgebracht), wam_id (één bericht op WhatsApp-id), api_key (de uuid van een sleutel, of current: de berichten verstuurd met de sleutel die het verzoek doet), page, per_page (standaard 25, max. 100).
# Antwoord: { statusCode, data: [ message ], meta: { page, per_page, total, last_page } }. 404 als contact, campaign of api_key onbekend is.
# Een bericht: uuid, wam_id, direction, status, type, content, created_at, delivered_at, read_at, failed_at, failure (code, title, reason, retryable) of null, pricing (category, model, billable, amount, currency, country), api_key (uuid, name) of null als het niet via de API is verstuurd, contact (uuid, phone, first_name, last_name).
# content per type - text: body, header, footer, buttons (type, text); template: name, language, body; image, video, audio, document, sticker: caption, media (type, url, filename); interactive en button: text, payload (waarop de klant drukte); location: latitude, longitude, name, address; contacts: contacts (name, phones); reaction: emoji, wam_id.
curl -X GET \
"https://whapier.com/api/messages?status=failed&per_page=25" \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
GET
/api/contacts/{uuid}/messages
Gesprek met een contact
# Dezelfde berichtobjecten als Berichten weergeven, voor één contact, nieuwste eerst. Optionele query: per_page (standaard 25, max. 100), before (de uuid van het oudste bericht dat je al hebt).
# Antwoord: { statusCode, data: [ message ], meta: { per_page, has_more, next_before } } - geef next_before door als before om de oudere berichten te krijgen. 404 bij een onbekend contact of een onbekende cursor.
curl -X GET \
"https://whapier.com/api/contacts/{{uuid}}/messages?per_page=25" \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
GET
/api/messages/{uuid}
Eén bericht ophalen
# Hetzelfde berichtobject plus history: een lijst van { status, timestamp, recorded_at }, elke statuswijziging die WhatsApp heeft gemeld. 404 bij een onbekende uuid.
curl -X GET \
https://whapier.com/api/messages/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
Gebruik
GET
/api/usage
Abonnement en gebruik
# Antwoord data: plan (name, status, valid_until), limits (contacts, messages, campaigns: used, limit; limit null = onbeperkt), trial_daily_messages (alleen trialaccounts), messages_sent (today, last_7_days, last_30_days), estimated_cost (last_30_days: amount, currency), rate_limit (per_minute). curl -X GET \ https://whapier.com/api/usage \ -H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \ -H 'Accept: application/json'
Inbox
GET
/api/conversations/{contact_uuid}
Een gesprek ophalen
# Antwoord data: contact (uuid, phone, first_name, last_name), ticketing (of Instellingen > Tickets aanstaat), ticket (status, assigned_to: name, email; opened_at, waiting_since, resolved_at) of null, messages (uuid, wam_id, direction, type, text, status, created_at - de 50 nieuwste, nieuwste eerst), next_before.
# Optionele query: before (de uuid van het oudste bericht dat je hebt) voor de oudere berichten; 400 als de cursor geen bericht van dit contact is. 404 bij een onbekend contact.
curl -X GET \
https://whapier.com/api/conversations/{{uuid}} \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Accept: application/json'
POST
/api/conversations/{contact_uuid}/assign
Een gesprek toewijzen
# user_email (verplicht, mag null zijn): het e-mailadres van een actief lid van de organisatie; null maakt de toewijzing van het ticket ongedaan. Een gesprek zonder ticket krijgt er een.
# Antwoord: { statusCode, data: ticket, message } met het ticket zoals Een gesprek ophalen het toont. 409 zolang ticketing uitstaat; 422 als geen actief lid van de organisatie dat e-mailadres heeft; 404 bij een onbekend contact.
curl -X POST \
https://whapier.com/api/conversations/{{uuid}}/assign \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"user_email": "maria@example.com"
}'
POST
/api/conversations/{contact_uuid}/close
Een gesprek sluiten
# Geen body. Lost het ticket op (status closed, resolved_at gezet), zoals de knop in de inbox. Antwoord: { statusCode, data: ticket, message }.
# 409 zolang ticketing uitstaat; 404 bij een onbekend contact.
curl -X POST \
https://whapier.com/api/conversations/{{uuid}}/close \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
POST
/api/conversations/{contact_uuid}/reopen
Een gesprek heropenen
# Geen body. Heropent een gesloten ticket (status open, resolved_at gewist); een open ticket wordt teruggegeven zoals het is. Antwoord: { statusCode, data: ticket, message }.
# 409 zolang ticketing uitstaat; 404 bij een onbekend contact.
curl -X POST \
https://whapier.com/api/conversations/{{uuid}}/reopen \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{}'
POST
/api/conversations/{contact_uuid}/notes
Een interne notitie toevoegen
# note (verplicht, max. 5000): zichtbaar voor de agents in de thread, nooit naar het contact gestuurd. Werkt met ticketing aan of uit.
# Antwoord: { statusCode, uuid, created_at, message }. 404 bij een onbekend contact. Accepteert een Idempotency-Key-header.
curl -X POST \
https://whapier.com/api/conversations/{{uuid}}/notes \
-H 'Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"note": "Customer called; wants the order delivered on Friday."
}'
In twee minuten een API-sleutel
Gratis proefperiode, geen creditcard — het ontwikkelaarspaneel zit in elk abonnement.
Start gratis proef