Documentație pentru dezvoltatori

Construiește pe aichat.md — agenți AI conversaționali, pe orice canal.

O platformă, o singură integrare. Pune un agent inteligent pe site într-o linie de cod, conectează Facebook, Instagram, Telegram și WhatsApp, sau controlează totul programatic prin API-ul REST: agenți, tool-uri, conversații, lead-uri, CRM, automatizări, cunoștințe și analiză.

5canale: Web · FB · IG · Telegram · WhatsApp
REST + SSErăspuns complet sau streaming
3tipuri de tool: webhook · code · builtin
RAGbază de cunoștințe per agent
Început

Pornire rapidă

Agentul pe site, în trei pași:

  1. Creează un agent în panoul aichat.md și copiază-i widgetId-ul (un UUID, din Agent → Canale → Chat Widget).
  2. Lipește scriptul de embed înainte de </body>.
  3. Sau, pentru UI propriu, apelează POST /widget/chat.
index.html
<script src="https://aichat.md/api/v1/widget/bridge/chatbot-script.js?chatflow_id=WIDGET_ID" defer></script>
i

Pentru acces programatic la agenți, canale, conversații sau CRM, obții întâi un token — vezi Autentificare.

Început

URL de bază & versiuni

URL de bazăhttps://aichat.md/api/v1
FormatJSON pe request și response; anteturi Content-Type: application/json.
WidgetRute publice sub /widget, identificate prin widgetId. CORS deschis.
ManagementRute autentificate cu Authorization: Bearer <token>.
VersiuniAproape tot e sub /api/v1. O singură zonă are și /api/v2: dashboard-ul (/api/v1/dashboard și /api/v2/dashboard sunt identice; folosește v2).
Început

Autentificare

Există două niveluri de acces:

Public — widget

