REST API · Bearer Token · JSON

Documentatie API Whapi.ro

Integreaza WhatsApp Business API in CRM, ERP, eCommerce sau aplicatii interne. Endpointurile de mai jos sunt generate pe baza exportului Postman si acopera mesaje, template-uri, campanii, contacte, grupuri, etichete si statusuri.

Base URL

https://app.whapi.ro/api

Vendor UID

{{vendorUid}}

Auth

Bearer {{bearerToken}}

curl -X POST "https://app.whapi.ro/api/{{vendorUid}}/contact/send-message" \
  -H "Authorization: Bearer {{bearerToken}}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "407XXXXXXXX",
    "message_body": "Buna ziua! Comanda dvs. a fost expediata."
  }'
Nu exista endpointuri care se potrivesc cautarii.
Prezentare

Structura API

Toate requesturile folosesc baza https://app.whapi.ro/api, identificatorul contului {{vendorUid}} in path si autentificare prin Bearer Token. Payloadurile sunt trimise in format JSON.

Mesaje

Text, media, template-uri, carusel si mesaje interactive.

Contacte

Creare, actualizare, listare, asignare agent si campuri custom.

Campanii

Programare campanii, listare si verificare status.

VariabilaDescriereExemplu
Base URLURL-ul de baza al API-ului.https://app.whapi.ro/api
{{vendorUid}}Identificatorul unic al contului vendor.vendor_uid
{{bearerToken}}Tokenul de acces folosit in headerul Authorization.eyJ...
{{phoneNumber}}Numarul destinatarului in format international, fara plus.407XXXXXXXX

Autentificare

Fiecare endpoint din colectia Postman foloseste autentificare de tip Bearer Token. Trimite tokenul in headerul Authorization.

Authorization: Bearer {{bearerToken}}
Content-Type: application/json
Accept: application/json

Nota: pastreaza tokenul doar pe server. Nu il expune in JavaScript public, aplicatii frontend sau repository-uri.

Mesaje

POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/send-message

Trimite mesaj text

