Mesaje și conversații
API-ul de mesaje vă permite să trimiteți un mesaj oricărui contact, să citiți o conversație, să corectați sau să ștergeți un mesaj deja trimis, să reacționați la acesta, să extrageți un fir complet de sesiune de chat, să exportați o transcriere și să marcați chat-urile ca citite sau necitite — totul fără a deschide inbox-ul.
Toate căile de pe această pagină sunt relative la URL-ul de bază https://api.youraiconnector.com/v1. Fiecare cerere necesită cheia dvs. API — consultați Autentificare pentru lista completă a modalităților de trimitere a acesteia. Exemplele de mai jos utilizează antetul X-API-Key, un exemplu cURL arătând și forma de interogare ?apiKey=.
Cum funcționează livrarea: Trimiterea unui mesaj nu așteaptă ca acesta să ajungă la destinație. API-ul acceptă mesajul dvs., returnează imediat un ID de mesaj și apoi îl livrează în fundal pe canalul contactului (WhatsApp, SMS, Instagram etc.). Pentru a urmări dacă un mesaj a fost livrat sau citit efectiv, ascultați actualizările de stare cu Webhooks — nu interogați (poll). Răspunsul de trimitere confirmă doar că mesajul a fost acceptat.
Trimiteți un mesaj
Există două modalități de a trimite. Alegeți-o pe cea care se potrivește modului în care identificați deja contactul:
- Trimitere prin ID-ul contactului — cunoașteți deja ID-ul contactului (de exemplu, ați creat contactul prin API sau l-ați obținut dintr-un webhook). Utilizați
POST /contacts/{contactId}/send-message. - Trimitere prin identitatea contactului — cunoașteți numărul de telefon al contactului, ID-ul de Instagram etc., dar nu și ID-ul lor intern. Utilizați
POST /contacts/sendși lăsați platforma să găsească contactul potrivit.
Ambele pun mesajul în coadă în același mod și îl livrează pe canalul pe care se află contactul. Nu alegeți un transport — platforma direcționează contactele WhatsApp prin WhatsApp, contactele SMS prin SMS și așa mai departe.
Ambele găsesc doar contacte care există deja. Niciun apel nu creează unul: un ID sau o identitate care nu se potrivește cu nimic este returnat ca 404, acesta nu devine un contact nou. Așadar, dacă trimiți un mesaj cuiva pentru prima dată, fie creează contactul mai întâi cu POST /contacts, fie, pe WhatsApp Web, folosește Trimite direct la un număr WhatsApp Web de mai jos, care creează contactul în același apel.
Trimitere prin ID-ul contactului
POST /contacts/{contactId}/send-message
| Câmp | Obligatoriu | Descriere |
|---|---|---|
body |
Da | Textul mesajului de trimis, până la 65.536 de caractere. Un corp mai lung decât permite canalul într-un singur mesaj (1.500 pe WhatsApp Business API și SMS, 1.000 pe Instagram, 2.000 pe Messenger, 4.096 pe Telegram și LinkedIn, 5.000 pe LINE, 6.000 pe TikTok, 7.000 pe Viber, 65.536 pe WhatsApp Web; fără limită pentru e-mail, widget-ul de chat și canale personalizate) este livrat ca mai multe mesaje în ordine, împărțite la pauzele de paragraf sau propoziție. Răspunsul conține apoi messageIds pentru fiecare parte și autoSplit: true. |
mediaUrl |
Nu | URL-ul unui fișier media (imagine, audio, video, document) de atașat. |
mediaContentType |
Nu | Tipul MIME al fișierului media atașat, de ex. image/jpeg. Este determinat din extensia fișierului URL-ului atunci când este omis (.mp3 → audio/mpeg, .pdf → application/pdf); setați-l pentru un URL fără extensie. |
sendAsVoiceNote |
Nu | Doar WhatsApp Web, doar audio: livrează fișierul audio ca notă vocală (bula de redare). Fișierele audio care nu sunt OGG/Opus sunt convertite în momentul trimiterii. Valoarea implicită este false. |
pauseBot |
Nu | true suspendă AI-ul pentru acest contact în momentul trimiterii mesajului — pentru situațiile în care un om preia conversația. Consultați Suspendarea sau reluarea AI-ului. |
clearIncompleteReply |
Nu | true elimină un răspuns parțial al botului, astfel încât acesta să nu fie reluat după mesajul dumneavoastră. |
human_reply |
Nu | true marchează mesajul ca fiind scris de o persoană din echipa dumneavoastră, nu de o integrare. AI-ul îl va trata apoi ca pe un răspuns al unui coleg în conversație, iar răspunsul pe care AI-ul îl avea în coadă pentru ultimul mesaj al contactului este anulat, astfel încât contactul să nu primească două răspunsuri. Nu suspendă AI-ul; folosiți pauseBot pentru acest lucru. Valoarea implicită este false. |
Pe LinkedIn, un mesaj trimis în acest mod sau din căsuța de primire este livrat chiar și atunci când o persoană gestionează conversația pe platforma LinkedIn. Răspunsurile proprii ale AI-ului și mesajele sale ulterioare sunt reținute în cadrul unei astfel de conversații. Un răspuns reținut este eliminat din chat în loc să fie afișat ca eșuat, deoarece nu a fost trimis nimic și nu a fost utilizat niciun credit. Ultimul răspuns al AI-ului înainte de a preda conversația unei persoane este totuși livrat.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
body: "Hi! Your appointment is confirmed for tomorrow at 10:00.",
}),
}
);
const data = await res.json();
console.log(data.messageId);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."},
)
print(res.json()["messageId"])
Răspuns (200 OK):
{
"success": true,
"messageId": "aB3dE5fG7hI9jK1lM2nO",
"contactId": "contact123",
"channel": "whatsapp",
"message": "Message created successfully. Delivery is being processed."
}
Trimitere prin identitatea contactului
POST /contacts/send
Utilizați acest lucru atunci când nu aveți ID-ul intern al contactului. Furnizați body mesajului plus fie un contact_id, fie un channel împreună cu câmpul de identitate care corespunde acelui canal.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
body |
Da | Textul mesajului de trimis, până la 65.536 de caractere. Un corp mai lung decât permite canalul într-un singur mesaj (1.500 pe WhatsApp Business API și SMS, 1.000 pe Instagram, 2.000 pe Messenger, 4.096 pe Telegram și LinkedIn, 5.000 pe LINE, 6.000 pe TikTok, 7.000 pe Viber, 65.536 pe WhatsApp Web; fără limită pentru e-mail, widget-ul de chat și canale personalizate) este livrat ca mai multe mesaje în ordine, împărțite la pauzele de paragraf sau de propoziție. Răspunsul conține apoi messageIds pentru fiecare parte și autoSplit: true. |
contact_id |
Nu | ID-ul unui contact existent. Când este setat, câmpurile de identitate de mai jos nu sunt necesare. |
channel |
Nu | Canalul prin care se trimite. Obligatoriu când contact_id nu este furnizat. Unul dintre cele 14 canale de trimitere: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber. |
phone_number |
Nu | Numărul de telefon al contactului în format internațional. Utilizat cu whatsapp, whatsapp_web și sms. |
instagram_id |
Nu | ID-ul de utilizator Instagram al contactului. Utilizat cu instagram. |
messenger_id |
Nu | ID-ul de utilizator Messenger al contactului. Utilizat cu messenger. |
telegram_user_id |
Nu | ID-ul de utilizator Telegram al contactului. Utilizat cu telegram. |
media_url |
Nu | URL-ul unui fișier media de atașat. |
media_content_type |
Nu | Tipul MIME al fișierului media atașat, de ex. image/jpeg. |
Ce canale pot fi identificate prin identitate. Doar șase din cele 14 acceptă un câmp de identitate în locul unui contact_id: whatsapp, whatsapp_web și sms sunt căutate prin phone_number, instagram prin instagram_id, messenger prin messenger_id, și telegram prin telegram_user_id. Celelalte opt — instagram_private, chat-widget, custom, email, line, imessage, linkedin și viber — nu au nicio identitate publică de căutat, deci trimiterea prin acele canale necesită contact_id; transmiterea doar a channel returnează un 400 care vă informează că contact_id este necesar.
cURL (folosind forma de interogare ?apiKey=)
curl -X POST "https://api.youraiconnector.com/v1/contacts/send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed."
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/contacts/send", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
channel: "whatsapp",
phone_number: "+31612345678",
body: "Hi! Your appointment is confirmed.",
}),
});
const data = await res.json();
console.log(data.message_id, data.channel);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/send",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed.",
},
)
data = res.json()
print(data["message_id"], data["channel"])
Răspuns (201 Created):
{
"success": true,
"message_id": "aB3dE5fG7hI9jK1lM2nO",
"contact_id": "contact123",
"channel": "whatsapp"
}
De ce un mesaj ar putea fi respins: Un contact care are activat modul „nu deranjați” sau modul privat nu poate primi mesaje de ieșire — cererea eșuează cu un
422. Dacă niciun contact nu corespunde ID-ului sau identității furnizate, veți primi un404.
Trimiterea pe WhatsApp Web: variații și protecția împotriva trimiterilor în masă
Două aspecte se aplică pentru body atunci când contactul folosește WhatsApp Web.
Parantezele Spintax sunt extinse la fiecare trimitere. Un body de tipul {Hi|Hello|Hey} there, quick question este trimis ca unul dintre cele trei saluturi, ales pentru acea trimitere — parantezele nu ajung niciodată la contact. Folosește-le pentru a oferi fiecărui contact un mesaj de deschidere diferit din același cod de integrare. Textul fără paranteze este trimis exact așa cum a fost scris.
Trimiterile în masă de mesaje de deschidere identice sunt refuzate. Dacă zece mesaje de deschidere aproape identice sunt trimise de la un singur număr WhatsApp Web într-o oră, către contacte care nu ți-au scris niciodată, următoarele nu vor fi livrate: trimiterea este acceptată ca de obicei (primești în continuare un messageId), iar mesajul rămâne cu status: "failed" și error_code: "opener_burst", având un motiv lizibil pentru client atașat. Reîncercarea aceluiași text nu ajută — variază textul, așteaptă o oră și trimite din nou. Răspunsurile din cadrul conversațiilor existente nu sunt niciodată afectate. Raționamentul se află în Mesajele de deschidere identice duc la restricționarea numerelor.
Trimite direct la un număr WhatsApp Web
POST /whatsapp-web/send
Trimite la un număr de telefon pe WhatsApp Web fără a căuta mai întâi un contact. Dacă numărul nu este încă un contact, acesta este creat în același apel, cu AI-ul dezactivat pentru el, astfel încât mesajul să apară ca unul trimis manual și niciun asistent să nu preia conversația ulterior. Un contact existent este refolosit așa cum este.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
phoneNumber |
Da | Numărul către care se trimite mesajul, în format internațional (+31612345678). |
message |
Nu | Textul de trimis. Fie message, fie mediaUrl trebuie să fie prezent. |
mediaUrl |
Nu | URL-ul public al unui fișier de trimis. Fie message, fie mediaUrl trebuie să fie prezent. |
mediaContentType |
Nu | Tipul MIME al fișierului respectiv, de exemplu image/jpeg. Este determinat automat din URL dacă este omis. |
sendAsVoiceNote |
Nu | true trimite un fișier audio ca notă vocală în loc de atașament. |
fromPhoneNumber |
Nu | De pe care dintre numerele tale WhatsApp Web conectate să trimiți, în format internațional. Implicit este numărul de care aparține deja contactul. |
campaignId |
Nu | Preia orele active de la acest Agent în loc de setările implicite ale contului. Trebuie să fie un Agent din același cont. |
ignoreActiveHours |
Nu | true trimite imediat, indiferent de orele active. |
sub_account_id |
Nu | Pentru agenții: trimite în numele unuia dintre conturile clienților tăi. |
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-web/send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "+31612345678",
"message": "Hi Alex, your quote is ready."
}'
Un apel reușit răspunde cu 202:
{ "success": true, "queued": true, "contactId": "abc123" }
202 înseamnă acceptat, nu livrat încă. În afara orelor active, trimiterea este reținută și se efectuează în următorul interval permis, cu excepția cazului în care ai transmis ignoreActiveHours. Verifică starea mesajului cu Listează mesajele unui contact folosind contactId pe care l-ai primit aici.
Când nu se finalizează:
| Stare | Cod | Ce s-a întâmplat |
|---|---|---|
400 |
INVALID_PHONE_FORMAT |
Numărul nu este în format internațional sau phoneNumber lipsește, ori ambele message și mediaUrl lipsesc. |
400 |
CONTACT_DND |
Contactul respectiv are activat „Nu deranja”, deci nu i se trimite nimic. |
400 |
CONTACT_PRIVATE |
Contactul respectiv este marcat ca privat. |
404 |
CAMPAIGN_NOT_FOUND |
Niciun Agent nu se potrivește cu campaignId pe care l-ai transmis. |
403 |
CAMPAIGN_FORBIDDEN |
Agentul respectiv aparține altui cont. |
402 |
Contul nu mai are credite sau nu este conectat niciun număr WhatsApp Web. |
Un al doilea apel pentru același contact în timp ce o trimitere reținută este încă în așteptare răspunde cu 409, astfel încât o coadă nu se acumulează niciodată pentru o singură persoană.
Înregistrează o notă într-o conversație
POST /contacts/notes
Adaugă un rând la conversația unui contact fără a-l trimite. Folosește-l pentru contextul pe care echipa ta și AI-ul ar trebui să îl aibă, dar pe care contactul nu ar trebui să îl primească niciodată: un rezumat al unui apel telefonic pe care agentul tău vocal tocmai l-a efectuat, o observație din CRM-ul tău sau o notă de la un coleg. Funcționează pe orice canal (WhatsApp, SMS, Instagram, Messenger, Telegram, widget-ul de chat, canale personalizate și așa mai departe).
Ce se întâmplă cu o notă:
- Apare în chat-ul din inbox ca un card galben de Notă, cu autorul dacă ai trimis unul.
- AI-ul o citește ca parte a istoricului conversației, marcată ca notă internă, astfel încât următorul său răspuns să o ia în considerare.
- Nu este trimisă niciodată contactului, nu consumă credite de mesaje și nu declanșează nimic: niciun răspuns AI, nicio automatizare, niciun webhook, nicio notificare, niciun indicator de mesaje necitite. Nu întrerupe AI-ul și nu contează ca un răspuns din partea echipei tale.
Găsește contactul în același mod ca la Trimitere după identitatea contactului: fie prin ID-ul acestuia, fie printr-un channel plus identificatorul corespunzător. O notă ajunge doar la un contact care există deja; dacă nu există nicio potrivire, este o 404.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
contact_id |
Unul dintre cele două | ID-ul contactului. |
channel + identificator |
Unul dintre cele două | channel plus phone_number (WhatsApp, WhatsApp Web, SMS), instagram_id, messenger_id sau telegram_user_id, așa cum este descris în Trimitere prin identitatea contactului. |
body |
Da | Textul notei, până la 4.000 de caractere. Întreruperile de linie sunt păstrate. |
author |
Nu | Cine sau ce a scris nota, până la 80 de caractere, de exemplu Voice agent sau Sarah (sales). Afișat pe card și către AI. |
timestamp |
Nu | Când s-a întâmplat, în milisecunde epoch. Implicit este momentul actual. Folosiți ora de încheiere a apelului, astfel încât nota să fie plasată corect în firul de discuție. Nu poate fi cu mai mult de 5 minute în viitor; o oră ulterioară va fi respinsă cu o eroare 400. |
external_id |
Nu | propriul ID pentru această notă, până la 200 de caractere, de exemplu ID-ul apelului. Trimiterea aceluiași external_id pentru același contact din nou nu adaugă o a doua notă; răspunsul va conține atunci duplicate: true. Folosiți-l pentru ca un webhook reîncercat să nu poată înregistra același apel de două ori. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/notes" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"phone_number": "+31612345678",
"author": "Voice agent",
"body": "Voice call, 3:12. Asked about knee surgery waiting times, prefers a call back on Tuesday morning.",
"external_id": "call_8f2k1"
}'
Răspuns (201, sau 200 cu duplicate: true când external_id a fost deja înregistrat)
{
"success": true,
"messageId": "note_4c1f0e...",
"contactId": "contact123"
}
O notă apare în Listarea mesajelor unui contact cu type: "note".
Generarea unei ciorne de răspuns cu AI
POST /contacts/{contactId}/draft-reply
Solicită agentului AI care gestionează o conversație să scrie următorul răspuns și vă returnează textul. Nu se trimite nimic. Este aceeași ciornă pe care o scrie butonul Generare răspuns din inbox: agentul își folosește configurarea, baza de cunoștințe și conversația de până acum și răspunde în limba contactului. Folosiți-l pentru a introduce un om (sau propria aplicație) între AI și contact: preluați ciorna, afișați-o pentru aprobare, apoi trimiteți-o cu Trimitere prin ID contact, modificată sau ca atare.
- Ciorna este scrisă de agentul alocat contactului. Un contact care nu are încă un agent va primi agentul care ar răspunde la următorul său mesaj.
- În timpul redactării, agentul nu rulează niciun instrument sau funcție, deci nu se efectuează nicio rezervare, etichetare, transfer sau altă acțiune.
- Nu se stochează nimic în conversație, iar contactul nu vede nimic.
- O ciornă costă aceleași credite ca un răspuns AI de la acel agent în această conversație și nimic atunci când este conectată propria cheie AI.
- Conversația trebuie să aibă cel puțin un mesaj.
Toate câmpurile de corp sunt opționale; un corp gol (sau lipsa acestuia) generează ciorna pentru următorul răspuns.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
instruction |
Nu | O instrucțiune unică pentru această ciornă, de până la 2.000 de caractere, la fel ca apăsarea lungă pe Generare răspuns în inbox. De exemplu Offer Tuesday at 3pm sau Ask for their email address. |
campaign_id |
Nu | Redactați sub această campanie în loc de agentul contactului. |
purpose |
Nu | chat_reply (implicit) scrie un mesaj către contact. faq_answer scrie un răspuns scurt la întrebarea contactului care funcționează de sine stătător, pentru un FAQ din baza de cunoștințe. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/draft-reply" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "instruction": "Offer Tuesday at 3pm for the consultation" }'
Răspuns (200)
{
"success": true,
"contact_id": "contact123",
"draft": "Hi Sara, Tuesday at 3pm works for the consultation. Shall I put you down for it?"
}
Un 400 înseamnă că conversația nu are încă mesaje, creditele dumneavoastră s-au epuizat sau contactul nu are niciun agent sau campanie din care să se redacteze (error specifică motivul). Un 404 înseamnă că contactul nu există sau cheia unui membru al echipei este limitată la contacte pe care nu le poate vedea. Cheia sau membrul echipei are nevoie de permisiunea de a edita mesaje.
Utilizați un client AI prin MCP? Aceeași acțiune este disponibilă ca instrument
generate_reply_draft.
Listarea mesajelor unui contact
GET /contacts/{contactId}/messages
Returnează mesajele unui contact, cele mai noi primele, cu paginare bazată pe cursor.
| Parametru de interogare | Obligatoriu | Descriere |
|---|---|---|
limit |
Nu | Dimensiunea paginii. Implicit 50, maxim 100. |
cursor |
Nu | Valoarea next_cursor dintr-un răspuns anterior. Returnează mesaje mai vechi decât cursorul. |
filter |
Nu | Filtrare după tipul de conținut: all (implicit), text, media sau tool_use. |
direction |
Nu | Filtrare după direcție: all (implicit), inbound (primit de la contact) sau outbound (trimis de dvs.). |
Notă despre filtrare și paginare: Filtrele
filterșidirectionsunt aplicate fiecărei pagini după ce este citită, deci o pagină filtrată poate conține mai puține elemente decâtlimit.next_cursoravansează în continuare prin întreaga conversație, așa că continuați paginarea până cândnext_cursorestenull.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/messages?limit=50&direction=inbound" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ limit: "50", direction: "inbound" });
const res = await fetch(
`https://api.youraiconnector.com/v1/contacts/contact123/messages?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.messages, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 50, "direction": "inbound"},
)
data = res.json()
print(data["messages"], data["next_cursor"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T10:00:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
],
"next_cursor": "cD4eF6gH8iJ0kL2mN3oP"
}
Câmpurile mesajului
| Câmp | Descriere |
|---|---|
id |
ID-ul unic al mesajului. |
body |
Conținutul text al mesajului. Pentru un mesaj cu atașament, body începe cu o notă între paranteze despre ceea ce a sosit, urmată de orice legendă, de exemplu [THE CONTACT UPLOADED AN IMAGE] Here is my CV sau [THE CONTACT UPLOADED A VOICE NOTE] - [TRANSCRIPTION: ...]. Notele vocale și videoclipurile includ transcrierea. |
direction |
inbound (primit de la contact) sau outbound (trimis de contul tău). |
channel |
Canalul pe care a fost trimis sau primit mesajul (de exemplu, whatsapp, sms, instagram). |
status |
Starea curentă a livrării, de exemplu Created, sent, delivered, read, failed. |
type |
Tipul mesajului. Mesajele text simple au un tip null; activitatea instrumentelor asistentului automatizat este marcată cu tool_use. |
timestamp |
Ora creării mesajului în format ISO 8601. |
media_url |
URL-ul unui fișier media atașat, dacă există. Acest link încetează să funcționeze la 7 zile după sosirea mesajului, pe orice canal (WhatsApp Business API, WhatsApp Web, Instagram, Messenger, Telegram, widget-ul de chat și restul). Obține unul nou cu Descărcarea atașamentului unui mesaj. |
media_content_type |
Tipul MIME al fișierului media atașat, dacă există. |
bot_reply |
true când mesajul a fost generat de asistentul AI. |
score |
Evaluarea ta pentru mesaj: 1 deget în sus, -1 deget în jos, 0 când nu a fost evaluat. Vezi Evaluarea sau marcarea cu stea a unui mesaj. |
is_important |
true când mesajul a fost marcat cu stea. |
is_deleted |
true când mesajul a fost șters. Mesajele șterse rămân în listă, dar body și media_url ale acestora sunt goale. |
reactions |
Reacții emoji la mesaj, din ambele părți. Întotdeauna o matrice — goală când nu există niciuna. Fiecare intrare are emoji, from_phone_number, from_me (true când reacția este a ta) și reacted_at. |
faq_ids_used |
ID-urile întrebărilor frecvente (FAQ) din Baza de Cunoștințe pe care AI-ul le-a avut la dispoziție când a scris acest răspuns: cele selectate pentru cel mai recent mesaj plus cele păstrate din conversațiile anterioare. Aceeași listă se află pe fiecare mesaj al unui răspuns care a fost trimis în mai multe părți. Întotdeauna o matrice, goală pentru mesajele primite, mesajele trimise de oameni, urmăririle automate și răspunsurile AI trimise înainte de 25 septembrie 2026. |
faqs_used |
Aceleași întrebări frecvente cu întrebarea lor: fiecare intrare are id și question. question este null când întrebarea frecventă a fost ștearsă între timp. |
Descarcă atașamentul unui mesaj
POST /chat-exports/media/download-url
Îți oferă un link de descărcare proaspăt pentru fișierul atașat unui mesaj: o imagine, o notă vocală, un videoclip sau un document. Linkul este valabil timp de 1 oră. Folosește-l atunci când dorești să salvezi atașamentele în altă parte (de exemplu, pentru a arhiva CV-uri sau note vocale trimise de un contact) sau când media_url de pe un mesaj ori un webhook pentru Mesaj Nou nu se mai deschide.
Pentru a găsi mesaje cu atașamente, listează mesajele unui contact cu filter=media. id fiecărui mesaj și ID-ul contactului formează messagePath.
| Câmp corp | Obligatoriu | Descriere |
|---|---|---|
messagePath |
Da | Ce mesaj, sub forma contacts/{contactId}/messages/{messageId}. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/chat-exports/media/download-url" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/chat-exports/media/download-url", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ messagePath: "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO" }),
});
const { data } = await res.json();
console.log(data.url); // download the file within the hour
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/chat-exports/media/download-url",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"},
)
file_url = res.json()["data"]["url"]
Răspuns (200 OK):
{
"success": true,
"data": {
"url": "https://storage.googleapis.com/...",
"expiresInMs": 3600000
}
}
| Câmp | Descriere |
|---|---|
data.url |
Linkul de descărcare. Descarcă fișierul direct de acolo, nu este nevoie de cheie API. |
data.expiresInMs |
Cât timp funcționează linkul, în milisecunde (3600000 = 1 oră). Apelează din nou endpoint-ul pentru un link nou. |
| Status | Când |
|---|---|
400 |
messagePath lipsește sau nu este în formatul contacts/{contactId}/messages/{messageId}, ori mesajul nu are niciun atașament care să poată fi descărcat în acest mod. Unele atașamente mai vechi sunt stocate la furnizorul canalului și nu pot fi reemise, iar un reel sau o postare de Instagram partajată reprezintă un link către Instagram, nu un fișier. |
403 |
Contactul nu aparține contului tău. |
404 |
Nu există niciun mesaj cu acel ID pentru acel contact. |
Folosești un client AI prin MCP? Aceeași acțiune este disponibilă ca instrument
get_chat_media_download_url.
Listarea sesiunilor de chat
O sesiune de chat este o fereastră de conversație cu un contact. Se deschide la primul mesaj primit când nicio sesiune nu este deschisă și se închide automat la 48 de ore după ultimul mesaj primit de la contact (fiecare mesaj nou primit amână închiderea cu încă 48 de ore). Încheierea unui chat de către AI nu închide sesiunea; aceasta doar declanșează webhook-ul Chat Concluded. Sesiunile reprezintă modul în care poți împărți un istoric lung în conversații lizibile, în loc de o listă nesfârșită.
Sesiuni recente pentru toate contactele
GET /chat-sessions/recent
Returnează sesiunile care au început în ultimele X ore, cele mai noi primele, pentru fiecare contact din cont.
| Parametru de interogare | Obligatoriu | Descriere |
|---|---|---|
hours |
Da | Câte ore să fie luate în considerare. Trebuie să fie un număr întreg pozitiv. |
status |
Nu | Returnează doar sesiunile cu această stare: ChatSessionOpened sau ChatSessionClosed. |
limit |
Nu | Numărul maxim de sesiuni de returnat. Implicit 100, maxim 100. |
includeMessages |
Nu | true adaugă un tablou messages la fiecare sesiune. Dezactivat implicit deoarece mărește considerabil răspunsul. |
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/recent?hours=24&status=ChatSessionClosed" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ hours: "24", status: "ChatSessionClosed" });
const res = await fetch(`https://api.youraiconnector.com/v1/chat-sessions/recent?${params}`, {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data.total_sessions, data.data.sessions);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-sessions/recent",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"hours": 24, "status": "ChatSessionClosed"},
)
data = res.json()["data"]
print(data["total_sessions"], data["sessions"])
Răspuns (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_sessions": 2,
"sessions": [
{
"session_id": "session456",
"contact_id": "contact123",
"contact_name": "Jane Doe",
"contact_phone": "+31612345678",
"contact_email": "jane@example.com",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Toate sesiunile pentru un singur contact
GET /chat-sessions/{contactId}
Returnează fiecare sesiune de chat pentru un singur contact. Aceiași parametri status, limit și includeMessages ca mai sus — hours nu se aplică aici.
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/contact123?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
Răspuns (200 OK):
{
"success": true,
"data": {
"contact_id": "contact123",
"contact_name": "Jane Doe",
"total_sessions": 2,
"sessions": [
{
"id": "session456",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Numele câmpurilor ID-ului de sesiune diferă între cele două endpoint-uri. Lista sesiunilor recente îl numește
session_id(conține și detaliile contactului, deoarece sesiunile provin de la mai multe contacte); lista per-contact îl numeșteid. Oricare dintre aceste valori este cea pe care o transmiteți ca{sessionId}atunci când preluați firul complet de mai jos.
Când includeMessages=true, fiecare sesiune primește un tablou messages ale cărui intrări conțin id, body, direction, timestamp, type, channel și status.
Preluarea unui fir de conversație
GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
O sesiune de chat grupează mesajele unui contact într-o singură fereastră de conversație. Acest endpoint returnează întregul fir al unei singure sesiuni, de la cel mai vechi la cel mai nou, împreună cu metadatele sesiunii. Puteți găsi ID-urile sesiunilor pentru un contact prin intermediul endpoint-urilor pentru sesiuni de chat.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.session, data.messages);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["session"], data["messages"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"session": {
"id": "session456",
"status": "ChatSessionClosed",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"tag": "Booking enquiry"
},
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T09:55:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
]
}
Obiectul session raportează status (ChatSessionOpened cât timp este activ, ChatSessionClosed odată încheiat), start_date_time, end_date_time și un tag ușor de citit de către oameni. Matricea messages folosește aceleași câmpuri de mesaj ca și endpoint-ul de listare.
Editarea, ștergerea și reacționarea la mesaje
Aceste endpoint-uri modifică un mesaj după ce a fost trimis. Două dintre ele interacționează atât cu canalul contactului, cât și cu propria dvs. copie, așa că citiți introducerea secțiunii înainte de a le implementa — ceea ce este posibil depinde în întregime de canalul pe care se desfășoară conversația.
Ce permite fiecare canal
| Acțiune | Canale care pot modifica copia contactului | Limită de timp |
|---|---|---|
| Editarea unui mesaj trimis | Widget de chat, WhatsApp Web (doar mesaje text), Telegram, LinkedIn | Nicio limită pentru widgetul de chat, 15 minute pe WhatsApp Web, 48 de ore pe Telegram, 60 de minute pe LinkedIn |
| Ștergere pentru toată lumea | Widget de chat, WhatsApp Web, Telegram, LinkedIn | 60 de minute pe LinkedIn; celelalte nu au o limită publicată |
| Reacție cu un emoji | WhatsApp Web, Telegram | Niciuna |
Pe toate celelalte canale — WhatsApp Business API, SMS, Instagram, Messenger, e-mail, LINE, canale personalizate — o ștergere elimină mesajul din inbox-ul tău, dar contactul își păstrează copia, iar editarea sau reacționarea nu sunt posibile deloc.
Editarea unui mesaj
POST /contacts/{contactId}/messages/{messageId}/edit
Rescrie un mesaj pe care l-ai trimis deja, pe dispozitivul contactului și în copia ta.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
body |
Da | Noul text al mesajului. Nu trebuie să fie gol și nu trebuie să depășească limita permisă de canal într-un singur mesaj (aceleași limite per canal ca la Trimitere după ID de contact; 4.096 când mesajul nu are niciun canal). |
Spre deosebire de ștergere, aceasta eșuează vizibil atunci când canalul refuză: primești o 409 și copia ta rămâne exact așa cum o are contactul, deoarece afișarea unei editări pe care aceștia nu au primit-o niciodată ar duce la o neconcordanță între cele două părți. Câmpul edit_reason îți explică motivul — fereastra de editare a canalului s-a închis, canalul este deconectat, mesajul are un atașament pe care canalul nu îl poate edita (media_not_editable: pe WhatsApp Web pot fi editate doar mesajele text, nu și textul de sub o fotografie, un videoclip sau un fișier) sau a apărut o altă eroare.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Sorry - I meant Thursday at 3pm." }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ body: "Sorry - I meant Thursday at 3pm." }),
}
);
const data = await res.json();
console.log(data.edited, data.edit_reason);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Sorry - I meant Thursday at 3pm."},
)
data = res.json()
print(data.get("edited"), data.get("edit_reason"))
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"edited": true,
"edit_reason": "edit_dispatched"
}
Dacă canalul nu acceptă editarea, primești în schimb un 409 și nimic nu a fost modificat:
{
"success": false,
"error": "The message could not be edited",
"edit_reason": "channel_disconnected"
}
Un mesaj care a fost deja șters, un canal care nu poate edita deloc și un mesaj care este prea vechi pentru canalul său returnează toate 400 — cererea nu ajunge niciodată la canal.
Ștergerea unui mesaj
DELETE /contacts/{contactId}/messages/{messageId}
Elimină mesajul din conversația ta și, acolo unde canalul permite, retrage și copia contactului. Fără corp de cerere.
Aceasta răspunde întotdeauna cu 200 atunci când mesajul a existat, chiar dacă copia contactului nu a putut fi retrasă — copia ta este ștearsă, deci o eroare ar fi înșelătoare. Citește cele trei câmpuri din răspuns pentru a-i spune utilizatorului ce s-a întâmplat de fapt:
| Câmp | Descriere |
|---|---|
revoke_supported |
Dacă acest canal poate retrage mesaje în general. |
revoked |
Dacă copia de pe dispozitivul contactului a fost eliminată. |
revoke_reason |
De ce nu a fost eliminată, atunci când revoked este false — de exemplu revoke_window_closed sau already_deleted. |
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.revoked, data.revoke_reason);
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["revoked"], data["revoke_reason"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"revoke_supported": true,
"revoked": true,
"revoke_reason": "revoke_dispatched"
}
Mesajele șterse nu sunt eliminate din istoricul conversației. Acestea rămân în
GET /contacts/{contactId}/messagescuis_deleted: trueși unbodygol șimedia_url.
Ștergeți mai multe mesaje simultan
POST /contacts/{contactId}/messages/bulk-delete
Șterge un lot de mesaje doar din partea ta. Conținutul și atașamentele sunt golite, dar nimic nu este retras de pe dispozitivul contactului — pentru a retrage și un mesaj, ștergeți-l pe rând folosind endpoint-ul pentru un singur mesaj de mai sus.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
message_ids |
Da | O matrice nevidă de ID-uri de mesaje, până la 500 per cerere. messageIds este acceptat ca alias. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "message_ids": ["msg_1", "msg_2"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ message_ids: ["msg_1", "msg_2"] }),
}
);
console.log((await res.json()).deleted);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["msg_1", "msg_2"]},
)
print(res.json()["deleted"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"deleted": 2
}
Reacționați la un mesaj
POST /contacts/{contactId}/messages/{messageId}/react
Adaugă propria reacție emoji la un mesaj sau o retrage prin trimiterea unui șir gol. Reacțiile contactului nu sunt niciodată modificate.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
emoji |
Da | Emoji-ul cu care doriți să reacționați sau "" pentru a elimina reacția. Trebuie să fie un singur șir fără spații, de maximum 16 caractere. |
La fel ca editarea, aceasta eșuează în loc să afișeze o reacție pe care contactul nu a primit-o niciodată, iar eșecul vă indică dacă merită să reîncercați:
422— nu poate fi livrat niciodată în această conversație: canalul nu acceptă reacții, mesajul nu are un ID pe partea canalului sau emoji-ul este în afara setului permis de acel canal.409— canalul a fost temporar inaccesibil. O reîncercare ar putea funcționa.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "emoji": "👍" }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ emoji: "👍" }),
}
);
const data = await res.json();
console.log(data.reactions);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"emoji": "👍"},
)
print(res.json()["reactions"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"reaction_supported": true,
"reaction_reason": "reaction_dispatched",
"reactions": [
{
"emoji": "👍",
"from_phone_number": "+31612345678",
"from_me": true,
"reacted_at": "2026-06-01T10:05:00.000Z"
}
]
}
Matricea reactions reprezintă setul complet de reacții existente acum pe mesaj, atât ale tale, cât și ale contactului. La un 409 sau 422, aceasta este returnată neschimbată, astfel încât un client care randează direct din ea nu va afișa niciodată o reacție care nu a fost livrată.
Evaluați sau marcați un mesaj cu stea
PATCH /contacts/{contactId}/messages/{messageId}
Evaluează un mesaj cu degetul în sus sau în jos și/sau îl marchează ca important. Aceasta este o evidență doar pe partea ta — nimic nu este trimis contactului.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
score |
Nu | 1 deget în sus, -1 deget în jos, 0 șterge evaluarea. |
is_important |
Nu | true adaugă mesajul la favorite, false elimină mesajul de la favorite. Trebuie să fie un boolean real, nu șirul "true". |
Trimite cel puțin unul dintre cele două, altfel vei primi o eroare 400. Doar ceea ce trimiți este scris, deci marcarea unui mesaj ca favorit nu îi șterge niciodată evaluarea și invers — iar răspunsul returnează doar câmpurile pe care le-ai trimis.
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "score": 1, "is_important": true }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1", {
method: "PATCH",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ score: 1, is_important: true }),
});
Python
import requests
requests.patch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"score": 1, "is_important": True},
)
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"score": 1,
"is_important": true
}
Marcarea mesajelor ca citite
Puteți șterge starea de necitit fie pentru mesaje specifice, fie pentru întreaga conversație.
Marcarea mesajelor specifice ca citite
POST /contacts/{contactId}/messages/mark-read
Transmiteți ID-urile mesajelor care trebuie marcate ca citite.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
message_ids |
Da | O matrice nevidă de ID-uri de mesaje (până la 500 per cerere). |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
message_ids: ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"],
}),
}
);
const data = await res.json();
console.log(data.marked_read);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]},
)
print(res.json()["marked_read"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123",
"marked_read": 2
}
Marcarea întregului chat ca citit
POST /contacts/{contactId}/mark-read
Șterge insigna de necitit pentru întreaga conversație a contactului din inbox. Nu este necesar niciun corp de cerere.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-read" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Marchează întreaga conversație ca necitită
POST /contacts/{contactId}/mark-unread
Pune din nou insigna de necitit pe conversație — util atunci când cineva din echipa ta a deschis un chat, dar îl predă înapoi. Nu este necesar un corp al cererii.
Acesta este un indicator valabil doar pentru inbox: nu modifică momentul în care conversația a fost citită ultima dată, deci nu este trimisă nicio confirmare de citire către contact pe canalele care le suportă.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-unread" \
-H "X-API-Key: YOUR_API_KEY"
Răspuns (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Exportă o conversație
Exporturile îți oferă o conversație întreagă sub formă de transcriere lizibilă, în loc să parcurgi mesajele pagină cu pagină. Fiecare endpoint de export acceptă un filter de tip all (implicit), text, media sau tool_use, corespunzător filtrului din lista de mesaje.
Exportă chat-ul unui singur contact
GET /chat-exports/{contactId}
| Parametru de interogare | Obligatoriu | Descriere |
|---|---|---|
format |
Nu | txt (implicit) returnează un link de descărcare către o transcriere în text simplu. json returnează mesajele ca date structurate în răspuns. |
filter |
Nu | all (implicit), text, media sau tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/contact123?format=json" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-exports/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"format": "json"},
)
print(res.json()["data"]["messages"])
Răspuns cu format=json (200 OK):
{
"success": true,
"data": {
"contact": {
"id": "contact123",
"name": "Jane Doe",
"phone": "+31612345678",
"email": "jane@example.com"
},
"messages": [
{
"body": "Hi! I have a question about my order.",
"direction": "inbound",
"timestamp": "2026-06-01T09:55:00.000Z",
"type": "text",
"media_url": null,
"media_content_type": null,
"name": null,
"args": null
}
]
}
}
Cu format=txt (implicit), data este în schimb un link de descărcare către fișierul de transcriere generat:
{
"success": true,
"data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}
Linkul de descărcare are o durată scurtă de viață. Descarcă fișierul imediat ce primești linkul, în loc să îl stochezi — solicită un export nou atunci când ai din nou nevoie de transcriere.
Exportă toate conversațiile recente
GET /chat-exports/recent
Exportă conversațiile tuturor contactelor care au fost active în ultimele X ore, într-un singur apel.
| Parametru interogare | Obligatoriu | Descriere |
|---|---|---|
hours |
Da | Câte ore de activitate să fie luate în considerare. Trebuie să fie un număr întreg pozitiv. |
format |
Nu | json (implicit) returnează o intrare per contact. txt returnează un singur fișier text descărcabil care conține toate conversațiile. |
limit |
Nu | Numărul maxim de contacte de exportat. Implicit 50, maxim 100. |
filter |
Nu | all (implicit), text, media sau tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/recent?hours=24&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
Răspuns (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_contacts": 2,
"exports": [
{
"contactId": "contact123",
"contactName": "Jane Doe",
"phoneNumber": "+31612345678",
"email": "jane@example.com",
"messageCount": 12,
"chatExport": "Acme Export - Jane Doe\nPhone: +31612345678\n..."
}
]
}
}
Cu format=txt, răspunsul este fișierul text propriu-zis, trimis ca descărcare în loc de JSON.
Acest apel unic extrage istoricul complet al fiecărui contact corespondent, așa că păstrați
hoursșilimitla valori moderate în conturile ocupate.
Trimiteți o transcriere prin e-mail contactului
POST /chat-exports/{contactId}/email
Trimite contactului propria transcriere a conversației prin e-mail — fluxul „trimite-mi acest chat prin e-mail”, gestionat din propriul sistem.
| Câmp | Obligatoriu | Descriere |
|---|---|---|
recipient_email |
Nu | Unde să fie trimis. Implicit este adresa de e-mail stocată a contactului. |
via |
Nu | auto (implicit) alege cea mai bună rută, transactional îl trimite ca e-mail de sistem, email_channel îl trimite de pe canalul de e-mail conectat. |
note |
Nu | Un scurt mesaj de la dumneavoastră afișat deasupra transcrierii. Până la 1000 de caractere. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/chat-exports/contact123/email" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "note": "Here is a copy of our chat, as promised." }'
Răspuns (200 OK):
{
"success": true,
"data": {
"via": "transactional",
"recipientEmail": "jane@example.com",
"messageCount": 42,
"omittedCount": 0
}
}
omittedCount vă spune câte dintre cele mai vechi mesaje au fost omise pentru a menține e-mailul la o lungime rezonabilă. Un 200 înseamnă că transcrierea a fost creată și pusă în coada de așteptare pentru trimitere, nu că a ajuns deja în căsuța poștală.
Suspendarea sau reluarea AI-ului pentru un contact
PUT /contacts/{contactId}
Setați is_bot_active la false pentru a opri AI-ul din a răspunde unui contact și înapoi la true pentru a preda conversația. Acesta este comutatorul de preluare pe care îl doriți atunci când un operator uman intervine într-o conversație: mesajele trimise prin API sunt livrate în continuare în timp ce botul este suspendat.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/contacts/contact123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_bot_active": false }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123", {
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ is_bot_active: false }),
});
Python
import requests
requests.put(
"https://api.youraiconnector.com/v1/contacts/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"is_bot_active": False},
)
Răspuns
{
"success": true,
"contact_id": "contact123"
}
Suspendarea ca parte a răspunsului
Dacă un operator uman preia conversația trimițând un răspuns, puteți suspenda botul în aceeași cerere în loc să efectuați un al doilea apel. POST /contacts/{contactId}/send-message acceptă aceste opțiuni opționale:
| Câmp | Descriere |
|---|---|
pauseBot |
true suspendă AI-ul pentru acest contact în momentul trimiterii mesajului. |
clearIncompleteReply |
true elimină un răspuns parțial al botului, astfel încât acesta să nu fie reluat ulterior. |
human_reply |
true marchează mesajul ca fiind răspunsul unui coleg și anulează un răspuns pe care AI-ul îl avea în coadă. Suspendarea necesită în continuare pauseBot. |
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi, Sarah here - taking over from the assistant.",
"pauseBot": true,
"clearIncompleteReply": true,
"human_reply": true
}'
Răspunsul include "botPaused": true atunci când suspendarea a fost aplicată.
Marcarea unui contact ca privat cu
POST /contacts/bulk-flagsuspendă, de asemenea, botul pentru acesta. Consultați Contacte pentru lista completă a câmpurilor.
Construirea propriei căsuțe de primire
Tot ce are nevoie o căsuță de primire se află pe această pagină și în Contacte:
| Ce aveți nevoie | Endpoint |
|---|---|
| Listare conversații | GET /contacts |
| Citire conversație | GET /contacts/{contactId}/messages |
| Listare sesiuni de chat ale unui contact | GET /chat-sessions/{contactId} |
| Vizualizare mesaje recente | GET /chat-sessions/recent |
| Citire sesiune de chat | GET /contacts/{contactId}/chat-sessions/{sessionId}/messages |
| Trimitere răspuns manual | POST /contacts/{contactId}/send-message |
| Corectare răspuns trimis recent | POST /contacts/{contactId}/messages/{messageId}/edit |
| Eliminare mesaj | DELETE /contacts/{contactId}/messages/{messageId} |
| Ștergere mai multe mesaje | POST /contacts/{contactId}/messages/bulk-delete |
| Reacție cu emoji | POST /contacts/{contactId}/messages/{messageId}/react |
| Evaluare sau marcare cu stea a unui mesaj | PATCH /contacts/{contactId}/messages/{messageId} |
| Marcare ca citit | POST /contacts/{contactId}/mark-read |
| Redirecționare chat către echipă | POST /contacts/{contactId}/mark-unread |
| Exportare transcriere | GET /chat-exports/{contactId} |
| Pauză sau reluare AI | PUT /contacts/{contactId} cu is_bot_active |
Pentru actualizări în timp real, abonați-vă la evenimentele New Message, Replies, Human Alerted și Chat Concluded folosind Webhooks în loc să interogați acest API la un anumit interval de timp.
Erori API mesaje
Endpoint-urile de mesaje returnează plicul de eroare standard:
{
"success": false,
"error": "Contact not found"
}
| Stare | Când se întâmplă pe un endpoint de mesaje |
|---|---|
400 |
Un câmp obligatoriu lipsește sau un parametru este invalid (limit, hours, filter, direction, status incorect, un tablou message_ids gol sau de peste 500 de elemente, un cursor invalid, o editare body goală sau prea lungă, un score în afara -1/0/1, sau un emoji cu spații sau de peste 16 caractere). De asemenea, returnat atunci când un mesaj nu poate fi editat deloc — a fost șters, canalul său nu permite editarea sau a depășit fereastra de editare a acelui canal. |
404 |
Contactul, sesiunea de chat sau unul dintre ID-urile de mesaj furnizate nu a fost găsit. |
409 |
Canalul nu a putut accepta modificarea în acest moment. Nu s-a scris nimic: la o editare, edit_reason explică de ce; la o reacție, canalul a fost momentan inaccesibil și o reîncercare ar putea funcționa. |
422 |
Contactul nu poate primi mesaje de ieșire (nu deranjați, privat sau un canal neacceptat), sau o reacție nu poate fi livrată niciodată în această conversație (reaction_reason indică care). |
Codurile partajate pe care orice endpoint le poate returna — 401, 403 (planul dvs. nu include acces API), 429 (limită de rată) și 500 — sunt listate cu îndrumări pentru reîncercare în Erori și Paginare.
Pașii următori
- Webhooks — primiți actualizări privind starea livrării în loc să interogați.
- Contacte — creați și căutați contactele cărora le trimiteți mesaje.
- Programări — rezervați și gestionați programările pentru contactele dvs.