Rutele /widget/* sunt publice, identificate prin widgetId. Nicio cheie în front-end. Accesul se restrânge prin lista de origini permise a agentului.

🔑

Autentificat — cont

Restul API-ului cere un JWT Bearer obținut prin login. Același token e acceptat și ca header, și ca cookie access_token.

i

Autentificarea programatică se face azi prin JWT de sesiune (login → token). Nu există (încă) o cheie API de workspace long-lived de pus în .env — pentru integrări server-to-server, reutilizează token-ul de login și reînnoiește-l cu refresh.

Obținerea unui token

Flux: registerverify-emaillogin. Endpoint-urile care emit token returnează { accessToken, refreshToken }.

POST/api/v1/auth/loginpublic
cURL
curl -X POST https://aichat.md/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{ "email": "tu@firma.md", "pass": "••••••••" }'

# → 200 { "accessToken": "eyJ…", "refreshToken": "eyJ…" }
# → 202 { "twofa_required": true, "pendingToken": "…" }   dacă 2FA e activ
# → 228 { "email": "…" }                                  email neconfirmat (un cod NOU e retrimis automat)
!

Atenție la numele câmpurilor — nu sunt uniforme: register cere pass, iar login acceptă pass sau password; verify-email folosește verificationCode (nu code); doar 2FA și reset folosesc code.

Endpoint-uri de autentificare

Metodă & rutăBodyRezultat
POST /auth/register{ email, pass }200 { email } — apoi verificare pe email.
POST /auth/verify-email{ email, verificationCode }{ accessToken, refreshToken }
POST /auth/regenerate-code{ email }Retrimite codul de verificare.
POST /auth/login{ email, pass }Token-uri · 202 2FA · 228 email neconfirmat (serverul retrimite automat un cod nou → treci direct la verify-email).
POST /auth/2fa/login-verify{ pendingToken, code, remember_device? }{ accessToken, refreshToken }
POST /auth/refresh{ refreshToken } (sau cookie)Rotește și returnează token-uri noi.
POST /auth/reset-password{ email }Trimite cod de resetare.
POST /auth/new-password{ email, code, newPassword }{ accessToken, refreshToken } (auto-login).
POST /auth/pass-change 🔒{ password, newPassword }Schimbă parola; invalidează toate sesiunile.
POST /auth/revokeRefreshTokens 🔒{}Logout global — revocă toate refresh-token-urile proprii (doar ale contului tău).

2FA (TOTP) — management (toate 🔒 Bearer)

POST /auth/2fa/setup (→ { secret, qrCode }) · /2fa/verify-enable (→ { backupCodes }) · /2fa/disable · /2fa/status · /2fa/backup-codes/regenerate · GET /2fa/trusted-devices · DELETE /2fa/trusted-devices/:id (id-ul device-ului din listă).

Apoi trimite token-ul pe orice rută autentificată: Authorization: Bearer <accessToken>. Eroare de auth: 401 { message: "🚫 Un-Authorized 🚫" }.

Început

Convenții & paginare

Forma răspunsului

Convenția nu e uniformă pe toată platforma — verifică per zonă:

FormăZone
{ success: true, data: … }widget, conversații, handoff, usage, automation-engine, keywords, dashboard, knowledge, template-library
obiect/array „gol" (fără success)agents, leads, amoCRM (reads), sequences, broadcasts, workflows, analytics, notes, tags, canned-responses

Paginare

List-endpoint-urile mari acceptă page + limit (ex. /conversations, /leads) sau cursor + limit (ex. /conversations/:id/messages). Unde nu e specificat un plafon, limit are un maxim de siguranță (ex. usage/transactions ≤ 500).

Fusuri, criptare, id-uri

Datele-oră sunt în fusul Chișinău (Europe/Chisinau) unde nu se specifică altfel. Agenții și widget-ul folosesc UUID; conversațiile/thread-urile folosesc id-uri numerice.

Început

Erori & rate limits

Coduri de răspuns

CodSemnificație
200 / 201OK.
202Acceptat — proces asincron (ex. indexare fișiere) sau 2FA necesar.
228Email neconfirmat (la login) — nu e eroare; du userul la ecranul de verificare.
400Cerere invalidă (câmp lipsă / format greșit).
401 / 403Neautentificat / interzis (token lipsă, origine neautorizată, agent dezactivat).
402credits_exhausted.
404Resursă / widget inexistent.
409Conflict (ex. lead duplicat 24h, număr deja conectat).
422Entitate neprocesabilă (moderare comentariu respinsă, WhatsApp fără numere).
429Prea multe cereri.
430În afara ferestrei de 24h Meta (Messenger/IG) — nu poți trimite mesaj liber.
500/502/504Eroare de server / serviciu temporar indisponibil — reîncearcă cu backoff.
!

Contractul de eroare diferă pe straturi. Stratul widget întoarce { success:false, error } + anteturi X-RateLimit-* + retryInSec. Stratul de management (autentificat) are un limiter global de 1000 cereri / 15 min / IP care întoarce 429 ca text simplu cu anteturi RateLimit-* (fără JSON). Tratează cele două diferit.

Rate limits — widget

DomeniuLimită
Chat / per widget600 / min
Chat / per IP120 / min
Config / per widget · per IP1200 / min · 90 / min
Comandă / per IP5 / min
Istoric / per IP60 / min

Widget pe site

Instalare widget

Trei metode de embed. Alege una:

1. Script bridge — recomandat (web-component)

html
<script src="https://aichat.md/api/v1/widget/bridge/chatbot-script.js?chatflow_id=WIDGET_ID" defer></script>

2. Loader — sigur pentru Google Tag Manager (web-component)

html
<script async src="https://aichat.md/api/v1/widget/loader.js?widget-id=WIDGET_ID"></script>

3. Embed static v2 — iframe

html
<script src="https://aichat.md/api/v1/widget/v2/embed.js?id=WIDGET_ID"
  data-position="right" data-color="#0d9c93" data-lang="ro"></script>
!

Metodele 1 și 2 montează componenta web <aichat-chat>; metoda 3 e un iframe (buton launcher + <iframe>) și acceptă atribute data-id/data-position/data-color/data-lang. Selectorii CSS pe aichat-chat NU funcționează cu metoda 3.

Aspectul (culoare, nume, avatar, mesaj) se setează din panou sau prin API-ul de config widget. Snippet-ul se poate genera și programatic cu POST /widget/embed-code { chatbot_id }{ success, html }.

Widget pe site

Conversație — chat

POST/api/v1/widget/chatpublic
CâmpDescriere
widgetIdobligatoriuUUID-ul agentului (acceptă și widget_id).
messagesobligatoriu*[{ role, content }], role = user/assistant.
messagealt.Un singur mesaj, în locul lui messages.
sessionIdrecomandatLeagă mesajele într-o conversație. Vezi nota de mai jos.
attachmentsopționalImagini (max 3, ≤4 MB, jpeg/png/webp/gif).
!

sessionId NU e returnat de răspuns. Dacă nu-l trimiți, cererile anonime consecutive nu împart o conversație (fără memorie). Generează și persistă TU un sessionId (ex. în localStorage) și trimite-l la fiecare mesaj — e și cheia pentru istoric.

exemplu
curl -X POST https://aichat.md/api/v1/widget/chat \
  -H "Content-Type: application/json" \
  -d '{
    "widgetId": "1d00a200-8ad9-4bb3-a165-7cfa45960e1d",
    "sessionId": "sess-42",
    "messages": [{ "role": "user", "content": "Ce servicii aveți?" }]
  }'

Răspuns (200)

application/json
{
  "success": true,
  "message": "Avem manichiură, pedichiură și tratamente podologice…",
  "products": [{ "id","title","description","price","currency"?,"image_url"?,"product_url"?,"sku"?,"availability"? }],
  "sources": [{ "index","title","snippet","url"? }],
  "citations": [ … ], "media": [{ "type","url","title" }],
  "actions": [{ "label","url","type" }],
  "quick_replies": [{ "label","value" }],
  "metadata": { "schema": "aichat.rich.v1", "quickReplies", "products", "sources", … } // duplicat camelCase
}
Widget pe site

Streaming — token cu token (SSE)

POST/api/v1/widget/v2/chat/streampublic

Răspunsul e Server-Sent Events: fiecare eveniment e o linie data: <JSON>, cu tipul în câmpul type. Body: { widgetId, messages | message, sessionId?, images? }.

EvenimentPayload
token{ content } — bucată de text (repetat).
tool_start{ message } — agentul rulează un tool.
metadata{ products, quick_replies, sources, citations }.
done{ duration_ms, tokens_in, tokens_out, tools_used, … }.
error{ message } — trimis pe stream (HTTP rămâne 200).
!

Pe stream, sources și citations sunt întotdeauna goale (rezervate), iar produsele au altă formă decât pe /chat: { title, description, price, image, url, sku, in_stock }image/url (nu image_url/product_url). Nu refolosi orbește render-ul de la /chat.

javascript — citire stream
const res = await fetch("https://aichat.md/api/v1/widget/v2/chat/stream", {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ widgetId: "WIDGET_ID", sessionId, message: text })
});
const reader = res.body.getReader(), dec = new TextDecoder();
let buf = "";
while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  buf += dec.decode(value, { stream: true });
  const parts = buf.split("\n\n");
  buf = parts.pop();                     // păstrează fragmentul incomplet
  for (const block of parts) {
    if (!block.startsWith("data:")) continue;
    const ev = JSON.parse(block.slice(5));
    if (ev.type === "token") ui.append(ev.content);
  }
}
Widget pe site

Config widget — citire publică

Configurația publică a agentului (nume, mesaj, culoare, avatar, sugestii, produse). Endpoint-ul canonic e POST; varianta GET e un alias cu cache ETag/304. Pentru setarea configului (owner, cu token) vezi Config widget al agentului.

POST/api/v1/widget/configpublic
GET/api/v1/widget/{widget_id}/configpublic

POST cere body { widget_id }; GET ia widget_id din cale și adaugă ETag + Cache-Control: max-age=60 (trimite If-None-Match pentru 304). Răspuns: { success, config: { name, primary_color, welcome_message, placeholder, assistant_name, greeting_message, position, starter_prompts[], agent:{name,avatar,tone}, products[], cart_enabled } }.

Widget pe site

Istoric conversație

GET/api/v1/widget/history?widget_id=…&session_id=…public

Ultimele 40 de mesaje ale sesiunii: { success, messages: [{ role, content, time }] }. Ambii parametri sunt obligatorii.

Widget pe site

Comandă

POST/api/v1/widget/orderpublic
CâmpDescriere
widget_config_idobligatoriuIdentificatorul widget-ului (același UUID ca widgetId). Fără el → 400.
customer_nameobligatoriuNumele clientului.
cart_itemsobligatoriuProdusele (listă ne-goală).
total_amountobligatoriuTotal (> 0, ≤ 1 000 000).
customer_phoneopțional8–15 cifre.
customer_address · customer_notesopționalLivrare & observații.

Succes: { success: true, order_id }. Rate-limit 5/min/IP; deduplicare 24h pe telefon+widget (409 duplicate_lead_24h).

exemplu — POST /widget/order
{
  "widget_config_id": "WIDGET_ID",
  "customer_name": "Ana Pop",
  "customer_phone": "37360123456",
  "customer_address": "str. Ismail 33, Chișinău",
  "cart_items": [
    { "id": "sku-12", "title": "Set California", "price": 180, "qty": 2 }
  ],
  "total_amount": 360,
  "customer_notes": "fără wasabi"
}
Widget pe site

Integrare headless — agentul în UI-ul tău

Ai deja un chat pe site și vrei doar „creierul"? Poți integra agentul complet în interfața ta — fără bundle-ul nostru, fără SDK, fără cookie. Toată suprafața e un API public JSON/SSE, autentificat doar prin widgetId. Practic apelezi aceleași endpoint-uri de mai sus din codul tău.

din UI-ul tău — un singur apel
curl -sS https://aichat.md/api/v1/widget/chat \
  -H 'Content-Type: application/json' \
  -d '{
    "widgetId": "WIDGET_ID",
    "sessionId": "user-42-conv-7",
    "messages": [{ "role": "user", "content": "Salut, aveți livrare la Chișinău?" }]
  }'
# → { success, message, products, quick_replies, sources, actions, ... }

Piesele de care ai nevoie, toate documentate mai sus:

ScopEndpoint
Răspuns completPOST /widget/chat
Typing în timp realPOST /widget/v2/chat/stream (SSE)
Persona pt UI-ul tău (nume, avatar, sugestii)GET /widget/{id}/config
Rehidratare conversațieGET /widget/history

Autentificare & CORS

  • Auth = doar widgetId. Fără cheie API, fără Bearer, fără cookie, fără HMAC de identitate.
  • CORS pe /widget reflectă orice origine (credentials: false) — domeniul tău e acceptat implicit.
  • Lista de origini permise a agentului se verifică la nivel de aplicație și se ocolește când nu există header Origin (apel din server). Deci dacă chemi din backend-ul tău, nu ești blocat niciodată. Dacă apelezi direct din browser, cere owner-ului agentului să adauge domeniul tău în originile permise.
i

Recomandare de securitate: apelează din backend-ul tău (ascunzi widgetId) și pune identitatea userului verificat în sessionId (ex. clientUserId:conversationId). Nu există (încă) o legare criptografică user↔sesiune de tip „user_hash".

Memorie / sesiune

Tu deții sessionId-ul (string stabil per user-conversație). Serverul persistă fiecare tură, dar nu re-injectează automat istoricul în prompt — pentru multi-turn, trimite tu istoricul în messages[] (max 20 mesaje, 4000 caractere/mesaj, 3 imagini).

Recomandat vs legacy

FoloseșteEvită (compat vechi Flowise)
POST /widget/chatPOST /prediction/:chatflowId
POST /widget/v2/chat/streamGET /chatflows/:id, /chatflows-streaming/:id
GET /widget/:id/config/public-chatbotConfig/:id, /runtime-config/:id
GET /widget/history/chatmessage/:id, /apif/*

Agenți & tool-uri

Agenți

Creează și gestionează agenți programatic. Toate rutele cer Bearer. Un agent are: nume, instrucțiuni (system prompt), model, provider AI, ton, canale și config.

RutăDescriere
GET /agentsLista agenților contului.
POST /agentsCreează agent. Body: name*, instructions, model, aiProvider, description, tone, answerLength, config.
GET /agents/:idDetalii + channels + metadata.
PUT /agents/:idActualizează (nume, instrucțiuni, model, temperature, config, capabilities, language…).
DELETE /agents/:idȘterge agentul.
POST /agents/:id/toggle-pausePauză / reia ({ paused }).
POST /agents/onboarding/parse-websiteExtrage conținut dintr-un site ({ url }).
POST /agents/onboarding/generate-instructionsGenerează un system prompt.
POST /agents/onboarding/completeCreează agentul din configul de onboarding.
i

temperature e blocat la 1.0 la creare (orice valoare trimisă la POST e ignorată), dar poate fi schimbat ulterior prin PUT /agents/:id.

cURL — creare agent
curl -X POST https://aichat.md/api/v1/agents \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{ "name": "Asistent salon", "instructions": "Ești asistentul online…", "model": "gpt-4o-mini", "tone": "friendly" }'

Config widget al agentului

PATCH/api/v1/agents/:id/channels-widget🔒 Bearer

Merge atomic în channels.widget. Câmpuri: theme_color, persona_name, persona_avatar_url, welcome_message, subtitle, placeholder, starter_prompts (max 4, ≤80 char), position, enabled, pet_name, show_online_dot, theme_mode, quick_replies_enabled, auto_focus_input, allowed_origins, plus hide_branding și footer_text (doar PRO+). Alternativă unificată: PUT /agents/:id/widget-config (acceptă și chei camelCase legacy).

Agenți & tool-uri

Modele & provideri

Un agent are un model (nume text, ex. gpt-4o-mini) și un ai_provider (implicit azure). Valorile disponibile depind de planul contului — ia lista reală cu:

GET/api/v1/asistants/models🔒 Bearer

Răspuns: { models, userPlanId }. Folosește un model din această listă la POST /agents / PUT /agents/:id. (Există și aliasul istoric /asisstants/models, cu doi „s".)

i

„agent" = „assistant". Numele parametrului diferă pe endpoint-uri: agentId (agents/altegio), assistantId (sheets/knowledge), asistantId (files — un singur „s"), assistant_id (chatbots/pause-rules). Verifică ortografia exactă a fiecărui endpoint.

Agenți & tool-uri

Tool-uri (funcții)

Dă agentului capacități — să cheme un API, să ruleze cod sau o funcție încorporată. Legate de un agent. Toate rutele cer Bearer.

RutăDescriere
GET /agents/:agentId/toolsLista tool-urilor.
POST /agents/:agentId/toolsCreează. Obligatoriu: name, description, tool_type (+ condiționat webhook_url / code_body).
PUT /agents/:agentId/tools/:toolIdActualizează.
DELETE /agents/:agentId/tools/:toolIdȘterge.
PATCH /agents/:agentId/tools/:toolId/toggleActivează / dezactivează.
POST /agents/:agentId/tools/attachAtașează un tool din librăria contului ({ tool_name } sau { flowise_tool_id }).
POST /agents/:agentId/tools/detachDetașează ({ tool_name }).
POST /agents/:agentId/tools/:toolId/testRulează cu argumente de test.
!

La /test, argumentele trebuie nested sub arguments: body { "arguments": { … } }. Top-level → ignorat. Notă: name e normalizat automat ([^a-zA-Z0-9_]→_, lowercase) — „Verifică Stoc" devine verific__stoc.

Cele trei tipuri

🔗

webhook

Cheamă un URL. webhook_url, webhook_method (def POST), webhook_headers. Interpolare {{var}} din argumente.

code

JavaScript în sandbox (code_body; doar javascript). Primește args + un fetch minimal (status/ok/headers/json/text, timeout 10s); console dezactivat, module blocate (excepție url), timeout cod timeout_ms (implicit 15s).

builtin

Capacitate încorporată (builtin_type + builtin_config): Google Sheets, Altegio, SMS, notificări Telegram ș.a.

Câmpul parameters (argumentele văzute de model) e o listă:

exemplu — creare tool webhook
curl -X POST https://aichat.md/api/v1/agents/AGENT_ID/tools \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "name": "verifica_stoc",
    "description": "Verifică stocul unui produs după cod",
    "tool_type": "webhook",
    "webhook_url": "https://api.magazin.md/stoc?sku={{sku}}",
    "webhook_method": "GET",
    "parameters": [{ "name": "sku", "type": "string", "required": true }]
  }'

Conversații & Inbox

Conversații

Inbox-ul unificat pe toate canalele. Toate rutele cer Bearer. Răspunsuri { success, data }.

RutăDescriere
GET /conversationsListă (query platform, search, tab, page, limit).
GET /conversations/:idO conversație + mesaje recente.
GET /conversations/:id/messagesMesaje paginate (cursor, limit).
POST /conversations/:id/messagesTrimite un răspuns uman ({ content }). 502 dacă livrarea pe canal eșuează.
PUT /conversations/:id/tagsSuprascrie etichetele ({ tags }).
POST /conversations/:id/readMarchează citit.
GET /conversations/:id/searchCaută în mesajele conversației (?q=).
GET /conversations/media-proxy?url=Proxy media FB/IG prin origine.
GET /conversations/:id/refresh-avatarReîmprospătează poza de profil (Meta Graph) când URL-ul CDN semnat expiră → { success, profile_pic, name }.
Conversații & Inbox

Preluare umană (handoff)

Trece o conversație de la bot la un operator uman și înapoi. Bearer, răspunsuri { success, data }.

GET /handoff/pendingConversații care așteaptă un om.
GET /handoff/mineConversațiile mele.
POST /handoff/:id/takePreia conversația.
POST /handoff/:id/resolveRezolvă ({ notes? }).
POST /handoff/:id/returnDă controlul înapoi botului.
POST /handoff/:id/stop-bot · /start-botOprește / repornește răspunsurile automate.
POST /handoff/:id/cancel-auto-pauseAnulează o pauză automată activă.
Conversații & Inbox

Note · Etichete · Canned · Export · Contacte · Pause-rules

Unelte de inbox. Toate Bearer.

ZonăEndpoint-uri
Note /notesGET /:threadId · POST / ({ threadId, content }) · PUT /:id · DELETE /:id (ambele doar autorul notei; altfel 403).
Etichete /tags, /threadsGET/POST /tags · DELETE /tags/:id · GET /threads/:threadId/tags · POST /threads/:threadId/tags ({ tagId }) · DELETE /threads/:threadId/tags/:tagId.
Răspunsuri rapide /canned-responsesGET · POST ({ shortcut, title, content }) · PUT /:id · DELETE /:id.
Export /exportGET /:threadId?format=json|csv · GET /:threadId/pdf (HTML print-ready).
Contacte /contactsGET /duplicates · POST /merge ({ primaryThreadId, secondaryThreadId }).
Reguli de pauză /pause-rulesGET /defaults · GET/POST /config · GET/POST / (per assistant_id).
Web-push /pushPOST /subscribe · /unsubscribe · GET /status · GET /vapid-key (public).
Bulk inbox /threads-bulkPOST /bulk-action ({ threadIds[], action }; actionclose|pause|unpause|mark_spam|export).
Conversații & Inbox

Template-uri Meta

Trimite template-uri structurate pe Messenger (proxy către Facebook Graph). Bearer; toate cer recipient_id și întorc { success, message_id }.

POST /templates/receiptTemplate Receipt (order_number, summary, items[]…).
POST /templates/listTemplate List (elements ≥ 2).
POST /templates/mediaTemplate Media (url sau attachment_id).
POST /templates/otn/request · /otn/sendOne-Time-Notification: cere permisiune, apoi trimite cu token.

Librărie de template-uri (CRUD) — /templates/library

GET /library · GET /library/most-used · GET /library/variables · POST /library/validate · GET /library/:id (+/preview) · POST /library ({ name, templateType, content }, tipuri: text/quick_replies/buttons/generic/carousel/media) · PUT /library/:id · POST /library/:id/duplicate · DELETE /library/:id.


Canale

Facebook Messenger

Conectarea unei pagini se face prin OAuth din panou; API-ul leagă o pagină de un agent. Toate cer Bearer.

GET /facebook/oauth-initURL-ul dialogului OAuth Facebook.
GET /facebook/pagesPaginile + ce agent are fiecare (pages[].assigned.chatbotId).
POST /facebook/pages/assignLeagă o pagină de un agent ({ pageId, agentId }) + abonează webhook-ul.
DELETE /facebook/pages/unassignDetașează ({ chatbotId }, nu pageId!). Non-destructiv.
POST /facebook/send-messageMesaj ca operator ({ receiver_user_id, text, reply_to_mid? }; pune botul pe pauză). 430 în afara ferestrei Meta.
POST /facebook/send-attachmentAtașament (multipart file + receiver_user_id).
!

unassign se face după chatbotId (din GET /pages → assigned.chatbotId), NU după pageId-ul folosit la assign. Aceeași regulă la Instagram.

Canale

Instagram

Toate cer Bearer.

GET /instagram/login · /pagesURL OAuth · conturile IG + asignarea.
POST /instagram/pages/assignLeagă un cont IG de un agent ({ instId, agentId }).
DELETE /instagram/pages/unassignDetașează ({ chatbotId }).
POST /instagram/pages/revokeȘterge conexiunea local (necesită { instId }; nu revocă grant-ul OAuth pe Meta).
POST /instagram/unlinkDeconectare la nivel de cont.
POST /instagram/send-message · /send-attachmentMesaj / atașament ca operator.
Canale

Telegram

Bot partajat (@aichat_connect_bot) — clientul nu introduce un token de bot. Conectare: cod de 6 cifre → în bot → Telegram Business Connection (Premium) → business_connection_id. Toate cer Bearer.

POST /telegram/get-codeGenerează codul de conectare ({ success, code }).
GET /telegram/business-connectedStarea ({ connected, business_connection_id }).
POST /telegram/unlink · /send-messageDeconectare · mesaj ca operator.
Canale

WhatsApp (Cloud API)

Toate cer Bearer.

GET /whatsapp/statusStarea conexiunii + diagnostic.
POST /whatsapp/connectEmbedded Signup ({ code } + opțional waba_id/phone_number_id/agentId). 502 token_exchange_failed, 422 no_whatsapp_numbers_found.
POST /whatsapp/connect-manualFallback dev/test ({ phone_number_id, token }).
POST /whatsapp/disconnectDeconectează.

Un număr aparține unui singur cont: 409 whatsapp_number_already_connected_to_another_account.

Canale

Webhook-uri Meta

Pentru FB/IG/WhatsApp, mesajele intră prin webhook-ul Meta — configurat automat la conectare. Nu găzduiești tu nimic.

GET /api/v1/webhook publicVerificare Meta (hub.challenge + verify-token).
POST /api/v1/webhook publicRecepție evenimente (semnate X-Hub-Signature): mesaje, comentarii, reacții, statusuri.
Canale

Profil Messenger / Instagram

Configurează profilul de mesagerie al unei pagini: buton „Începe", meniu persistent, mesaj de întâmpinare, ice-breakers. /messenger-settings, Bearer. :platform = facebook sau instagram.

GET /messenger-settings/:platform · PUT /:platformCitește / salvează setările de profil.
POST /messenger-settings/:platform/get-startedButonul „Începe".
POST /messenger-settings/:platform/persistent-menuMeniu persistent.
POST /messenger-settings/:platform/greetingMesaj de întâmpinare.
POST /messenger-settings/:platform/ice-breakersIce-breakers (întrebări sugerate la deschidere).
GET /messenger-settings/:platform/live-profileProfilul curent, direct de la Meta.

Automatizări

Automation engine

Reguli event-driven (declanșator → condiții → acțiuni). Bearer, răspunsuri { success, data }.

POST /automation-engine/triggersCreează trigger. Ex: { integrationId, name, triggerType:"new_conversation", triggerScope:"dm", allowedActions:["reply_text"] }. triggerTypenew_conversation|story_mention; triggerScopedm|story.
GET /automation-engine/triggersListă (query integrationId).
PUT · DELETE /automation-engine/triggers/:idActualizează / șterge.
POST /automation-engine/previewDry-run, fără efecte.
GET /automation-engine/executionsIstoricul execuțiilor.
i

Există și un modul mai vechi de task-uri programate (mesaje AI/fixe de follow-up) montat la /api/v1/tasks: GET/POST /tasks, POST /tasks/update, /tasks/delete, /tasks/switch.

Automatizări

Sequences & Broadcasts

Sequences (drip) — /sequences

GET / · GET /:id · POST / ({ name, steps[] }) · PUT /:id · DELETE /:id · PATCH /:id/activate · POST /:id/enroll ({ recipientId, pageId }) · GET /:id/enrollments.

Broadcasts (1-la-mulți) — /broadcasts

GET / · POST / ({ message | templateId, filterTags?, scheduledAt? }) · GET /:id · POST /:id/send (pune în coadă) · DELETE /:id. Livrarea e worker-driven; /send doar schimbă starea în sending.

Automatizări

Keywords & Workflows

Keywords (auto-reply pe cuvinte) — /keywords

GET / · GET /:id · POST / · PUT /:id · PATCH /:id/toggle · DELETE /:id · POST /match-preview ({ integrationId, text }).

La POST /: obligatoriu doar keyword. matchTypeexact|contains|starts_with|regex (implicit contains); responseTypedm|comment|both (implicit dm).

!

dmMessage e obligatoriu când responseType e dm (implicit!) sau both; commentReply obligatoriu când e comment sau both. Un POST { keyword } minim → 400 "dmMessage is required for dm/both response types".

Workflows — /workflows

GET / · GET /:id · POST / ({ name, steps[], triggerConfig }) · PUT /:id · DELETE /:id · PATCH /:id/activate.

Automatizări

Mesaje programate

/schedule, Bearer. POST /create ({ chat_id, name, description, dateTime, service } + repeat?) · POST /update ({ id, … }) · POST /delete ({ id }) · GET /by-conversation?chat_id=&service=.


Lead-uri & CRM

Lead-uri & etichete

Conversațiile devin lead-uri, pe etichete și board kanban. Bearer.

GET /leadsListă cu filtre (canal, etichete, scor, dată, căutare, page).
GET /leads/canban · /leads/canban/tagBoard kanban · coloană per etichetă. (ruta e scrisă literal canban.)
POST /leads/create-tag · GET /leads/tagsCreează etichetă ({ tag, description, color? }) · listă.
POST /leads/set-tagPune etichetă ({ tag_id, tag_name, chat_id, type, service }).
POST /leads/pausePauză bot pe un lead ({ chat_id, service }).
POST /leads/analyzeAnaliză AI ({ page_id, recipient_id, platform }).
GET /leads/meta · /leads/meta/statsLead-uri Meta îmbogățite + statistici.
Lead-uri & CRM

amoCRM

Sincronizare cu amoCRM. Bearer. Reads întorc obiecte „goale" ({pipelines}, {leads}); writes { success }.

GET /amocrm/statusStarea conexiunii.
POST /amocrm/connect · /connect-oauth/connect: { subdomain, access_token } obligatorii (client_id/client_secret opționale). /connect-oauth: { code, subdomain, client_id, client_secret } obligatorii.
POST /amocrm/logoutDeconectare.
GET /amocrm/pipelinesPipeline-uri (statusurile vin în _embedded.statuses).
GET /amocrm/statuses?pipeline_id=Statusuri — pipeline_id obligatoriu.
POST /amocrm/statusesSalvează pipeline + statusuri selectate.
GET / POST /amocrm/leadsListă / creare lead-uri.
GET /amocrm/leads/:id · PATCH /leads/:idDetaliu · update (e PATCH).
POST /amocrm/leads/:id/move · /note · /tagsMută · notă ({ text }) · etichete ({ tags_to_add, tags_to_delete }).
POST /amocrm/tasksSarcină pe lead ({ lead_id, text }).
GET /amocrm/custom-fields · /usersCâmpuri custom · utilizatori (pt mapare + responsible_user_id).
PATCH /amocrm/contacts/:idActualizează un contact (ex. { custom_fields_values }) — util pentru completarea telefonului/emailului după creare.
Lead-uri & CRM

Bitrix24

Sincronizare CRMPOST /bitrix-crm/connect ({ webhookUrl }) · GET /bitrix-crm/status · GET /bitrix-crm/statuses · DELETE /bitrix-crm/disconnect. Toate Bearer.

Canal de chat (Bitrix24 Open Channels) — separat de sync-ul CRM, înregistrează un imbot la /bitrix: POST /bitrix ({ data: { botName, clientId, webhookUrl } }) · POST /bitrix/remove · GET /bitrix/getDataBitrix.


Integrări native

Google Sheets

Agentul scrie lead-urile ca rânduri într-o foaie. La conectare se atașează un tool builtin. Bearer.

GET /google-sheets/connect-infoEmailul robot cu care partajezi foaia.
POST /google-sheets/test-connectionVerifică accesul.
POST /google-sheets/connectConectează + atașează tool ({ assistantId, spreadsheetUrl, fields, sheetTab?, dedupeKey? }).
GET / · /for-assistant/:idListă · stare per agent.
PATCH /:id · POST /:id/test-row · DELETE /:idEditează mapping · test · deconectează.
Integrări native

Altegio — programări online

Conectează calendarul Altegio al unui salon. Clientul lipește doar Company ID; se atașează 5 tool-uri (servicii, disponibilitate, creare, anulare, mutare). Bearer.

POST/api/v1/altegio/connect🔒 Bearer
CâmpDescriere
agentIdobligatoriuAgentul căruia i se atașează tool-urile.
companyIdobligatoriuID-ul salonului din Altegio.
userTokenopționalActivează anularea/reprogramarea. Stocat criptat.
bookingEnabledopționalPermite crearea de programări.

Răspuns: { integrationId, companyId, salon, servicesCount, bookingEnabled, attached }. Stare: GET /altegio/for-assistant/:agentId; deconectare: DELETE pe aceeași rută.

Integrări native

Telegram Leads · SMS · alte integrări

IntegrareEndpoint-uri
Telegram Group Leads /telegram-leadsGET /connect-info · GET / · POST /start-link · GET /status?assistantId= · GET /for-assistant/:id · PATCH /:id · POST /:id/test · DELETE /:id.
SMS (Infobip)Expus ca tool builtin (builtin_type: "sms_send"), nu ca rută REST — cheia rămâne pe server.
Shopify /shopifyPOST /logout (deconectare).
Wix /wixPOST / (conectare) · POST /logout.
Jivo /jivoPOST / ({ data: { providerId } }providerId obligatoriu) · POST /remove · GET /getDataJivo.

Cunoștințe

Bază de cunoștințe (RAG)

Alimentează agentul cu surse — text, documente, site-uri, întrebări-răspuns. Bearer, răspunsuri { success, data }.

GET /knowledge/sources · /sources/:idListă (filtre assistantId, status, sourceType) · una singură.
POST /knowledge/sourcesCreează. Obligatoriu: sourceType (∈ text|document|website|qa_pairs) + name. content doar pentru text; websiteUrl doar pentru website; document/qa_pairs nu cer niciunul.
POST /knowledge/sources/uploadDin fișier încărcat (≤10 MB).
PUT /knowledge/sources/:id · DELETE /:idActualizează (re-chunk) · șterge.
POST /knowledge/sources/:id/resync · /reextract-productsRe-chunk/re-embed · re-extrage produse.
GET /knowledge/sources/:id/products · /chunksCitește produsele extrase (pereche cu re-extract) · chunk-urile (re-)generate ale sursei.
GET / PUT /knowledge/config/:assistantIdConfig RAG per agent.
Cunoștințe

Fișiere & documente

Documente în indexul unui agent (pdf, doc, docx, txt, csv, json, md, markdown, rtf, log, text; ≤5 MB/fișier). Extensiile nelistate sunt încercate, nu respinse — doar lipsa extensiei → 400. Bearer.

POST /filesÎncarcă (câmp multipart files + asistantId). Async automat dacă un fișier ≥300 KB sau totalul ≥700 KB (sau forțat cu asyncUpload=true): 202 + jobId; sub praguri: 200 sync.
GET /files/upload-status/:jobIdProgresul indexării.
GET /files?asistantId= · POST /files/deleteListă · șterge ({ fileId, asistantId }).
Cunoștințe

Scraping site → index căutabil

Extrage conținutul unui site și îl face căutabil (pagini, produse). /scrape, Bearer.

POST /scrapePornește un scrape ({ url, selector_url_override?, sitemap_urls_override_str? }).
GET /scrape/search?query_text=&page_size=&page_number=&index=Căutare full-text paginată (toți parametrii obligatorii).
GET /scrape/list · /status/:indexSite-urile scrape-uite · statusul unui job (404 dacă lipsește).
GET /scrape/:index?offset=&limit=Rândurile/produsele dintr-un index (implicit offset 0, limit 100).
PUT /scrape/:index · DELETE /:indexUpdate o intrare ({ key, data }) · șterge o intrare ({ key }).
DELETE /scrape/delete/:indexȘterge tot indexul unui site.

Analiză & voce

Analytics & Dashboard

Analytics — /analytics (Bearer; răspunsuri „goale")

GET /messages-per-day?days= ([{ date, incoming, outgoing }]) · GET /top-agents?days= · GET /overview ({ messagesToday, messagesThisWeek, activeThreads, total_contacts, … }).

Dashboard — /api/v2/dashboard (recomandat) sau /api/v1/dashboard

Toate GET, Bearer, cache scurt, rate-limit 60/min: /stats?period= · /trend?days= · /pages · /leads/recent?limit= · /alerts · /comments-stats?period= · /cost-detail?period=.

Analiză & voce

Consum & credite

/usage, Bearer. Query period = 1d/7d/30d/all (implicit 30d).

GET /usage/summary?period={ credits:{ remaining, limit, used_in_period, used_today }, messages, tokens, cost_usd, wallet }.
GET /usage/breakdownPe model, sursă, agent, zi.
GET /usage/transactionsRegistru tranzacții de credit (limit ≤ 500).
GET /settings/credit-historyIstoric credite + abonament + grafic 30 zile.
Analiză & voce

Voce (ElevenLabs)

Clonare și management de voci. /create și /update folosesc multipart/form-data. Bearer.

GET /eleven-labs · /voice?eleven_id=Listă voci · o voce.
POST /eleven-labs/createCreează voce — multipart, câmp files (repetabil) + name obligatorii; opțional description, labels (JSON).
POST /eleven-labs/updateEditează o voce (multipart): eleven_id + name obligatorii; files opțional (prezent → adaugă mostre; absent → doar metadate).
POST /eleven-labs/deleteȘterge o singură mostră dintr-o voce ({ eleven_id, sample_id }).
POST /eleven-labs/voice/deleteȘterge toată vocea ({ id }).
GET /eleven-labs/available-voicesVoci disponibile contului.
!

Numele câmpului multipart e exact files (repetat pentru mai multe mostre). Trimis literal ca files[], multer îl respinge cu eroare „Unexpected field".


Cont & facturare

Credite — cum se calculează

Creditul e unitatea de facturare. Numărul de credite pe un răspuns AI depinde DOAR de modelul folosit — nu de câți tokeni s-au consumat. E o taxare flat pe mesaj, per model.

formula
credite_pe_mesaj = pret_flat_al_modelului  (+ suprataxe media, doar FB/IG)

Apelurile de tool și RAG/cunoștințe nu adaugă credite — un mesaj cu 5 tool-calls costă cât unul simplu.

Preț per model

Credite / mesajModele (exemple)
1GPT-4o mini, 4.1, 4.1 nano, DeepSeek V3, Gemini Flash Lite
24.1 mini, 5 nano, Llama 3.3 70B / Llama 4 Maverick, Grok 3 mini, Gemini Flash
35.4, 5.4 mini, 5 mini, 5.5 mini, Kimi K2.5
4GPT-5, 4o, GPT-OSS 120B, Cohere Command A
5GPT-5.1, Mistral Large 3, Grok 4 Non-Reasoning
8GPT-5.2, Gemini 3 Pro / 3.1 Pro
10–12GPT-5.3, GPT-5.5, Grok 4 fast, 5.6 Terra/Luna
25Grok 4

Suprataxe media (doar FB/IG)

Peste prețul modelului: mesaj vocal primit (transcriere) +1; generare imagine +5/imagine; răspuns vocal TTS ElevenLabs +20 (alt TTS/STT +10).

Planuri & limite

PlanPrețCredite incluse
free00 (+150 trial 14z)
standard€492.000
pro€15010.000
ultra€29930.000
business€49950.000
  • Sold = limit − current (din UserSettings.tokens).
  • La activarea abonamentului: limit = max(limit, current + credite_plan).
  • Top-up one-time: credite = floor(tokeni_cumpărați / 3).
  • La epuizare (current ≥ limit) → 402 credits_exhausted.
  • Fiecare cont nou primește automat un trial de 14 zile cu 150 credite; după expirare rămâne pe free (0 credite recurente).
i

Exemplu: un mesaj pe FB cu agent pe Grok 4 = 25 credite; un mesaj vocal pe IG cu gpt-5.4 (3) + transcriere (+1) + răspuns TTS ElevenLabs (+20) = 24 credite; un text simplu = între 1 și 25 credite, după model.

Citirea stării (sold / consum)

Endpoint-urile de citire sunt documentate în Consum & credite (GET /usage/summary, GET /settings/credit-history) și Facturare (GET /stripe/billing/overview, GET /stripe/billing/dashboard).

Cont & facturare

Cont & profil

/users, Bearer.

GET /users/profileProfil complet: user, plan_id, credite rămase, stare Stripe, abonament + zile-expirare, canale IG/FB.
POST /users/updateActualizează full_name, bio, email (sync și la Stripe).
POST /users/change-localeLimba UI (locale).
POST /users/me/delete-request · /me/delete-cancelGDPR: cerere ștergere cont (grace 30 zile) / anulare. delete-request cere { confirm_email } (= emailul contului, altfel 400); reason opțional → { success, scheduled_at, grace_ends_at }.
Cont & facturare

Facturare (Stripe)

/stripe, Bearer. (Webhook-ul /stripe/webhook e public/semnat — nu-l apelezi tu.)

POST /stripe/create-checkout-sessionCheckout abonament ({ product } = lookup_key, ex. pro_month).
POST /stripe/create-checkout-session-on-tokenCheckout top-up credite — body { unit_amount_decimal } (sumă în USD; acordă sumă×100 credite).
GET /stripe/create-billing-portalLink portal facturare Stripe.
GET /stripe/billing/overview · /stripe/billing/dashboardPlan + credite + forecast.
GET /stripe/billing/invoices · /billing/charges · /billing/upcomingFacturi · plăți · factura viitoare.
POST /stripe/billing/invoices/:id/retryReîncearcă plata unei facturi.
GET /stripe/historyIstoric achiziții.
Cont & facturare

Chatbots — mapare canal ↔ agent

Un „chatbot" leagă un canal (FB page, IG, widget…) de un agent. /chatbots, Bearer.

GET /chatbotsListă.
POST /chatbots/create · /updateCreează / actualizează mapare (platformassistant_id).
POST /chatbots/disable · /deleteToggle enabled · șterge.
POST /chatbots/settings · /commentsSetări bulk (auto-reply, nume, agent) · reply comentarii.
POST /chatbots/master-toggle · GET /master-statusOn/off general toate canalele · stare.
POST /chatbots/service-bulk-toggle · GET /service-statusOn/off per serviciu · contoare.
Cont & facturare

Echipe & referral

Echipe (multi-user) — /teams

Mai mulți operatori pe un cont, cu roluri (admin/agent/viewer). Bearer.

POST /teams · GET /teamsCreează echipă ({ name } — o singură echipă deținută per user; a 2-a → 400) · listă echipe (deținute + membru).
GET /teams/:id · PUT /teams/:idDetalii + membri · redenumește (owner).
POST /teams/:id/inviteInvită pe email ({ email, role }).
PUT /teams/:id/members/:memberId/role · DELETE /members/:memberIdSchimbă rol · scoate membru.
POST /teams/accept-inviteAcceptă invitațiile pending.

Referral — /referrals

Program de recomandare cu coduri promo și cont Stripe Express. Bearer.

GET /referrals/referrals-infoDashboard: balanță, coduri promo, nr. referrals, câștig.
POST /referrals/create-stripe-account · GET /dashboardCont Stripe Express + coupon · link dashboard/onboarding.
POST /referrals/create-promocodeCreează cod promo pe cuponul tău ({ code }).
POST /referrals/deactivate-promocodeDezactivează / reactivează un cod promo — toggle reversibil ({ code }).
POST /referrals/delete-promocodeȘterge definitiv codul (îl scoate din listă + Stripe active:false; ireversibil).
POST /referrals/create-checkout-sessionCheckout abonament cu cod referral.

Alte API

999.md (Simpals)

Integrare cu marketplace-ul 999.md. /trei9, Bearer.

POST /trei9/auth · /unlinkLeagă contul ({ username_simpals, refreshToken }) · deconectează.
GET /trei9/threads · /thread?chat_id=Contacte · mesajele unui thread.
POST /trei9/send-message · /edit-configTrimite mesaj · config per-thread (AI on/off).
Alte API

Formulare & suport

/storage. Tichete de suport și formulare (unele publice, pentru pagini de contact).

POST /storage/help-requests 🔒Ticket suport + atașamente (notif Telegram).
POST /storage/callback 🔒Cere callback.
POST /storage/contact-us · /get-demo · /cv · /enterprise publicFormulare publice de contact/demo/CV/enterprise. Rate-limit 1/10min doar pe /get-demo și /cv; /contact-us și /enterprise sunt fără limită.
Alte API

Calitate agent (audit)

Audit automat al conversațiilor unui agent, cu scoruri și recomandări. Bearer.

GET /agents/:id/quality · /quality/:auditIdAudituri recente · detaliu (scoruri + fragmente).
POST /agents/:id/quality/runRulează manual un audit.
POST /agents/:id/quality/:auditId/applyAdaugă recomandările la instrucțiunile agentului.
Alte API

Events & monitoring

GET /events?userId= publicStream SSE real-time per user (mesaje noi, notificări; heartbeat 10s).
GET /monitoring?start=&end= 🔒Consum per-user: tokeni, zilnic, voce TTS/STT, imagini.
Alte API

Jurnal audit · Changelog · Conținut public

GET /audit?page=&limit=&action=&entity_type=&from=&to= 🔒Jurnalul de acțiuni al contului tău (paginat, filtrabil). GET /audit/actions = tipurile de acțiuni.
GET /changelog · /latest · /seen 🔒Feed-ul de noutăți al produsului + starea „văzut". POST /changelog/seen marchează ca citit.
GET /posts/news · /news/:slug · /blogs · /blogs/:slug publicConținut public news/blog (site marketing) — parametru ?locale=.

Comentarii & social

Postări pe pagini (Facebook & Instagram)

Publică și programează conținut pe paginile conectate. Bearer; proxy către Meta Graph.

Facebook — /page-posts

POST /page-postsPost text/link (message SAU link; opțional published, scheduled_publish_time între 10 min și 6 luni).
POST /page-posts/photoPost foto (url; opțional message, scheduled_publish_time).
PUT /page-posts/:postId · DELETE /:postIdEditează textul · șterge.
GET /page-posts?limit=&after=Listă postări feed (limit implicit 25, max 100).

Instagram — /ig-publish

POST /ig-publish/postPost imagine (image_url; opțional caption, location_id, user_tags).
POST /ig-publish/video · /reelVideo feed / Reel (video_url; opțional caption, thumb_offset, share_to_feed).
POST /ig-publish/carouselCarusel 2–10 elemente (items[]; opțional caption).
POST /ig-publish/storyStory (image_url SAU video_url).
i

Programarea nativă IG e nefiabilă (Meta o ignoră frecvent) — pentru IG, publică la momentul dorit din propriul scheduler.

Comentarii & social

Comentarii FB/IG

Moderare și auto-reply AI pe comentariile de Facebook/Instagram, cu coadă de aprobare, template-uri și reguli de declanșare. /comments, Bearer.

Setări & moderare

GET /comments/settings · PUT /settingsPagini + toggle-uri auto/private reply · actualizează toggle-urile.
GET /comments/health · /diagnosticsDiagnostic sănătate pagină (token, stats 30 zile).
GET /comments/recentUltimele 50 de comentarii pe toate paginile.
POST /comments/:id/hide · /reply · DELETE /:idAscunde · răspuns manual (≤8000) · șterge.
POST /comments/bulk-hideHide/unhide în masă (max 25).
POST /comments/media/:mediaId/toggle-commentsActivează/dezactivează comentariile pe un post IG ({ enabled, page_id }).
POST /comments/settings/:chatbotId/archive · /restoreArhivează / restaurează o pagină din lista de setări.

Coadă de aprobare AI

GET /comments/pending · /pending/countDrafturi AI în așteptare + contor pentru badge.
POST /comments/:id/approve · /:id/rejectAprobă & publică (opțional edited_text) · respinge.
POST /comments/chatbots/:id/comments-configMod (off/auto/approval) + instrucțiuni AI pe chatbot/agent.

Template-uri & reguli de declanșare

/comments/predefined-replies (CRUD)Template-uri de răspuns public.
/comments/predefined-pm-messages (CRUD)Template-uri de mesaj privat.
/comments/trigger-rules (CRUD)Reguli auto-reply (matchType exact/contains/regex → răspuns/PM).
POST /comments/trigger-rules/match-previewTestează o regulă pe un text, fără salvare.

Comentarii live (FB Live)

GET /live-comments/:videoId/streamStream SSE al comentariilor live (poll Graph la 2s).
GET /live-comments/:videoIdComentarii live recente (non-stream, cu cursor after).
POST /live-comments/:id/hide · DELETE /:idAscunde · șterge.

Referință

Suport

Panou aichat.md

Creezi agentul, iei widgetId, configurezi canalele și originile permise.

Deschide panoul →

Contact tehnic

Pentru acces, integrări dedicate sau întrebări despre API — scrie-ne prin formularul din panou sau POST /storage/contact-us.

Integrare la cheie

Scenariu complex (tool-uri proprii, canale multiple, CRM)? Echipa te ajută.

Raportare bug programatică: POST /api/v1/bug-report — multipart cu până la 10 capturi (screenshots), rate-limit 5/min; atașează userul dacă trimiți un JWT, altfel anonim.