Trimite un mesaj simplu catre un numar WhatsApp. Optional, poti crea contactul automat daca nu exista.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul destinatarului în format internațional, fără +
message_bodystringDaTextul mesajului de trimis
from_phone_number_idstringNuID-ul numărului sursă; dacă lipsește se folosește cel implicit
contactobjectNuCrează sau actualizează contactul dacă nu există deja
contact.groupsstringNuGrupuri separate prin virgulă, ex: grup1,grup2
contact.custom_fieldsobjectNuCâmpuri custom, ex: {"BDay":"2025-09-04"}
{
  "from_phone_number_id": "",
  "phone_number": "918856066529",
  "message_body": "your message body",
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2",
    "custom_fields": { "BDay": "2025-09-04" }
  }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/send-message" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "918856066529",
    "message_body": "your message body"
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/send-message');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer {bearerToken}',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number' => '918856066529',
        'message_body' => 'your message body',
    ]),
]);
echo curl_exec($ch);
curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/send-message',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer {bearerToken}',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      phone_number: '918856066529',
      message_body: 'your message body',
    }),
  }
);
const data = await res.json();
console.log(data);
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/send-message',
    headers={
        'Authorization': 'Bearer {bearerToken}',
        'Content-Type': 'application/json',
    },
    json={
        'phone_number': '918856066529',
        'message_body': 'your message body',
    }
)
print(response.json())
{
  "contact": {
    "status": "existing",
    "phone_number": "918856066529",
    "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "language_code": "en",
    "country": "india"
  },
  "message": {
    "whatsapp_business_phone_number_id": "669217672941135",
    "whatsapp_message_id": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSREE4MzBCNjRBQjY5NkNCQzVCAA==",
    "is_new_message": true,
    "body": "your message body",
    "status": "sent"
  }
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/send-media-message

Trimite mesaj media

Trimite imagine, video sau document prin URL public. Pentru documente, include si numele fisierului.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul destinatarului în format internațional, fără +
media_typestringDaTipul fișierului: image, video, document
media_urlstringDaURL public accesibil al fișierului media
captionstringNuLegenda pentru imagine sau video
file_namestringNuNumele afișat al fișierului pentru document
from_phone_number_idstringNuID-ul numărului sursă; dacă lipsește se folosește cel implicit
contactobjectNuCrează sau actualizează contactul dacă nu există
{
  "from_phone_number_id": "",
  "phone_number": "918856066529",
  "media_type": "document",
  "media_url": "https://images.pexels.com/photos/276267/pexels-photo-276267.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2",
  "caption": "your capation for image or video media types",
  "file_name": "your file name for document",
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/send-media-message" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "918856066529",
    "media_type": "document",
    "media_url": "https://example.com/document.pdf",
    "file_name": "your file name for document"
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/send-media-message');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer {bearerToken}',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number' => '918856066529',
        'media_type'   => 'document',
        'media_url'    => 'https://example.com/document.pdf',
        'file_name'    => 'your file name for document',
    ]),
]);
echo curl_exec($ch);
curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/send-media-message',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer {bearerToken}',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      phone_number: '918856066529',
      media_type: 'document',
      media_url: 'https://example.com/document.pdf',
      file_name: 'your file name for document',
    }),
  }
);
const data = await res.json();
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/send-media-message',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={
        'phone_number': '918856066529',
        'media_type': 'document',
        'media_url': 'https://example.com/document.pdf',
        'file_name': 'your file name for document',
    }
)
print(response.json())
{
  "contact": {
    "status": "existing",
    "phone_number": "918856066529",
    "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
    "first_name": "Johan",
    "last_name": "Doe"
  },
  "message": {
    "whatsapp_business_phone_number_id": "669217672941135",
    "whatsapp_message_id": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSREE4MzBCNjRBQjY5NkNCQzVCAA==",
    "is_new_message": true,
    "body": null,
    "status": "sent",
    "media": {
      "type": "document",
      "link": "https://example.com/document.pdf",
      "caption": null,
      "file_name": "your file name for document"
    }
  }
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/send-interactive-message

Trimite mesaj interactiv

Trimite un mesaj cu butoane, CTA URL sau lista. Alege tipul prin interactive_type.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul destinatarului
interactive_typestringDaTipul mesajului: button, cta_url, list
header_typestringDatext, image, video, document
body_textstringDaTextul principal al mesajului
buttonsobjectNuMax 3 butoane când interactive_type este button
cta_urlobjectNuURL și text buton când tipul este cta_url
list_dataobjectNuSecțiuni și rânduri când tipul este list
header_textstringNuText header când header_type este text
media_linkstringNuURL media pentru header de tip imagine/video/document
footer_textstringNuText afișat în subsolul mesajului
from_phone_number_idstringNuID-ul numărului sursă
contactobjectNuCrează contactul dacă nu există
{
  "from_phone_number_id": "",
  "phone_number": "918856066529",
  "interactive_type": "button",
  "media_link": "",
  "header_type": "text",
  "header_text": "Interactive Text Header",
  "body_text": "Interactive bot 1",
  "footer_text": "footer text",
  "buttons": { "1": "button 1", "2": "button 2", "3": "button 3" },
  "cta_url": { "display_text": "CTA button Text", "url": "CTA button URL" },
  "list_data": {
    "button_text": "List Msg Btn Label",
    "sections": {
      "section_1": {
        "title": "Section 1", "id": "section_1",
        "rows": { "row_1": { "id": "row_1", "row_id": "1", "title": "Row 1 title", "description": "row 1 description" } }
      },
      "section_2": {
        "title": "Section 2", "id": "section_2",
        "rows": { "row_1": { "id": "row_1", "row_id": "1", "title": "row 1 title", "description": "row 1 description" } }
      }
    }
  },
  "contact": { "first_name": "Johan", "last_name": "Doe", "email": "johndoe@doamin.com", "country": "india", "language_code": "en", "groups": "examplegroup1,examplegroup2" }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/send-interactive-message" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "918856066529",
    "interactive_type": "button",
    "header_type": "text",
    "header_text": "Interactive Text Header",
    "body_text": "Interactive bot 1",
    "buttons": {"1": "button 1", "2": "button 2", "3": "button 3"}
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/send-interactive-message');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number'    => '918856066529',
        'interactive_type'=> 'button',
        'header_type'     => 'text',
        'header_text'     => 'Interactive Text Header',
        'body_text'       => 'Interactive bot 1',
        'buttons'         => ['1' => 'button 1', '2' => 'button 2', '3' => 'button 3'],
    ]),
]);
echo curl_exec($ch);
curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/send-interactive-message',
  {
    method: 'POST',
    headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
    body: JSON.stringify({
      phone_number: '918856066529',
      interactive_type: 'button',
      header_type: 'text',
      header_text: 'Interactive Text Header',
      body_text: 'Interactive bot 1',
      buttons: { '1': 'button 1', '2': 'button 2', '3': 'button 3' },
    }),
  }
);
const data = await res.json();
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/send-interactive-message',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={
        'phone_number': '918856066529',
        'interactive_type': 'button',
        'header_type': 'text',
        'header_text': 'Interactive Text Header',
        'body_text': 'Interactive bot 1',
        'buttons': {'1': 'button 1', '2': 'button 2', '3': 'button 3'},
    }
)
print(response.json())
{
  "contact": {
    "status": "existing",
    "phone_number": "918856066529",
    "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
    "first_name": "Johan",
    "last_name": "Doe"
  },
  "message": {
    "whatsapp_business_phone_number_id": "669217672941135",
    "whatsapp_message_id": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSREE4MzBCNjRBQjY5NkNCQzVCAA==",
    "is_new_message": true,
    "body": "Interactive bot 1",
    "status": "sent"
  }
}

Template-uri

POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/send-template-message

Trimite template aprobat

Foloseste un template WhatsApp aprobat de Meta. Campurile field_1–field_4, header_field_1 si button_0–button_1 completeaza variabilele template-ului.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul destinatarului
template_namestringDaNumele exact al template-ului aprobat în Meta
template_languagestringDaCodul limbii template-ului, ex: en, ro
header_imagestringNuURL imagine pentru header
header_videostringNuURL video pentru header
header_documentstringNuURL document pentru header
header_field_1stringNuVariabila dinamică pentru header text
field_1 … field_4stringNuVariabilele corpului template-ului, în ordine
button_0, button_1stringNuVariabile pentru butoanele template-ului
copy_codestringNuCodul promoțional pentru butoane de tip Copy Code
location_latitude, location_longitudestringNuCoordonate locație pentru header de tip locație
from_phone_number_idstringNuID-ul numărului sursă
contactobjectNuCrează contactul dacă nu există
{
  "from_phone_number_id": "{{fromPhoneNumberId}}",
  "phone_number": "{{phoneNumber}}",
  "template_name": "your_template_name",
  "template_language": "en",
  "header_image": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",
  "header_video": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document_name": "{full_name}",
  "header_field_1": "{full_name}",
  "location_latitude": "22.22",
  "location_longitude": "22.22",
  "location_name": "{first_name}",
  "location_address": "{country}",
  "field_1": "{Age}",
  "field_2": "{full_name}",
  "field_3": "{first_name}",
  "field_4": "{last_name}",
  "button_0": "{email}",
  "button_1": "{phone_number}",
  "copy_code": "YourCode",
  "contact": {
    "first_name": "Johan",
    "last_name": "Doe",
    "email": "johndoe@doamin.com",
    "country": "india",
    "language_code": "en",
    "groups": "examplegroup1,examplegroup2"
  }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/send-template-message" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "918856066529",
    "template_name": "your_template_name",
    "template_language": "en",
    "field_1": "John",
    "field_2": "Doe"
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/send-template-message');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number'      => '918856066529',
        'template_name'     => 'your_template_name',
        'template_language' => 'en',
        'field_1'           => 'John',
        'field_2'           => 'Doe',
    ]),
]);
echo curl_exec($ch);
curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/send-template-message',
  {
    method: 'POST',
    headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
    body: JSON.stringify({
      phone_number: '918856066529',
      template_name: 'your_template_name',
      template_language: 'en',
      field_1: 'John',
      field_2: 'Doe',
    }),
  }
);
const data = await res.json();
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/send-template-message',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={
        'phone_number': '918856066529',
        'template_name': 'your_template_name',
        'template_language': 'en',
        'field_1': 'John',
        'field_2': 'Doe',
    }
)
print(response.json())
{
  "contact": {
    "status": "existing",
    "phone_number": "918856066529",
    "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
    "first_name": "Johan",
    "last_name": "Doe"
  },
  "message": {
    "whatsapp_business_phone_number_id": "669217672941135",
    "whatsapp_message_id": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSREE4MzBCNjRBQjY5NkNCQzVCAA==",
    "is_new_message": true,
    "body": null,
    "status": "sent"
  }
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/contact/template-list

Lista template-uri

Returneaza template-urile disponibile cu suport pentru paginare si filtrare dupa status (ex: APPROVED).

ParametruTipObligatoriuDescriere
pagenumberNuNumărul paginii (implicit 1)
page_sizenumberNuRezultate per pagină
search_termstringNuFiltrează după status (ex: APPROVED) sau nume
curl "https://app.whapi.ro/api/{vendorUid}/contact/template-list?search_term=APPROVED" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/template-list?search_term=APPROVED');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch);
curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/template-list?search_term=APPROVED',
  { headers: { 'Authorization': 'Bearer {bearerToken}' } }
);
const data = await res.json();
import requests
r = requests.get(
    'https://app.whapi.ro/api/{vendorUid}/contact/template-list',
    params={'search_term': 'APPROVED'},
    headers={'Authorization': 'Bearer {bearerToken}'}
)
print(r.json())
{
  "total": 2,
  "page": 1,
  "page_size": 10,
  "data": [
    {
      "uid": "tpl_abc123",
      "name": "your_template_name",
      "language": "en",
      "status": "APPROVED",
      "category": "MARKETING"
    },
    {
      "uid": "tpl_def456",
      "name": "account_setup_template",
      "language": "en_US",
      "status": "APPROVED",
      "category": "UTILITY"
    }
  ]
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/send-carousel-template-message

Trimite template carusel

Trimite un template de tip carusel. Sunt necesare minimum 2 carduri si maximum 10 carduri. Tipurile de butoane pot fi mixate.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul destinatarului
template_namestringDaNumele template-ului de tip carousel
template_languagestringDaCodul limbii, ex: en_us
carousel_templatesarrayDaArray cu cardurile caruselului (min 2, max 10)
carousel_templates[].media_typestringDaIMAGE sau VIDEO
carousel_templates[].media_urlstringDaURL public al imaginii sau videoului
carousel_templates[].button_typearrayDaQUICK_REPLY, PHONE_NUMBER, URL (min 1, max 2)
field_1 … field_3stringNuVariabilele corpului template-ului (dacă există)
from_phone_number_idstringNuID-ul numărului sursă
contactobjectNuCrează contactul dacă nu există
{
  "from_phone_number_id": "669217672941135",
  "phone_number": "{{phoneNumber}}",
  "template_name": "carsoule_template_131",
  "template_language": "en_us",
  "field_1": "{Age}",
  "field_2": "{full_name}",
  "field_3": "{last_name}",
  "carousel_templates": [
    {
      "media_type": "IMAGE",
      "media_url": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",
      "button_type": ["QUICK_REPLY", "PHONE_NUMBER", "URL"]
    },
    {
      "media_type": "IMAGE",
      "media_url": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",
      "button_type": ["QUICK_REPLY", "PHONE_NUMBER", "URL"]
    }
  ],
  "contact": {
    "first_name": "Johan", "last_name": "Doe",
    "email": "johndoe@doamin.com", "country": "india",
    "language_code": "en", "groups": "examplegroup1,examplegroup2"
  }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/send-carousel-template-message" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "918856066529",
    "template_name": "carsoule_template_131",
    "template_language": "en_us",
    "carousel_templates": [
      {"media_type":"IMAGE","media_url":"https://example.com/img1.jpg","button_type":["QUICK_REPLY"]},
      {"media_type":"IMAGE","media_url":"https://example.com/img2.jpg","button_type":["QUICK_REPLY"]}
    ]
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/send-carousel-template-message');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number'      => '918856066529',
        'template_name'     => 'carsoule_template_131',
        'template_language' => 'en_us',
        'carousel_templates'=> [
            ['media_type'=>'IMAGE','media_url'=>'https://example.com/img1.jpg','button_type'=>['QUICK_REPLY']],
            ['media_type'=>'IMAGE','media_url'=>'https://example.com/img2.jpg','button_type'=>['QUICK_REPLY']],
        ],
    ]),
]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact/send-carousel-template-message',
  {
    method: 'POST',
    headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
    body: JSON.stringify({
      phone_number: '918856066529',
      template_name: 'carsoule_template_131',
      template_language: 'en_us',
      carousel_templates: [
        { media_type: 'IMAGE', media_url: 'https://example.com/img1.jpg', button_type: ['QUICK_REPLY'] },
        { media_type: 'IMAGE', media_url: 'https://example.com/img2.jpg', button_type: ['QUICK_REPLY'] },
      ],
    }),
  }
);
const data = await res.json();
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/send-carousel-template-message',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={
        'phone_number': '918856066529',
        'template_name': 'carsoule_template_131',
        'template_language': 'en_us',
        'carousel_templates': [
            {'media_type': 'IMAGE', 'media_url': 'https://example.com/img1.jpg', 'button_type': ['QUICK_REPLY']},
            {'media_type': 'IMAGE', 'media_url': 'https://example.com/img2.jpg', 'button_type': ['QUICK_REPLY']},
        ],
    }
)
print(response.json())
{
  "contact": {
    "status": "existing",
    "phone_number": "918856066529",
    "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4"
  },
  "message": {
    "whatsapp_business_phone_number_id": "669217672941135",
    "whatsapp_message_id": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSREE4MzBCNjRBQjY5NkNCQzVCAA==",
    "is_new_message": true,
    "body": null,
    "status": "sent"
  }
}

Campanii

POSThttps://app.whapi.ro/api/{{vendorUid}}/campaign/schedule

Programeaza campanie

Creeaza o campanie pe baza unui template si o programeaza pentru un grup de contacte. Campurile de template sunt identice cu endpoint-ul send-template-message.

CâmpTipObligatoriuDescriere
titlestringDaTitlul intern al campaniei
template_namestringDaNumele template-ului aprobat
template_languagestringDaCodul limbii template-ului
contact_grouparrayDaGrupuri de contacte țintă sau ["all_contacts"]
timezonestringDaFusul orar, ex: Europe/Bucharest
schedule_atstringDaData și ora trimiterii, format: YYYY-MM-DDTHH:mm
field_1 … field_4stringNuVariabilele corpului template-ului
contact_labelsstringNuFiltrează destinatarii după etichete
expire_atstringNuData la care campania expiră
from_phone_number_idstringNuID-ul numărului sursă
{
  "template_name": "account_setup_template",
  "template_language": "en_US",
  "header_image": "https://cdn.pixabay.com/photo/2015/01/07/15/51/woman-591576_1280.jpg",
  "header_video": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4",
  "header_document_name": "{full_name}",
  "header_field_1": "{full_name}",
  "location_latitude": "22.22",
  "location_longitude": "22.22",
  "location_name": "{first_name}",
  "location_address": "{country}",
  "field_1": "{Age}",
  "field_2": "{full_name}",
  "field_3": "{first_name}",
  "field_4": "{last_name}",
  "button_0": "{email}",
  "button_1": "{phone_number}",
  "copy_code": "YourCode",
  "title": "test campaign from API 4",
  "contact_group": ["all_contacts"],
  "contact_labels": "",
  "restrict_by_templated_contact_language": "false",
  "timezone": "Asia/Kolkata",
  "schedule_at": "2026-03-31T12:42",
  "expire_at": ""
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/campaign/schedule" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "test campaign from API 4",
    "template_name": "account_setup_template",
    "template_language": "en_US",
    "contact_group": ["all_contacts"],
    "timezone": "Asia/Kolkata",
    "schedule_at": "2026-03-31T12:42"
  }'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/campaign/schedule');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title'             => 'test campaign from API 4',
        'template_name'     => 'account_setup_template',
        'template_language' => 'en_US',
        'contact_group'     => ['all_contacts'],
        'timezone'          => 'Asia/Kolkata',
        'schedule_at'       => '2026-03-31T12:42',
    ]),
]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/campaign/schedule', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    title: 'test campaign from API 4',
    template_name: 'account_setup_template',
    template_language: 'en_US',
    contact_group: ['all_contacts'],
    timezone: 'Asia/Kolkata',
    schedule_at: '2026-03-31T12:42',
  }),
});
const data = await res.json();
import requests

response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/campaign/schedule',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={
        'title': 'test campaign from API 4',
        'template_name': 'account_setup_template',
        'template_language': 'en_US',
        'contact_group': ['all_contacts'],
        'timezone': 'Asia/Kolkata',
        'schedule_at': '2026-03-31T12:42',
    }
)
print(response.json())
{
  "uid": "2035045d-17e1-49d2-b4ba-2e4054124d33",
  "title": "test campaign from API 4",
  "status": "scheduled",
  "template_name": "account_setup_template",
  "schedule_at": "2026-03-31T12:42:00",
  "timezone": "Asia/Kolkata",
  "total_contacts": 150
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/campaign

Lista campanii

Returneaza campaniile existente cu suport pentru paginare si cautare.

ParametruTipObligatoriuDescriere
pagenumberNuNumărul paginii
page_sizenumberNuRezultate per pagină
search_termstringNuFiltrează după titlul campaniei
curl "https://app.whapi.ro/api/{vendorUid}/campaign" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/campaign');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/campaign', {
  headers: { 'Authorization': 'Bearer {bearerToken}' }
});
const data = await res.json();
import requests
r = requests.get('https://app.whapi.ro/api/{vendorUid}/campaign', headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "total": 5,
  "page": 1,
  "page_size": 10,
  "data": [
    {
      "uid": "2035045d-17e1-49d2-b4ba-2e4054124d33",
      "title": "test campaign from API 4",
      "status": "scheduled",
      "template_name": "account_setup_template",
      "schedule_at": "2026-03-31T12:42:00",
      "total_contacts": 150
    }
  ]
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/campaign-status/{campaign_uid}

Status campanie

Verifica statusul detaliat al unei campanii: numar de mesaje trimise, livrate, citite si esuate.

ParametruTipObligatoriuDescriere
campaign_uidstringDaUID-ul campaniei, transmis în path (nu query string)
curl "https://app.whapi.ro/api/{vendorUid}/campaign-status/2035045d-17e1-49d2-b4ba-2e4054124d33" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$uid = '2035045d-17e1-49d2-b4ba-2e4054124d33';
$ch = curl_init("https://app.whapi.ro/api/{vendorUid}/campaign-status/{$uid}");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const uid = '2035045d-17e1-49d2-b4ba-2e4054124d33';
const res = await fetch(`https://app.whapi.ro/api/{vendorUid}/campaign-status/${uid}`, {
  headers: { 'Authorization': 'Bearer {bearerToken}' }
});
const data = await res.json();
import requests
uid = '2035045d-17e1-49d2-b4ba-2e4054124d33'
r = requests.get(f'https://app.whapi.ro/api/{{vendorUid}}/campaign-status/{uid}', headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "uid": "2035045d-17e1-49d2-b4ba-2e4054124d33",
  "title": "test campaign from API 4",
  "status": "scheduled",
  "template_name": "account_setup_template",
  "total_contacts": 150,
  "sent": 0,
  "delivered": 0,
  "read": 0,
  "failed": 0,
  "schedule_at": "2026-03-31T12:42:00",
  "timezone": "Asia/Kolkata"
}

Contacte

POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/create

Creeaza contact

Adauga un contact nou cu grupuri si campuri custom optionale.

CâmpTipObligatoriuDescriere
phone_numberstringDaNumărul de telefon în format internațional, fără +
first_namestringDaPrenumele contactului
last_namestringDaNumele de familie
emailstringDaAdresa de email
countrystringNuȚara contactului
language_codestringNuCodul limbii, ex: en, ro
groupsstringNuGrupuri separate prin virgulă
custom_fieldsobjectNuCâmpuri personalizate, ex: {"BDay":"2025-09-01"}
{
  "phone_number": "4885057299",
  "first_name": "ghfdhf",
  "last_name": "jghjghj",
  "email": "cvbcbcvb@doamin.com",
  "country": "india",
  "language_code": "en",
  "groups": "",
  "custom_fields": { "BDay": "2025-09-01" }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/create" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"phone_number":"4885057299","first_name":"ghfdhf","last_name":"jghjghj","email":"cvbcbcvb@doamin.com","country":"india","language_code":"en"}'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/create');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number'  => '4885057299',
        'first_name'    => 'ghfdhf',
        'last_name'     => 'jghjghj',
        'email'         => 'cvbcbcvb@doamin.com',
        'country'       => 'india',
        'language_code' => 'en',
        'custom_fields' => ['BDay' => '2025-09-01'],
    ]),
]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/contact/create', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    phone_number: '4885057299', first_name: 'ghfdhf',
    last_name: 'jghjghj', email: 'cvbcbcvb@doamin.com',
    country: 'india', language_code: 'en',
    custom_fields: { BDay: '2025-09-01' },
  }),
});
const data = await res.json();
import requests
response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/create',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={'phone_number':'4885057299','first_name':'ghfdhf','last_name':'jghjghj',
          'email':'cvbcbcvb@doamin.com','country':'india','language_code':'en',
          'custom_fields':{'BDay':'2025-09-01'}}
)
print(response.json())
{
  "status": "new",
  "phone_number": "4885057299",
  "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "first_name": "ghfdhf",
  "last_name": "jghjghj",
  "email": "cvbcbcvb@doamin.com",
  "language_code": "en",
  "country": "india",
  "custom_fields": { "BDay": "2025-09-01" }
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/update/{{phoneNumber}}

Actualizeaza contact

Actualizeaza doar campurile trimise. Trimite numai campurile pe care doresti sa le modifici — valorile goale pot sterge informatii existente.

CâmpTipObligatoriuDescriere
phoneNumberstringDaNumărul contactului — transmis în path, nu în body
first_namestringNuPrenumele
last_namestringNuNumele de familie
emailstringNuAdresa de email
countrystringNuȚara
language_codestringNuCodul limbii
whatsapp_opt_outbooleanNuDezabonare WhatsApp marketing
enable_ai_botbooleanNuActivează sau dezactivează bot-ul AI pentru acest contact
groupsstringNuGrupuri separate prin virgulă
custom_fieldsobjectNuCâmpuri personalizate
{
  "first_name": "Johan",
  "last_name": "Doe",
  "email": "nikhil1991@livelyworks.net",
  "country": "91",
  "language_code": "mr",
  "whatsapp_opt_out": false,
  "enable_ai_bot": true,
  "groups": "examplegroup1,examplegroup9",
  "custom_fields": { "BDay": "2025-09-04" }
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/update/918856066529" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"Johan","last_name":"Doe","enable_ai_bot":true}'
<?php
$phone = '918856066529';
$ch = curl_init("https://app.whapi.ro/api/{vendorUid}/contact/update/{$phone}");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'first_name'   => 'Johan', 'last_name' => 'Doe',
        'enable_ai_bot'=> true, 'groups' => 'examplegroup1,examplegroup9',
    ]),
]);
echo curl_exec($ch); curl_close($ch);
const phone = '918856066529';
const res = await fetch(`https://app.whapi.ro/api/{vendorUid}/contact/update/${phone}`, {
  method: 'POST',
  headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
  body: JSON.stringify({ first_name: 'Johan', last_name: 'Doe', enable_ai_bot: true }),
});
const data = await res.json();
import requests
phone = '918856066529'
response = requests.post(
    f'https://app.whapi.ro/api/{{vendorUid}}/contact/update/{phone}',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={'first_name': 'Johan', 'last_name': 'Doe', 'enable_ai_bot': True}
)
print(response.json())
{
  "status": "updated",
  "phone_number": "918856066529",
  "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
  "first_name": "Johan",
  "last_name": "Doe",
  "email": "nikhil1991@livelyworks.net",
  "language_code": "mr",
  "country": "91"
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/contacts

Lista contacte

Returneaza contactele cu suport pentru paginare si cautare dupa nume, email sau numar.

ParametruTipObligatoriuDescriere
pagenumberNuNumărul paginii
page_sizenumberNuRezultate per pagină
search_termstringNuFiltrează contactele după text
curl "https://app.whapi.ro/api/{vendorUid}/contacts?page_size=5&search_term=vinod" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contacts?' . http_build_query(['page_size'=>5,'search_term'=>'vinod']));
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const params = new URLSearchParams({ page_size: 5, search_term: 'vinod' });
const res = await fetch(`https://app.whapi.ro/api/{vendorUid}/contacts?${params}`, {
  headers: { 'Authorization': 'Bearer {bearerToken}' }
});
const data = await res.json();
import requests
r = requests.get('https://app.whapi.ro/api/{vendorUid}/contacts',
    params={'page_size': 5, 'search_term': 'vinod'},
    headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "total": 125,
  "page": 1,
  "page_size": 5,
  "data": [
    {
      "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
      "phone_number": "918856066529",
      "first_name": "Johan",
      "last_name": "Doe",
      "email": "johndoe@doamin.com"
    }
  ]
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/contact

Contact individual

Cauta si returneaza datele complete ale unui contact dupa numar de telefon sau adresa de email.

ParametruTipObligatoriuDescriere
phone_number_or_emailstringDaNumărul de telefon sau emailul contactului de căutat
curl "https://app.whapi.ro/api/{vendorUid}/contact?phone_number_or_email=918856066529" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact?phone_number_or_email=918856066529');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch(
  'https://app.whapi.ro/api/{vendorUid}/contact?phone_number_or_email=918856066529',
  { headers: { 'Authorization': 'Bearer {bearerToken}' } }
);
const data = await res.json();
import requests
r = requests.get('https://app.whapi.ro/api/{vendorUid}/contact',
    params={'phone_number_or_email': '918856066529'},
    headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "uid": "2c3199e8-ba01-4988-b752-a95250cc3ea4",
  "phone_number": "918856066529",
  "first_name": "Johan",
  "last_name": "Doe",
  "email": "johndoe@doamin.com",
  "language_code": "en",
  "country": "india",
  "whatsapp_opt_out": false,
  "enable_ai_bot": false,
  "groups": ["examplegroup1", "examplegroup2"],
  "labels": [],
  "custom_fields": { "BDay": "2025-09-04" },
  "created_at": "2025-01-15T10:00:00Z"
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/assign-team-member

Asigneaza membru echipa si bot

Asigneaza contactul unui agent si controleaza botul AI si botul de raspuns automat.

CâmpTipObligatoriuDescriere
username_or_emailstringDaUsername sau email-ul membrului echipei
phone_numberstringDaNumărul contactului de asignat
enable_ai_botnumberNu1 pentru activat, 0 pentru dezactivat
enable_reply_botnumberNu1 pentru activat, 0 pentru dezactivat
{
  "username_or_email": "team123@test.com",
  "phone_number": "{{phoneNumber}}",
  "enable_ai_bot": 0,
  "enable_reply_bot": 0
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/assign-team-member" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"username_or_email":"team123@test.com","phone_number":"918856066529","enable_ai_bot":0,"enable_reply_bot":0}'
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/assign-team-member');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['username_or_email'=>'team123@test.com','phone_number'=>'918856066529','enable_ai_bot'=>0,'enable_reply_bot'=>0]),
]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/contact/assign-team-member', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer {bearerToken}', 'Content-Type': 'application/json' },
  body: JSON.stringify({ username_or_email: 'team123@test.com', phone_number: '918856066529', enable_ai_bot: 0, enable_reply_bot: 0 }),
});
const data = await res.json();
import requests
response = requests.post(
    'https://app.whapi.ro/api/{vendorUid}/contact/assign-team-member',
    headers={'Authorization': 'Bearer {bearerToken}'},
    json={'username_or_email':'team123@test.com','phone_number':'918856066529','enable_ai_bot':0,'enable_reply_bot':0}
)
print(response.json())
{
  "success": true,
  "message": "Contact assigned to team member."
}

Grupuri si etichete

GEThttps://app.whapi.ro/api/{{vendorUid}}/contact/groups

Lista grupuri contacte

Returneaza grupurile disponibile pentru segmentarea contactelor.

ParametruTipObligatoriuDescriere
page_sizenumberNuRezultate per pagină (ex: 50)
search_termstringNuFiltrează după numele grupului
pagenumberNuNumărul paginii
curl "https://app.whapi.ro/api/{vendorUid}/contact/groups?page_size=50" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/groups?page_size=50');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/contact/groups?page_size=50', {
  headers: { 'Authorization': 'Bearer {bearerToken}' }
});
const data = await res.json();
import requests
r = requests.get('https://app.whapi.ro/api/{vendorUid}/contact/groups',
    params={'page_size': 50}, headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "total": 3,
  "page": 1,
  "page_size": 50,
  "data": [
    { "uid": "c40921c7-bedb-4c71-97ac-e6368c93a520", "name": "examplegroup1" },
    { "uid": "d3f1559a-c447-4165-8c39-d929c3691400", "name": "examplegroup2" },
    { "uid": "053d4c84-991a-4f49-a7f7-5ef213e28138", "name": "VIP Clients" }
  ]
}
GEThttps://app.whapi.ro/api/{{vendorUid}}/contact/labels-tags

Lista etichete si taguri

Returneaza etichetele disponibile pentru clasificarea si filtrarea contactelor.

ParametruTipObligatoriuDescriere
page_sizenumberNuRezultate per pagină
search_termstringNuFiltrează după numele etichetei
pagenumberNuNumărul paginii
curl "https://app.whapi.ro/api/{vendorUid}/contact/labels-tags" \
  -H "Authorization: Bearer {bearerToken}"
const res = await fetch('https://app.whapi.ro/api/{vendorUid}/contact/labels-tags', {
  headers: { 'Authorization': 'Bearer {bearerToken}' }
});
const data = await res.json();
{
  "total": 2,
  "page": 1,
  "page_size": 10,
  "data": [
    { "uid": "8bcd35b1-5e06-45e3-aa5a-394eda85b344", "name": "Hot Lead" },
    { "uid": "aae646a0-d635-4d63-8bce-697a9f2d98d2", "name": "Opted In" }
  ]
}
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/assign-groups

Asigneaza grupuri la contacte

Adauga unul sau mai multe contacte in unul sau mai multe grupuri simultan.

{
  "contacts_uid": ["2c3199e8-ba01-4988-b752-a95250cc3ea4"],
  "groups_uid": [
    "c40921c7-bedb-4c71-97ac-e6368c93a520",
    "d3f1559a-c447-4165-8c39-d929c3691400",
    "053d4c84-991a-4f49-a7f7-5ef213e28138",
    "5245bd84-ff70-4ee9-a0a1-eaf479cd3344",
    "aa8af275-d3eb-411d-ae9d-e9249982c28f"
  ]
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/assign-groups" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"contacts_uid":["2c3199e8-ba01-4988-b752-a95250cc3ea4"],"groups_uid":["c40921c7-bedb-4c71-97ac-e6368c93a520"]}'
{ "success": true, "assigned": 5 }
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/unassign-groups

Scoate contacte din grupuri

Elimina legatura dintre contactele selectate si grupurile trimise.

{
  "contacts_uid": [
    "2c3199e8-ba01-4988-b752-a95250cc3ea4",
    "333c8ef2-2f92-485b-bf7b-f0106fc10aa6",
    "afaf84ad-e267-4256-b21a-99842a5c80f6"
  ],
  "groups_uid": [
    "c40921c7-bedb-4c71-97ac-e6368c93a520",
    "d3f1559a-c447-4165-8c39-d929c3691400",
    "053d4c84-991a-4f49-a7f7-5ef213e28138",
    "5245bd84-ff70-4ee9-a0a1-eaf479cd3344",
    "aa8af275-d3eb-411d-ae9d-e9249982c28f",
    "cbc08e5c-5078-40b6-94d3-a4ec48ccdc9d"
  ]
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/unassign-groups" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"contacts_uid":["2c3199e8-ba01-4988-b752-a95250cc3ea4"],"groups_uid":["c40921c7-bedb-4c71-97ac-e6368c93a520"]}'
{ "success": true, "unassigned": 6 }
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/assign-labels

Asigneaza etichete la contacte

Adauga etichete la unul sau mai multe contacte simultan.

{
  "contacts_uid": ["2c3199e8-ba01-4988-b752-a95250cc3ea4"],
  "labels_uid": [
    "8bcd35b1-5e06-45e3-aa5a-394eda85b344",
    "aae646a0-d635-4d63-8bce-697a9f2d98d2"
  ]
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/assign-labels" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"contacts_uid":["2c3199e8-ba01-4988-b752-a95250cc3ea4"],"labels_uid":["8bcd35b1-5e06-45e3-aa5a-394eda85b344"]}'
{ "success": true, "assigned": 2 }
POSThttps://app.whapi.ro/api/{{vendorUid}}/contact/unassign-labels

Scoate etichete de pe contacte

Elimina etichetele trimise de pe contactele selectate.

{
  "contacts_uid": ["2c3199e8-ba01-4988-b752-a95250cc3ea4"],
  "labels_uid": [
    "8bcd35b1-5e06-45e3-aa5a-394eda85b344",
    "aae646a0-d635-4d63-8bce-697a9f2d98d2"
  ]
}
curl -X POST "https://app.whapi.ro/api/{vendorUid}/contact/unassign-labels" \
  -H "Authorization: Bearer {bearerToken}" \
  -H "Content-Type: application/json" \
  -d '{"contacts_uid":["2c3199e8-ba01-4988-b752-a95250cc3ea4"],"labels_uid":["8bcd35b1-5e06-45e3-aa5a-394eda85b344"]}'
{ "success": true, "unassigned": 2 }

Statusuri

GEThttps://app.whapi.ro/api/{{vendorUid}}/contact/message-status

Status mesaj

Verifica statusul unui mesaj dupa wamid (WhatsApp Message ID) sau, optional, dupa log_uid intern.

ParametruTipObligatoriuDescriere
wamidstringDaWhatsApp Message ID returnat la trimiterea mesajului
log_uidstringNuUID-ul intern al log-ului de mesaj
curl "https://app.whapi.ro/api/{vendorUid}/contact/message-status?wamid=wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSQkUxODQ2QkU5QTc3QkQ5NzZCAA==" \
  -H "Authorization: Bearer {bearerToken}"
<?php
$wamid = 'wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSQkUxODQ2QkU5QTc3QkQ5NzZCAA==';
$ch = curl_init('https://app.whapi.ro/api/{vendorUid}/contact/message-status?' . http_build_query(['wamid' => $wamid]));
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer {bearerToken}']]);
echo curl_exec($ch); curl_close($ch);
const wamid = 'wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSQkUxODQ2QkU5QTc3QkQ5NzZCAA==';
const res = await fetch(
  `https://app.whapi.ro/api/{vendorUid}/contact/message-status?wamid=${encodeURIComponent(wamid)}`,
  { headers: { 'Authorization': 'Bearer {bearerToken}' } }
);
const data = await res.json();
import requests
wamid = 'wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSQkUxODQ2QkU5QTc3QkQ5NzZCAA=='
r = requests.get('https://app.whapi.ro/api/{vendorUid}/contact/message-status',
    params={'wamid': wamid}, headers={'Authorization': 'Bearer {bearerToken}'})
print(r.json())
{
  "wamid": "wamid.HBgMOTE4ODU2MDY2NTI5FQIAERgSQkUxODQ2QkU5QTc3QkQ5NzZCAA==",
  "status": "read",
  "timestamp": "2026-01-15T10:30:00Z"
}
Webhooks — Evenimente Incoming

Webhooks

Whapi.ro trimite notificări HTTP POST către URL-ul tău configurat ori de câte ori apare un eveniment: mesaj primit, status actualizat, contact nou. Payload-ul este identic pentru toate tipurile de evenimente, câmpurile relevante variind în funcție de tip.

1

Configurează URL

Adaugă URL-ul endpoint-ului tău în Setări → Webhook din platformă

2

Eveniment apare

Un contact trimite un mesaj sau statusul unui mesaj se schimbă

3

Primești POST

Whapi.ro trimite un HTTP POST cu payload JSON la URL-ul tău

Securitate: Validează originea request-ului verificând IP-urile sau un secret header configurat în platformă. Răspunde cu HTTP 200 în max. 5 secunde — altfel Whapi.ro va retrimite.

POST https://your-server.com/webhook — eveniment primit de la Whapi.ro

Structura payload webhook

Câmpul message.status este null pentru mesaje primite si populat (sent, delivered, read, failed) pentru actualizări de status. Câmpul message.media apare doar când mesajul conține un fișier.

CâmpTipDescriere
contact.statusstringexisting, updated sau new
contact.uidstringUID-ul intern al contactului
message.whatsapp_message_idstringwamid-ul mesajului
message.is_new_messagebooleantrue pentru mesaje noi, false pentru actualizări status
message.bodystringTextul mesajului (null pentru media)
message.statusstringStatusul mesajului: sent, delivered, read, failed (null pentru mesaje incoming)
message.mediaobjectPrezent doar când mesajul conține un fișier media
whatsapp_webhook_payloadobjectPayload-ul original WhatsApp nemodificat
{
  "contact": {
    "status": "existing/updated/new",
    "phone_number": "XXXXXXXXXX",
    "uid": "XXXXXXXXXX",
    "first_name": "XXXXXXXXXX",
    "last_name": "XXXXXXXXXX",
    "email": "XXXXXX@XXXXXXXXXX.com",
    "language_code": "en",
    "country": "XXXX"
  },
  "message": {
    "whatsapp_business_phone_number_id": "XXXXXXXXXX",
    "whatsapp_message_id": "wamid.XXXXXXXXXX",
    "replied_to_whatsapp_message_id": "wamid.XXXXXXXXXX",
    "is_new_message": true,
    "body": null,
    "status": null,
    "media": {
      "type": "image",
      "link": "link to media",
      "caption": null,
      "mime_type": "image/jpeg",
      "file_name": "XXXXXXXXXX",
      "original_filename": "XXXXXXXXXX"
    }
  },
  "whatsapp_webhook_payload": {}
}
<?php
// webhook.php — endpoint configurat în platforma Whapi.ro
$payload = json_decode(file_get_contents('php://input'), true);

if (!$payload) {
    http_response_code(400);
    exit;
}

$contact = $payload['contact'] ?? [];
$message = $payload['message'] ?? [];

if ($message['is_new_message'] ?? false) {
    // Mesaj nou primit de la $contact['phone_number']
    $text  = $message['body'];
    $media = $message['media'] ?? null;
    // procesează mesajul...
} else {
    // Actualizare status: sent / delivered / read / failed
    $status = $message['status'];
    $wamid  = $message['whatsapp_message_id'];
    // actualizează DB...
}

http_response_code(200);
echo json_encode(['received' => true]);
// Express.js webhook handler
app.post('/webhook', express.json(), (req, res) => {
  const { contact, message } = req.body;

  if (message?.is_new_message) {
    // Mesaj nou primit
    console.log(`Mesaj de la ${contact.phone_number}: ${message.body}`);
    if (message.media) {
      console.log(`Media: ${message.media.type} — ${message.media.link}`);
    }
  } else {
    // Actualizare status mesaj
    console.log(`Status ${message.status} pentru wamid ${message.whatsapp_message_id}`);
  }

  res.json({ received: true }); // Răspunde rapid cu 200
});
# Flask webhook handler
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.get_json()
    contact = data.get('contact', {})
    message = data.get('message', {})

    if message.get('is_new_message'):
        print(f"Mesaj de la {contact['phone_number']}: {message.get('body')}")
        if message.get('media'):
            print(f"Media: {message['media']['type']} — {message['media']['link']}")
    else:
        print(f"Status {message.get('status')} pentru {message.get('whatsapp_message_id')}")

    return jsonify({'received': True}), 200

Erori si bune practici

CodSemnificatieCe verifici
200 / 201Request procesat cu succes.Citeste identificatorii returnati pentru mesaje, contacte sau campanii.
400Payload invalid sau camp lipsa.Verifica tipurile campurilor, JSON valid si parametrii obligatorii.
401Token lipsa sau invalid.Verifica headerul Authorization si valabilitatea tokenului.
404Resursa nu a fost gasita.Verifica vendorUid, numarul de telefon sau UID-ul campaniei/contactului.
429Prea multe requesturi.Adauga retry cu backoff si evita requesturile paralele inutile.

Recomandare: foloseste numere in format international fara semnul plus, valideaza opt-in-ul clientilor inainte de mesaje de marketing si salveaza raspunsurile API pentru audit si depanare.

Ai nevoie de suport pentru integrare?

Echipa Whapi.ro te poate ajuta sa conectezi API-ul cu CRM, magazin online, ERP sau aplicatii interne.

Cere suport tehnic
💬 Vorbește cu AI-ul nostru pe WhatsApp