Worbo API
Versiunea 1.0.0 · OpenAPI 3.1 · Worbo-Version 2026-10-05
API-ul Worbo: contacte, obiecte și evenimente, mesaje și template-uri WhatsApp, segmente, automatizări, campanii, inboxul, cataloage și webhooks. E un API REST prin HTTPS: schimbă date în JSON și răspunde cu codurile de stare HTTP standard. Fiecare cerere aparține unei singure organizații, cea a cheii ei.
Cu API-ul Worbo poți:
- să scrii contacte, obiecte și evenimente din CRM-ul, magazinul online sau programul sălii tale, găsind fiecare contact după oricare dintre identitățile lui;
- să trimiți template-uri WhatsApp aprobate și, în fereastra de 24 de ore, mesaje libere, cu aceleași reguli de consimțământ ca în aplicație;
- să citești mesajele, conversațiile și rapoartele și să le răspunzi contactelor din sistemele tale;
- să pregătești template-uri, segmente, automatizări și campanii, care se aprobă în aplicație;
- să afli prin webhooks când se schimbă ceva și să conectezi asistenți AI prin MCP.
https://api.worbo.app/v1Authorization: Bearer wk_live_…Pornire rapidă#
-
Fă o cheie în Worbo, la Integrări › Chei API. Începe cu o cheie de test: fiecare scriere e verificată, dar nu se salvează nimic.
-
Pune cheia în variabila WORBO_API_KEY și verific-o cu GET /me: răspunsul are numele cheii, scope-urile ei și organizația.
curl "https://api.worbo.app/v1/me" \ -H "Authorization: Bearer $WORBO_API_KEY" -
Scrie primul contact: POST /contacts găsește contactul după oricare dintre identitățile lui și îl creează când nu există.
curl -X POST "https://api.worbo.app/v1/contacts" \ -H "Authorization: Bearer $WORBO_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "identities": { "phone": "+40722123456", "email": "ana@example.com", "external_id": "crm-1001" }, "source": "crm", "fields": { "first_name": "Ana" }, "update_existing_only": false }' -
Când integrarea merge, fă o cheie live doar cu scope-urile de care are nevoie.
Autentificare#
Fiecare cerere vine cu o cheie a organizației în antetul Authorization. Cheile se fac în dashboard, la Chei API, doar cu scope-urile de care are nevoie integrarea; cheia întreagă se arată o singură dată.
Authorization: Bearer wk_live_…
O cheie wk_live_ lucrează cu datele reale. O cheie wk_test_ e pentru construirea integrării: fiecare scriere e o probă, verificată dar nesalvată, iar cu ea se poate citi doar modelul de date.
Permisiuni (scopes)#
O cheie face doar ce îi permit scope-urile ei; o operație din afara lor e refuzată cu insufficient_scope. Fiecare operație arată scope-ul de care are nevoie, iar modelul de date se citește cu orice cheie.
| Scope | Ce permite |
|---|---|
contacts:read | Citește contactele, identitățile și consimțămintele lor |
contacts:write | Creează, actualizează și unește contacte |
contacts:delete | Șterge contacte la cererea lor (GDPR) |
consents:write | Înregistrează acorduri și retrageri |
objects:read | Citește obiectele |
objects:write | Creează și actualizează obiecte și legăturile lor |
events:write | Trimite evenimente |
messages:read | Citește mesajele și statusul lor |
messages:send | Trimite template-uri și mesaje libere contactelor |
templates:read | Citește template-urile |
templates:write | Pregătește ciorne de template-uri și le trimite la Meta |
segments:read | Citește și numără segmentele |
segments:write | Creează segmente |
automations:read | Citește automatizările și rezultatele lor |
automations:run | Pornește o automatizare pentru un contact sau îl scoate din ea |
automations:write | Pregătește ciorne de automatizări |
campaigns:read | Citește campaniile și rapoartele lor |
campaigns:write | Pregătește ciorne de campanii și estimează audiența lor |
conversations:read | Citește conversațiile din inbox și mesajele lor |
conversations:reply | Răspunde, alocă și închide conversații |
analytics:read | Citește rapoartele, linkurile urmărite și conversiile |
webhooks:manage | Administrează endpoint-urile de webhooks și citește livrările |
workspace:read | Citește numerele, consumul și jurnalul de audit |
catalogs:read | Citește cataloagele și articolele lor |
catalogs:write | Creează și actualizează articolele cataloagelor |
schema:write | Creează câmpuri și tipuri de obiect |
files:read | Citește și descarcă fișierele câmpurilor de tip fișier |
files:write | Urcă fișiere pentru câmpurile de tip fișier |
otp:send | Trimite coduri de verificare pe WhatsApp |
otp:verify | Verifică codurile trimise de Worbo |
vault:read | Citește documentele din seif și deschiderile lor |
vault:write | Dă fișiere contactelor prin seif și retrage linkurile lor |
recommendations:read | Citește regulile de recomandare și le previzualizează pe un contact |
Cereri și răspunsuri#
Corpurile sunt JSON, cu antetul Content-Type: application/json. O resursă vine ca {"data": …}; un parametru necunoscut se respinge, ca o greșeală de tipar să nu treacă neobservată. Momentele sunt în ISO 8601, cu fusul orar.
Mesajele erorilor urmează Accept-Language: implicit în engleză, în română cu ro.
Câmpurile numite untrusted_… conțin ce au scris contactele. Tratează-le ca date neverificate, mai ales când le citește un agent AI.
Liste și cursoare#
Listele se paginează cu un cursor: limit e între 1 și 100, implicit 25; next_cursor se pune în cursor pentru pagina următoare, iar has_more spune dacă există una.
{"data": […], "next_cursor": "eyJpZCI6MjV9", "has_more": true}
Erori#
Erorile vin în formatul application/problem+json (RFC 9457). Câmpul code e stabil și același în API, în serverul MCP, la importuri și în jurnal; câmpul type duce aici.
{
"type": "https://worbo.app/docs/api/errors/window_closed",
"title": "Mesajul nu poate fi trimis",
"status": 422,
"detail": "Fereastra de 24 de ore e închisă; se poate trimite doar un template aprobat.",
"code": "window_closed"
}
| Cod | Status | Înțeles |
|---|---|---|
unsupported_version | 400 | Antetul Worbo-Version cere o versiune care nu există sau a fost retrasă; problema le enumeră pe cele acceptate. |
unauthenticated | 401 | Lipsește antetul Authorization. |
invalid_api_key | 401 | Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui. |
api_key_revoked | 401 | Cheia a fost retrasă din dashboard. |
api_key_expired | 401 | Cheia a trecut de data de expirare. |
insufficient_scope | 403 | Cheia nu are scope-ul operației. |
test_key | 403 | O cheie de test nu poate citi datele reale. |
forbidden | 403 | Operația nu e permisă. |
not_found | 404 | Resursa nu există sau aparține altei organizații. |
contact_not_found | 404 | Contactul nu există sau aparține altei organizații. |
object_not_found | 404 | Obiectul nu există sau aparține altei organizații. |
object_type_not_found | 404 | Organizația nu are un tip de obiect cu această cheie. |
event_type_not_found | 404 | Organizația nu are un tip de eveniment cu această cheie. |
offer_not_found | 404 | Nicio ofertă nu are acest cod. |
evidence_not_found | 404 | Mesajul nu a fost trimis cu un template candidat suport durabil, deci nu are dovadă. |
recommendation_rule_not_found | 404 | Regula de recomandare nu există sau e arhivată. |
method_not_allowed | 405 | Calea există, dar nu cu această metodă. |
identity_conflict | 409 | Identitățile trimise aparțin unor contacte diferite; unește-le întâi. |
idempotency_conflict | 409 | Idempotency-Key a fost folosit pentru altă cerere. |
idempotency_in_progress | 409 | Prima cerere cu acest Idempotency-Key încă rulează; încearcă din nou peste o secundă. |
invalid_idempotency_key | 400 | Idempotency-Key e gol, are peste 255 de caractere sau nu e ASCII vizibil. |
invalid_json | 400 | Corpul nu e JSON valid. |
payload_too_large | 413 | Corpul cererii e prea mare. |
validation_failed | 422 | Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care. |
schema_violation | 422 | Câmpurile sau proprietățile nu se potrivesc cu modelul de date al organizației. |
rate_limited | 429 | Prea multe cereri; așteaptă secundele din Retry-After. |
otp_too_soon | 429 | La acest telefon s-a trimis un cod acum mai puțin de 30 de secunde. |
otp_rate_limited | 429 | Telefonul a primit 5 coduri în ultimele 15 minute. |
otp_template_missing | 422 | Numărul nu are un template aprobat pentru codurile de verificare; creează-l din pagina numerelor. |
otp_undeliverable | 422 | Telefonul nu primește mesaje WhatsApp; oferă altă cale, de exemplu SMS sau email. |
otp_refused | 422 | Contactul este blocat sau a oprit mesajele organizației. |
otp_not_verifiable | 409 | Codul a fost dat de organizație, deci îl verifică ea. |
internal_error | 500 | O eroare de partea noastră; a fost raportată, iar cererea se poate reîncerca. |
blocked_contact | 422 | Mesajul nu poate fi trimis: Contactul e blocat. |
no_channel_optin | 422 | Mesajul nu poate fi trimis: Contactul nu are opt-in pentru WhatsApp înregistrat. |
no_purpose_consent | 422 | Mesajul nu poate fi trimis: Contactul nu a acceptat acest fel de mesaje. |
muted_object | 422 | Mesajul nu poate fi trimis: Contactul a oprit mesajele despre acest obiect. |
no_whatsapp_identity | 422 | Mesajul nu poate fi trimis: Contactul nu are un telefon sau un ID WhatsApp la care să-i scriem. |
undeliverable | 422 | Mesajul nu poate fi trimis: Numărul nu poate primi mesaje WhatsApp. |
window_closed | 422 | Mesajul nu poate fi trimis: Fereastra de 24 de ore e închisă; se poate trimite doar un template aprobat. |
template_unavailable | 422 | Mesajul nu poate fi trimis: Template-ul nu e aprobat sau e pe pauză ori dezactivat. |
number_unavailable | 422 | Mesajul nu poate fi trimis: Numărul WhatsApp al organizației nu poate trimite acum. |
budget_reached | 422 | Mesajul nu poate fi trimis: Bugetul lunar pentru marketing al organizației s-a consumat. |
organization_stopped | 422 | Mesajul nu poate fi trimis: Echipa Worbo a oprit trimiterea organizației; scrie-ne la hello@worbo.app. |
Limitele de cereri#
600 de cereri pe minut pentru fiecare cheie și 1200 pentru organizație. Antetele RateLimit-Limit, RateLimit-Remaining și RateLimit-Reset arată unde se află cheia; peste limită vine 429, cu Retry-After.
Idempotență#
Un POST cu antetul Idempotency-Key rulează o singură dată: o cerere repetată cu aceeași cheie primește primul răspuns, cu antetul Idempotent-Replayed: true. Aceeași cheie cu alt corp dă idempotency_conflict.
Proba și cheile de test#
Cu dry_run=true, o scriere trece prin toate verificările și întoarce ce ar face, dar nu se salvează nimic; răspunsul are antetul Worbo-Dry-Run: true. Cu o cheie de test, fiecare scriere e o probă. ID-urile din răspunsul unei probe nu există.
Loturile primesc cel mult 100 elemente; fiecare se scrie separat, iar rezultatul are, pentru fiecare, indexul, starea și datele sau eroarea lui.
Versiuni#
Versiunea majoră e în cale (/v1). Schimbările mai mici care nu sunt compatibile vin în versiuni numite după data lor, alese cu antetul Worbo-Version; fără el, o cerere folosește versiunea cheii, cea curentă la crearea cheii. Fiecare răspuns spune în Worbo-Version ce versiune a folosit.
O versiune rămâne stabilă 12 luni, apoi depreciată încă 12, cu antetele Deprecation și Sunset; o schimbare incompatibilă se anunță cu 30 de zile înainte. Versiunea curentă: 2026-10-05. Acceptate: 2026-10-05.
Worbo-Version: 2026-10-05
Webhooks#
Worbo trimite evenimentele la care sunt abonate endpoint-urile ca POST cu corp JSON, semnat în formatul Standard Webhooks. Un endpoint care nu răspunde cu 2xx primește evenimentul din nou, la pauze tot mai mari; după multe eșecuri se oprește, iar proprietarul este anunțat.
webhook-id: msg_2mF0…
webhook-timestamp: 1760511600
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{"type": "contact.created", "timestamp": "2026-10-15T06:20:00Z", "data": {…}}
Pentru verificarea semnăturii: calculează HMAC-SHA256 peste webhook-id, webhook-timestamp și corpul brut, unite prin puncte, cu secretul decodat din base64 după prefixul whsec_; compară-l, în timp constant, cu fiecare semnătură v1 din antet. Refuză un timestamp mai vechi de cinci minute. După o rotire, antetul are două semnături timp de 24 de ore.
Cu payload-ul thin, data are doar referința obiectului, care se citește apoi prin API.
message.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.receivedinteractive.button_clickedlink.clickedflow.submitted
contact.createdcontact.updatedcontact.mergedcontact.consent_grantedcontact.consent_revoked
object.createdobject.updatedobject.status_changedoffer.issuedoffer.redeemedoffer.expired
order.confirmedorder.cancelledorder.note_added
booking.confirmedbooking.cancelledmembership.pause_requested
automation.run_startedautomation.run_completedautomation.goal_reachedautomation.webhook
conversation.openedconversation.assignedconversation.closed
document.opened
template.status_changedtemplate.category_changedtemplate.quality_changed
webhook_endpoint.disabledwebhook.test
MCP (asistenți AI)#
Serverul MCP Worbo îi lasă pe asistenții AI, de exemplu Claude sau ChatGPT, să lucreze într-o organizație cu permisiunile omului care i-a conectat. Asistentul se conectează prin OAuth, iar omul îl aprobă în Worbo; conexiunile sunt la Integrări › Asistenți AI.
Din asistent nu pleacă nimic către mulți oameni: el pregătește și estimează o campanie, iar lansarea o aprobă un membru, în Worbo. Erorile au aceleași coduri ca în API.
https://mcp.worbo.app/mcpget_workspace_status
search_contacts
get_contact
get_contact_timeline
list_schema
list_templates
get_template
list_automations
get_automation
estimate_audience
get_report
recommend_items
list_conversations
get_conversation
draft_template
draft_segment
draft_campaign
draft_automation
request_approval
get_approval
send_template
upsert_contact
upsert_object
record_opt_out
add_internal_note
track_event
Specificație și unelte#
Specificația OpenAPI 3.1 descrie fiecare operație, în JSON sau YAML. Cerută cu cheia ta, specificația OpenAPI are și schema contactelor, a tipurilor de obiect și a tipurilor de eveniment ale tale, pentru generatoare de cod și Postman.
Colecția Postman are fiecare cerere, cu corpul ei de exemplu; pune cheia ta în variabila apiKey a colecției.
- SDK-uri: @worbo/sdk pentru JavaScript și worbo/worbo-php pentru PHP, cu o metodă pentru fiecare operație, reîncercări, idempotență și verificarea semnăturii webhooks.
- Fără cod: Zapier și Make, plus pluginul WordPress pentru magazinele WooCommerce.
Referință
Organizația#
Cheia folosită, numerele WhatsApp, consumul lunii și jurnalul.
Citește cheia folosită și organizația ei#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/me" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/me', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/me', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/me",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"key": {
"name": "CRM",
"environment": "live",
"scopes": [
"string"
],
"expires_at": "2026-10-15T09:00:00+03:00",
"api_version": "2026-10-05"
},
"organization": {
"name": "Sala Centru",
"slug": "sala-centru"
},
"api_version": "2026-10-05"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează numerele WhatsApp, cu calitatea, tranșa și încălzirea#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/numbers" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/numbers', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/numbers', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/numbers",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 3,
"phone": "+40 722 000 000",
"name": "Sala Centru",
"sandbox": false,
"quality_rating": "GREEN",
"messaging_limit_tier": "TIER_1K",
"warmup": false,
"marketing_paused_until": "2026-10-15T09:00:00+03:00",
"disabled": false,
"disabled_reason": "string"
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește consumul unei luni și limitele planului#
Parametri de query
-
month string
Luna, ca AAAA-LL; implicit luna curentă.
Exemplu:2026-10
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/usage" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/usage', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/usage', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/usage",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"month": "2026-10",
"currency": "EUR",
"categories": {
"marketing": {
"messages": 120,
"billable": 118,
"estimated_cost": 6.42
}
},
"estimated_cost": 6.42,
"plan": "growth",
"billing_state": "active",
"limits": {}
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează jurnalul organizației#
Parametri de query
-
action string
Doar rândurile acestei acțiuni.
Exemplu:contact.created -
since string
Doar ce s-a schimbat în acest moment sau după el.
Format:date-timeExemplu:2026-10-01T00:00:00+03:00 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/audit-logs" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/audit-logs', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/audit-logs', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/audit-logs",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 1201,
"action": "contact.created",
"label": "Contact created",
"source": "api",
"actor": {},
"subject": {},
"properties": {},
"created_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Contacte#
Persoanele, găsite după oricare dintre identitățile lor: telefon, email, BSUID sau ID-ul de la o sursă.
Listează și caută contacte#
Parametri de query
-
search string
Text din nume, telefon sau email.
Exemplu:Ana -
phone string
Contactul cu acest telefon.
Exemplu:+40722123456 -
email string
Contactul cu acest email.
Format:emailExemplu:ana@example.com -
external_id string
Contactul cu acest ID la sursa dată în source.
Exemplu:crm-1001 -
source string
Sursa ID-ului extern sau a contactelor.
Exemplu:crm -
tag string
Doar contactele cu acest tag.
Exemplu:vip -
updated_since string
Doar ce s-a schimbat în acest moment sau după el.
Format:date-timeExemplu:2026-10-01T00:00:00+03:00 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/contacts" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/contacts', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/contacts",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează un contact după oricare dintre identitățile lui#
Contactul se găsește după oricare dintre identitățile trimise, iar celelalte i se adaugă. Cu update_existing_only, un contact necunoscut nu se creează.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
identities object Obligatoriu
Cel puțin o identitate; contactul se găsește după oricare dintre ele.
Arată câmpurileAscunde câmpurile
-
phone string
În format E.164, de exemplu +40722123456.
Exemplu:+40722123456 -
email stringFormat:
emailExemplu:ana@example.com -
bsuid string
-
external_id string
ID-ul contactului la sursă: text sau un obiect cu source și value.
Exemplu:crm-1001
-
-
source stringExemplu:
crm -
fields object
-
tags string[]
-
update_existing_only booleanExemplu:
false
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001"
},
"source": "crm",
"fields": {
"first_name": "Ana"
},
"update_existing_only": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'identities' => [
'phone' => '+40722123456',
'email' => 'ana@example.com',
'external_id' => 'crm-1001',
],
'source' => 'crm',
'fields' => [
'first_name' => 'Ana',
],
'update_existing_only' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001",
},
"source": "crm",
"fields": {
"first_name": "Ana",
},
"update_existing_only": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001",
},
"source": "crm",
"fields": {
"first_name": "Ana",
},
"update_existing_only": False,
},
)
data = response.json()
{
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează cel mult 100 de contacte#
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
items object[] Obligatoriu
Arată câmpurileAscunde câmpurile
-
identities object Obligatoriu
Cel puțin o identitate; contactul se găsește după oricare dintre ele.
Arată câmpurileAscunde câmpurile
-
phone string
În format E.164, de exemplu +40722123456.
Exemplu:+40722123456 -
email stringFormat:
emailExemplu:ana@example.com -
bsuid string
-
external_id string
ID-ul contactului la sursă: text sau un obiect cu source și value.
Exemplu:crm-1001
-
-
source stringExemplu:
crm -
fields object
-
tags string[]
-
update_existing_only booleanExemplu:
false
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts/batch" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001"
},
"source": "crm",
"fields": {
"first_name": "Ana"
},
"update_existing_only": false
}
]
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts/batch', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'items' => [
[
'identities' => [
'phone' => '+40722123456',
'email' => 'ana@example.com',
'external_id' => 'crm-1001',
],
'source' => 'crm',
'fields' => [
'first_name' => 'Ana',
],
'update_existing_only' => false,
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001",
},
"source": "crm",
"fields": {
"first_name": "Ana",
},
"update_existing_only": false,
},
],
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts/batch",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"items": [
{
"identities": {
"phone": "+40722123456",
"email": "ana@example.com",
"external_id": "crm-1001",
},
"source": "crm",
"fields": {
"first_name": "Ana",
},
"update_existing_only": False,
},
],
},
)
data = response.json()
{
"data": [
{
"index": 0,
"status": "created",
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
},
"error": {
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "The request is not valid",
"status": 422,
"detail": "The name field is required.",
"code": "validation_failed",
"errors": {
"name": [
"The name field is required."
]
}
}
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un contact#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/contacts/123" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/contacts/123', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/contacts/123",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Schimbă câmpurile și tag-urile unui contact#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
fields object
-
tags string[]
Răspunsuri
curl -X PATCH "https://api.worbo.app/v1/contacts/123" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"last_name": "Ionescu"
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://api.worbo.app/v1/contacts/123', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
'json' => [
'fields' => [
'last_name' => 'Ionescu',
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"fields": {
"last_name": "Ionescu",
},
}),
});
const data = await response.json();
import os
import requests
response = requests.patch(
"https://api.worbo.app/v1/contacts/123",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
json={
"fields": {
"last_name": "Ionescu",
},
},
)
data = response.json()
{
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Șterge un contact, la cererea persoanei (GDPR)#
Datele contactului se șterg definitiv; jurnalul păstrează doar faptul că s-a făcut ștergerea.
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/contacts/123" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/contacts/123', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
const response = await fetch('https://api.worbo.app/v1/contacts/123', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/contacts/123",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
Fără conținut
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Oprește sau pornește botul pe cuvinte cheie pentru un contact#
De exemplu când un CRM preia conversația.
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
enabled boolean ObligatoriuExemplu:
false
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts/123/bot" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts/123/bot', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'enabled' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/bot', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"enabled": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts/123/bot",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"enabled": False,
},
)
data = response.json()
{
"data": {
"contact_id": 123,
"bot_enabled": false
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează identitățile unui contact#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/contacts/123/identities" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/contacts/123/identities', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/identities', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/contacts/123/identities",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Adaugă o identitate unui contact#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
type string ObligatoriuValori posibile:
phoneemailbsuidusernameexternal_id -
value string ObligatoriuExemplu:
ana@example.com -
source string
-
primary booleanExemplu:
false
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts/123/identities" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"type": "email",
"value": "ana@example.com",
"primary": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts/123/identities', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'type' => 'email',
'value' => 'ana@example.com',
'primary' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/identities', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "email",
"value": "ana@example.com",
"primary": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts/123/identities",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"type": "email",
"value": "ana@example.com",
"primary": False,
},
)
data = response.json()
{
"data": {
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Desprinde o identitate de un contact#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123 -
identity integer Obligatoriu
ID-ul identității.
Exemplu:501
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/contacts/123/identities/501" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/contacts/123/identities/501', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
const response = await fetch('https://api.worbo.app/v1/contacts/123/identities/501', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/contacts/123/identities/501",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
Fără conținut
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Unește alt contact cu acesta#
Identitățile, istoricul și obiectele celuilalt contact se mută aici; urmează evenimentul contact.merged.
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
contact_id integer Obligatoriu
Contactul unit cu acesta; identitățile și istoricul lui se mută aici.
Exemplu:124
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts/123/merge" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"contact_id": 124
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts/123/merge', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'contact_id' => 124,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/merge', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_id": 124,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts/123/merge",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contact_id": 124,
},
)
data = response.json()
{
"data": {
"id": 123,
"identities": [
{
"id": 501,
"type": "phone",
"value": "+40722123456",
"source": "string",
"primary": true
}
],
"fields": {
"first_name": "Ana",
"last_name": "Popescu",
"language": "ro"
},
"tags": [
"vip"
],
"source": "api",
"blocked": false,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Consimțământ#
Istoricul consimțământului, la care doar se adaugă, pe scopuri și topicuri, cu dovada fiecărui acord.
Citește consimțământul unui contact, cu istoricul lui#
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/contacts/123/consents" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/contacts/123/consents', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/consents', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/contacts/123/consents",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"status": {
"purposes": {
"channel": "granted",
"transactional": null,
"marketing": "granted",
"recommendations": null
},
"topics": {},
"meta_blocked": false,
"blocked": false,
"allowed": {
"transactional": true,
"marketing": true,
"recommendations": false
}
},
"history": [
{
"id": 900,
"purpose": "marketing",
"topic": "string",
"state": "granted",
"basis": "consent",
"source": "form",
"proof": {},
"occurred_at": "2026-10-15T09:00:00+03:00"
}
]
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Înregistrează un acord, cu dovada lui, sau o retragere#
Un acord retras de persoană îl poate reda doar ea: printr-un formular, la checkout sau printr-un link.
Parametri din cale
-
contact integer Obligatoriu
ID-ul contactului.
Exemplu:123
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
purposes string[] ObligatoriuMinim:
1 -
state string ObligatoriuValori posibile:
grantedrevoked -
source stringValori posibile:
formcheckoutclick_to_chatapi -
topic string null
-
basis stringValori posibile:
consentsoft_opt_in -
proof object
Ce dovedește acordul: textul formularului, pagina, IP-ul.
-
occurred_at string nullFormat:
date-time
Răspunsuri
curl -X POST "https://api.worbo.app/v1/contacts/123/consents" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"purposes": [
"channel",
"marketing"
],
"state": "granted",
"source": "form",
"proof": {
"form": "Newsletter, footer",
"text": "I agree to receive offers on WhatsApp"
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/contacts/123/consents', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'purposes' => [
'channel',
'marketing',
],
'state' => 'granted',
'source' => 'form',
'proof' => [
'form' => 'Newsletter, footer',
'text' => 'I agree to receive offers on WhatsApp',
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/123/consents', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"purposes": [
"channel",
"marketing",
],
"state": "granted",
"source": "form",
"proof": {
"form": "Newsletter, footer",
"text": "I agree to receive offers on WhatsApp",
},
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/contacts/123/consents",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"purposes": [
"channel",
"marketing",
],
"state": "granted",
"source": "form",
"proof": {
"form": "Newsletter, footer",
"text": "I agree to receive offers on WhatsApp",
},
},
)
data = response.json()
{
"data": {
"recorded": [
{
"id": 900,
"purpose": "marketing",
"topic": "string",
"state": "granted",
"basis": "consent",
"source": "form",
"proof": {},
"occurred_at": "2026-10-15T09:00:00+03:00"
}
],
"status": {
"purposes": {
"channel": "granted",
"transactional": null,
"marketing": "granted",
"recommendations": null
},
"topics": {},
"meta_blocked": false,
"blocked": false,
"allowed": {
"transactional": true,
"marketing": true,
"recommendations": false
}
},
"history": [
{
"id": 900,
"purpose": "marketing",
"topic": "string",
"state": "granted",
"basis": "consent",
"source": "form",
"proof": {},
"occurred_at": "2026-10-15T09:00:00+03:00"
}
]
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează un link semnat către centrul de preferințe al unui contact#
Linkul e valabil 30 de zile.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
contact_id integer ObligatoriuExemplu:
123
Răspunsuri
curl -X POST "https://api.worbo.app/v1/preference-links" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"contact_id": 123
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/preference-links', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'contact_id' => 123,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/preference-links', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_id": 123,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/preference-links",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contact_id": 123,
},
)
data = response.json()
{
"data": {
"contact_id": 123,
"url": "https://my.worbo.app/preferences/abc",
"expires_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Model de date#
Câmpurile contactelor, tipurile de obiect și tipurile de eveniment ale organizației, cu JSON Schema lor.
Citește JSON Schema corpului care scrie un contact#
Cu câmpurile proprii ale organizației; o citește orice cheie.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/contacts/schema" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/contacts/schema', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/contacts/schema', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/contacts/schema",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează câmpurile contactelor#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/field-definitions" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/field-definitions', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/field-definitions', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/field-definitions",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează un câmp al contactelor sau al unui tip de obiect#
Prin aceleași verificări și limite ca în dashboard; cheia nu se mai schimbă după aceea.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
object_type string
Cheia tipului de obiect; fără ea, câmpul este al contactelor.
Exemplu:vehicle -
labels object Obligatoriu
-
key stringExemplu:
plate -
type string ObligatoriuValori posibile:
textnumbermoneydatedatetimebooleansingle_selectmulti_selectphoneemailurlreferencefilelocationinterval -
sensitivity stringValori posibile:
normalpersonalspecial -
is_required boolean
-
is_unique boolean
-
segmentable boolean
-
templatable boolean
-
key_date boolean
-
audited boolean
-
settings object
-
default_value string
Valoarea implicită, de tipul câmpului.
Răspunsuri
curl -X POST "https://api.worbo.app/v1/field-definitions" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"object_type": "vehicle",
"labels": {
"en": "Plate",
"ro": "Număr de înmatriculare"
},
"key": "plate",
"type": "text"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/field-definitions', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'object_type' => 'vehicle',
'labels' => [
'en' => 'Plate',
'ro' => 'Număr de înmatriculare',
],
'key' => 'plate',
'type' => 'text',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/field-definitions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"object_type": "vehicle",
"labels": {
"en": "Plate",
"ro": "Număr de înmatriculare",
},
"key": "plate",
"type": "text",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/field-definitions",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"object_type": "vehicle",
"labels": {
"en": "Plate",
"ro": "Număr de înmatriculare",
},
"key": "plate",
"type": "text",
},
)
data = response.json()
{
"data": {
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează tipurile de obiect#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/object-types" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/object-types', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/object-types', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/object-types",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"key": "fit.membership",
"label": "Membership",
"labels": {},
"plural_labels": {},
"source": "fitness",
"status_axes": [
{
"key": "lifecycle",
"labels": {},
"statuses": [
{
"key": "active",
"labels": {},
"category": "active"
}
]
}
],
"roles": [
{
"key": "holder",
"labels": {},
"multiple": false,
"primary": true
}
],
"fields": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează un tip de obiect#
Tipul este al organizației și intră în limita ei de tipuri.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
labels object Obligatoriu
-
plural_labels object
-
key stringExemplu:
vehicle -
status_axes object[]
-
roles object[]
-
title_field string
-
retention_days integer
Răspunsuri
curl -X POST "https://api.worbo.app/v1/object-types" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"labels": {
"en": "Vehicle",
"ro": "Vehicul"
},
"key": "vehicle"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/object-types', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'labels' => [
'en' => 'Vehicle',
'ro' => 'Vehicul',
],
'key' => 'vehicle',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/object-types', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"labels": {
"en": "Vehicle",
"ro": "Vehicul",
},
"key": "vehicle",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/object-types",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"labels": {
"en": "Vehicle",
"ro": "Vehicul",
},
"key": "vehicle",
},
)
data = response.json()
{
"data": {
"key": "fit.membership",
"label": "Membership",
"labels": {},
"plural_labels": {},
"source": "fitness",
"status_axes": [
{
"key": "lifecycle",
"labels": {},
"statuses": [
{
"key": "active",
"labels": {},
"category": "active"
}
]
}
],
"roles": [
{
"key": "holder",
"labels": {},
"multiple": false,
"primary": true
}
],
"fields": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un tip de obiect, cu statusurile, rolurile și câmpurile lui#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/object-types/fit.membership" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/object-types/fit.membership', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/object-types/fit.membership', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/object-types/fit.membership",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"key": "fit.membership",
"label": "Membership",
"labels": {},
"plural_labels": {},
"source": "fitness",
"status_axes": [
{
"key": "lifecycle",
"labels": {},
"statuses": [
{
"key": "active",
"labels": {},
"category": "active"
}
]
}
],
"roles": [
{
"key": "holder",
"labels": {},
"multiple": false,
"primary": true
}
],
"fields": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește JSON Schema corpului care scrie un obiect al tipului#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/object-types/fit.membership/schema" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/object-types/fit.membership/schema', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/object-types/fit.membership/schema', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/object-types/fit.membership/schema",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează tipurile de eveniment#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/event-types" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/event-types', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/event-types', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/event-types",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"key": "visit.recorded",
"label": "Visit recorded",
"labels": {},
"source": "fitness",
"violation_policy": "reject",
"properties": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un tip de eveniment, cu proprietățile lui#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/event-types/fit.membership" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/event-types/fit.membership', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/event-types/fit.membership', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/event-types/fit.membership",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"key": "visit.recorded",
"label": "Visit recorded",
"labels": {},
"source": "fitness",
"violation_policy": "reject",
"properties": [
{
"key": "shoe_size",
"label": "Shoe size",
"labels": {},
"type": "number",
"required": false,
"unique": false,
"sensitivity": "normal",
"key_date": false,
"calculated": false,
"multiple": false,
"choices": [
{
"key": "string",
"labels": {}
}
],
"default": {},
"archived": false
}
]
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește JSON Schema proprietăților unui tip de eveniment#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/event-types/fit.membership/schema" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/event-types/fit.membership/schema', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/event-types/fit.membership/schema', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/event-types/fit.membership/schema",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Obiecte#
Abonamente, rezervări, comenzi: înregistrările fiecărui tip de obiect, legate de contacte în roluri.
Listează obiectele unui tip#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Parametri de query
-
external_id string
Obiectul cu acest ID la sursă.
Exemplu:abn-7781 -
source string
Doar obiectele acestei surse.
Exemplu:upfit -
contact_id integer
Doar obiectele legate de acest contact.
Exemplu:123 -
status object
Statusul pe fiecare axă, de exemplu status[lifecycle]=active.
-
updated_since string
Doar ce s-a schimbat în acest moment sau după el.
Format:date-timeExemplu:2026-10-01T00:00:00+03:00 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/objects/fit.membership" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/objects/fit.membership', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/objects/fit.membership",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează un obiect după ID-ul lui la sursă#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
external_id string ObligatoriuExemplu:
abn-7781 -
source stringExemplu:
upfit -
fields object
-
statuses object
-
raw_status string
-
raw_status_label string
-
contact object
Contactul legat în rol: {"id": 123} sau {"identities": {...}, "fields": {...}}.
-
role stringExemplu:
holder -
update_existing_only booleanExemplu:
false
Răspunsuri
curl -X POST "https://api.worbo.app/v1/objects/fit.membership" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active"
},
"contact": {
"identities": {
"phone": "+40722123456"
}
},
"role": "holder",
"update_existing_only": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/objects/fit.membership', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'external_id' => 'abn-7781',
'source' => 'upfit',
'fields' => [
'starts_on' => '2026-09-01',
'ends_on' => '2027-08-31',
],
'statuses' => [
'lifecycle' => 'active',
],
'contact' => [
'identities' => [
'phone' => '+40722123456',
],
],
'role' => 'holder',
'update_existing_only' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31",
},
"statuses": {
"lifecycle": "active",
},
"contact": {
"identities": {
"phone": "+40722123456",
},
},
"role": "holder",
"update_existing_only": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/objects/fit.membership",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31",
},
"statuses": {
"lifecycle": "active",
},
"contact": {
"identities": {
"phone": "+40722123456",
},
},
"role": "holder",
"update_existing_only": False,
},
)
data = response.json()
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează cel mult 100 de obiecte#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
items object[] Obligatoriu
Arată câmpurileAscunde câmpurile
-
external_id string ObligatoriuExemplu:
abn-7781 -
source stringExemplu:
upfit -
fields object
-
statuses object
-
raw_status string
-
raw_status_label string
-
contact object
Contactul legat în rol: {"id": 123} sau {"identities": {...}, "fields": {...}}.
-
role stringExemplu:
holder -
update_existing_only booleanExemplu:
false
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/objects/fit.membership/batch" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active"
},
"contact": {
"identities": {
"phone": "+40722123456"
}
},
"role": "holder",
"update_existing_only": false
}
]
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/objects/fit.membership/batch', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'items' => [
[
'external_id' => 'abn-7781',
'source' => 'upfit',
'fields' => [
'starts_on' => '2026-09-01',
'ends_on' => '2027-08-31',
],
'statuses' => [
'lifecycle' => 'active',
],
'contact' => [
'identities' => [
'phone' => '+40722123456',
],
],
'role' => 'holder',
'update_existing_only' => false,
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31",
},
"statuses": {
"lifecycle": "active",
},
"contact": {
"identities": {
"phone": "+40722123456",
},
},
"role": "holder",
"update_existing_only": false,
},
],
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/objects/fit.membership/batch",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"items": [
{
"external_id": "abn-7781",
"source": "upfit",
"fields": {
"starts_on": "2026-09-01",
"ends_on": "2027-08-31",
},
"statuses": {
"lifecycle": "active",
},
"contact": {
"identities": {
"phone": "+40722123456",
},
},
"role": "holder",
"update_existing_only": False,
},
],
},
)
data = response.json()
{
"data": [
{
"index": 0,
"status": "created",
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
},
"error": {
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "The request is not valid",
"status": 422,
"detail": "The name field is required.",
"code": "validation_failed",
"errors": {
"name": [
"The name field is required."
]
}
}
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un obiect#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership -
object integer Obligatoriu
ID-ul obiectului.
Exemplu:456
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/objects/fit.membership/456" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/objects/fit.membership/456', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership/456', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/objects/fit.membership/456",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Schimbă câmpurile sau statusurile unui obiect#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership -
object integer Obligatoriu
ID-ul obiectului.
Exemplu:456
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
source string
-
fields object
-
statuses object
-
raw_status string
-
raw_status_label string
-
contact object
-
role string
Răspunsuri
curl -X PATCH "https://api.worbo.app/v1/objects/fit.membership/456" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"statuses": {
"lifecycle": "frozen"
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://api.worbo.app/v1/objects/fit.membership/456', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
'json' => [
'statuses' => [
'lifecycle' => 'frozen',
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership/456', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"statuses": {
"lifecycle": "frozen",
},
}),
});
const data = await response.json();
import os
import requests
response = requests.patch(
"https://api.worbo.app/v1/objects/fit.membership/456",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
json={
"statuses": {
"lifecycle": "frozen",
},
},
)
data = response.json()
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Leagă un contact de un obiect, într-un rol#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership -
object integer Obligatoriu
ID-ul obiectului.
Exemplu:456
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
contact_id integerExemplu:
123 -
contact object
Un contact găsit sau creat după identitățile lui, în loc de contact_id.
-
role string ObligatoriuExemplu:
beneficiary -
primary booleanExemplu:
false -
muted booleanExemplu:
false -
valid_from string nullFormat:
date -
valid_until string nullFormat:
date
Răspunsuri
curl -X POST "https://api.worbo.app/v1/objects/fit.membership/456/relations" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"contact_id": 123,
"role": "beneficiary",
"primary": false,
"muted": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/objects/fit.membership/456/relations', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'contact_id' => 123,
'role' => 'beneficiary',
'primary' => false,
'muted' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership/456/relations', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_id": 123,
"role": "beneficiary",
"primary": false,
"muted": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/objects/fit.membership/456/relations",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contact_id": 123,
"role": "beneficiary",
"primary": False,
"muted": False,
},
)
data = response.json()
{
"data": {
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Șterge legătura unui contact cu un obiect#
Parametri din cale
-
type string Obligatoriu
Cheia tipului, de exemplu fit.membership.
Exemplu:fit.membership -
object integer Obligatoriu
ID-ul obiectului.
Exemplu:456 -
relation integer Obligatoriu
ID-ul legăturii.
Exemplu:77
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/objects/fit.membership/456/relations/77" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/objects/fit.membership/456/relations/77', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
const response = await fetch('https://api.worbo.app/v1/objects/fit.membership/456/relations/77', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/objects/fit.membership/456/relations/77",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
Fără conținut
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Fișiere#
Fișierele câmpurilor de tip fișier: se urcă întâi, apoi se dau prin ID ca valoare a câmpului.
Urcă un fișier pentru un câmp de tip fișier#
PDF, imagini, documente Office, text sau CSV, până la 16 MB. Un fișier nefolosit de niciun câmp într-o zi se șterge.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriimultipart/form-data
-
file string Obligatoriu
Fișierul: PDF, imagine, Office, text sau CSV, până la 16 MB.
Răspunsuri
curl -X POST "https://api.worbo.app/v1/files" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "file=@document.pdf"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/files', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'multipart' => [
['name' => 'file', 'contents' => fopen('document.pdf', 'r')],
],
]);
$data = json_decode((string) $response->getBody(), true);
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('file', await openAsBlob('document.pdf'), 'document.pdf');
const response = await fetch('https://api.worbo.app/v1/files', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
body: form,
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/files",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
files={"file": open("document.pdf", "rb")},
)
data = response.json()
{
"data": {
"id": 77,
"name": "contract.pdf",
"mime": "application/pdf",
"size": 48213,
"sha256": "string",
"contact_id": 123,
"object_id": 456,
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un fișier, cu contactul sau obiectul care îl folosește#
Parametri din cale
-
file integer Obligatoriu
ID-ul fișierului.
Exemplu:77
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/files/77" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/files/77', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/files/77', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/files/77",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 77,
"name": "contract.pdf",
"mime": "application/pdf",
"size": 48213,
"sha256": "string",
"contact_id": 123,
"object_id": 456,
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Descarcă conținutul unui fișier#
Parametri din cale
-
file integer Obligatoriu
ID-ul fișierului.
Exemplu:77
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/files/77/content" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/files/77/content', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
file_put_contents('download', (string) $response->getBody());
const response = await fetch('https://api.worbo.app/v1/files/77/content', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const file = await response.blob();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/files/77/content",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
content = response.content
Un fișier, așa cum a fost încărcat.
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Evenimente#
Ce s-a întâmplat la sursă; evenimentele pornesc automatizări și actualizează obiecte.
Înregistrează un eveniment#
Contactul și obiectul evenimentului se găsesc sau se creează; un eveniment cu același ID de la aceeași sursă se înregistrează o singură dată.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
id string
ID-ul evenimentului la sursă; același ID se înregistrează o singură dată.
Exemplu:m-1 -
type string ObligatoriuExemplu:
membership.created -
occurred_at stringFormat:
date-timeExemplu:2026-10-15T09:00:00+03:00 -
source stringExemplu:
upfit -
contact object
-
object object
Arată câmpurileAscunde câmpurile
-
type string
-
external_id string
-
role string
-
upsert object
-
-
properties object
-
historical booleanExemplu:
false -
update_existing_only booleanExemplu:
false
Răspunsuri
curl -X POST "https://api.worbo.app/v1/events" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456"
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active"
}
}
},
"properties": {
"plan": "plan-12"
},
"historical": false,
"update_existing_only": false
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/events', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'id' => 'm-1',
'type' => 'membership.created',
'occurred_at' => '2026-10-15T09:00:00+03:00',
'source' => 'upfit',
'contact' => [
'phone' => '+40722123456',
],
'object' => [
'type' => 'fit.membership',
'external_id' => 'abn-7781',
'upsert' => [
'statuses' => [
'lifecycle' => 'active',
],
],
],
'properties' => [
'plan' => 'plan-12',
],
'historical' => false,
'update_existing_only' => false,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/events', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456",
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active",
},
},
},
"properties": {
"plan": "plan-12",
},
"historical": false,
"update_existing_only": false,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/events",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456",
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active",
},
},
},
"properties": {
"plan": "plan-12",
},
"historical": False,
"update_existing_only": False,
},
)
data = response.json()
{
"data": {
"event_id": 8812,
"type": "membership.created",
"source": "upfit",
"source_id": "m-1",
"occurred_at": "2026-10-15T09:00:00+03:00",
"duplicate": false,
"historical": false,
"contact_id": 123,
"object_id": 456,
"warnings": {},
"identity_conflict": {}
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Înregistrează cel mult 100 de evenimente#
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
items object[] Obligatoriu
Arată câmpurileAscunde câmpurile
-
id string
ID-ul evenimentului la sursă; același ID se înregistrează o singură dată.
Exemplu:m-1 -
type string ObligatoriuExemplu:
membership.created -
occurred_at stringFormat:
date-timeExemplu:2026-10-15T09:00:00+03:00 -
source stringExemplu:
upfit -
contact object
-
object object
Arată câmpurileAscunde câmpurile
-
type string
-
external_id string
-
role string
-
upsert object
-
-
properties object
-
historical booleanExemplu:
false -
update_existing_only booleanExemplu:
false
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/events/batch" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456"
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active"
}
}
},
"properties": {
"plan": "plan-12"
},
"historical": false,
"update_existing_only": false
}
]
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/events/batch', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'items' => [
[
'id' => 'm-1',
'type' => 'membership.created',
'occurred_at' => '2026-10-15T09:00:00+03:00',
'source' => 'upfit',
'contact' => [
'phone' => '+40722123456',
],
'object' => [
'type' => 'fit.membership',
'external_id' => 'abn-7781',
'upsert' => [
'statuses' => [
'lifecycle' => 'active',
],
],
],
'properties' => [
'plan' => 'plan-12',
],
'historical' => false,
'update_existing_only' => false,
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/events/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456",
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active",
},
},
},
"properties": {
"plan": "plan-12",
},
"historical": false,
"update_existing_only": false,
},
],
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/events/batch",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"items": [
{
"id": "m-1",
"type": "membership.created",
"occurred_at": "2026-10-15T09:00:00+03:00",
"source": "upfit",
"contact": {
"phone": "+40722123456",
},
"object": {
"type": "fit.membership",
"external_id": "abn-7781",
"upsert": {
"statuses": {
"lifecycle": "active",
},
},
},
"properties": {
"plan": "plan-12",
},
"historical": False,
"update_existing_only": False,
},
],
},
)
data = response.json()
{
"data": [
{
"index": 0,
"status": "created",
"data": {
"event_id": 8812,
"type": "membership.created",
"source": "upfit",
"source_id": "m-1",
"occurred_at": "2026-10-15T09:00:00+03:00",
"duplicate": false,
"historical": false,
"contact_id": 123,
"object_id": 456,
"warnings": {},
"identity_conflict": {}
},
"error": {
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "The request is not valid",
"status": 422,
"detail": "The name field is required.",
"code": "validation_failed",
"errors": {
"name": [
"The name field is required."
]
}
}
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Mesaje#
Mesajele WhatsApp trimise și primite, prin aceleași reguli ca în dashboard.
Listează mesajele#
Parametri de query
-
contact_id integer
Doar mesajele acestui contact.
Exemplu:123 -
direction string
Primite sau trimise.
Valori posibile:inboundoutbound -
status string
Doar mesajele cu acest status.
Exemplu:delivered -
since string
Doar ce s-a schimbat în acest moment sau după el.
Format:date-timeExemplu:2026-10-01T00:00:00+03:00 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/messages" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/messages', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/messages', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/messages",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 7001,
"contact_id": 123,
"number_id": 3,
"direction": "outbound",
"type": "template",
"text": "string",
"untrusted_text": "string",
"template": {
"name": "booking_confirmed",
"language": "ro"
},
"category": "utility",
"status": "pending",
"reason": "string",
"error_code": "string",
"wamid": "string",
"created_at": "2026-10-15T09:00:00+03:00",
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Trimite unui contact un template, un text liber sau un formular#
Mesajul trece prin aceleași reguli ca în dashboard: consimțământ, ore de liniște, frecvență și limite. Un text liber sau un formular cere fereastra de 24 de ore deschisă; un refuz vine cu codul motivului, de exemplu window_closed. Răspunsurile la un formular vin prin webhook-ul flow.submitted.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
contact_id integer ObligatoriuExemplu:
123 -
number_id integer null
-
template object
Arată câmpurileAscunde câmpurile
-
name string ObligatoriuExemplu:
booking_confirmed -
language stringExemplu:
ro -
variables string[]
Valorile variabilelor; o valoare lipsă se completează din câmpul variabilei. La un template din bibliotecă nemodificat, prenumele lipsă ia textul de rezervă al bibliotecii, de exemplu „Bună, suntem echipa sălii.”.
-
-
text string
Un text liber, doar cât timp fereastra de 24 de ore e deschisă; în locul lui template.
-
flow object
Arată câmpurileAscunde câmpurile
-
key string Obligatoriu
Cheia unui formular WhatsApp publicat în contul numărului.
Exemplu:nps -
body string Obligatoriu
Textul mesajului, deasupra butonului care deschide formularul.
Exemplu:Ne spui în 10 secunde cum a fost?
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/messages" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"contact_id": 123,
"template": {
"name": "booking_confirmed",
"language": "ro",
"variables": [
"Ana",
"3 octombrie, 18:00"
]
},
"flow": {
"key": "nps",
"body": "Ne spui în 10 secunde cum a fost?"
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/messages', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'contact_id' => 123,
'template' => [
'name' => 'booking_confirmed',
'language' => 'ro',
'variables' => [
'Ana',
'3 octombrie, 18:00',
],
],
'flow' => [
'key' => 'nps',
'body' => 'Ne spui în 10 secunde cum a fost?',
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_id": 123,
"template": {
"name": "booking_confirmed",
"language": "ro",
"variables": [
"Ana",
"3 octombrie, 18:00",
],
},
"flow": {
"key": "nps",
"body": "Ne spui în 10 secunde cum a fost?",
},
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/messages",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contact_id": 123,
"template": {
"name": "booking_confirmed",
"language": "ro",
"variables": [
"Ana",
"3 octombrie, 18:00",
],
},
"flow": {
"key": "nps",
"body": "Ne spui în 10 secunde cum a fost?",
},
},
)
data = response.json()
{
"data": {
"id": 7001,
"contact_id": 123,
"number_id": 3,
"direction": "outbound",
"type": "template",
"text": "string",
"untrusted_text": "string",
"template": {
"name": "booking_confirmed",
"language": "ro"
},
"category": "utility",
"status": "pending",
"reason": "string",
"error_code": "string",
"wamid": "string",
"created_at": "2026-10-15T09:00:00+03:00",
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un mesaj și statusul lui#
Parametri din cale
-
message integer Obligatoriu
ID-ul mesajului.
Exemplu:7001
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/messages/7001" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/messages/7001', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/messages/7001', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/messages/7001",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 7001,
"contact_id": 123,
"number_id": 3,
"direction": "outbound",
"type": "template",
"text": "string",
"untrusted_text": "string",
"template": {
"name": "booking_confirmed",
"language": "ro"
},
"category": "utility",
"status": "pending",
"reason": "string",
"error_code": "string",
"wamid": "string",
"created_at": "2026-10-15T09:00:00+03:00",
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește dovada unui mesaj trimis cu un template candidat suport durabil#
Textul exact primit de contact și documentul din antet păstrat de Worbo, cu amprentele lor SHA-256, și momentele raportate de Meta. Nu înlocuiește e-mailul cerut de lege.
Parametri din cale
-
message integer Obligatoriu
ID-ul mesajului.
Exemplu:7001
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/messages/7001/evidence" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/messages/7001/evidence', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/messages/7001/evidence', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/messages/7001/evidence",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 52,
"message_id": 7001,
"contact_id": 123,
"number_id": 3,
"template": {
"name": "withdrawal_received",
"language": "ro"
},
"recipient": "+40722123456",
"wamid": "string",
"text": "string",
"text_sha256": "string",
"document": {
"name": "confirmare.pdf",
"mime": "application/pdf",
"size": 48213,
"sha256": "string",
"stored": true,
"error": "string",
"url": "string"
},
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Descarcă documentul păstrat ca dovadă a unui mesaj#
Parametri din cale
-
message integer Obligatoriu
ID-ul mesajului.
Exemplu:7001
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/messages/7001/evidence/document" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/messages/7001/evidence/document', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
file_put_contents('download', (string) $response->getBody());
const response = await fetch('https://api.worbo.app/v1/messages/7001/evidence/document', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const file = await response.blob();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/messages/7001/evidence/document",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
content = response.content
Un fișier, așa cum a fost încărcat.
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Seiful de documente#
Fișiere date unui contact printr-un link care expiră, anunțat pe WhatsApp și deschis doar cu un cod trimis la telefonul contactului.
Citește un document din seif, cu starea linkului și deschiderile#
Parametri din cale
-
vault integer Obligatoriu
ID-ul documentului din seif.
Exemplu:15
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/vault/15" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/vault/15', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/vault/15', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/vault/15",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 15,
"contact_id": 123,
"file_id": 77,
"number_id": 3,
"title": "Rezultatul analizelor",
"state": "active",
"expires_at": "2026-10-15T09:00:00+03:00",
"opened_at": "2026-10-15T09:00:00+03:00",
"opens": 1,
"message_id": 7001,
"created_at": "2026-10-15T09:00:00+03:00",
"url": "https://example.com"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Retrage linkul unui document din seif#
Parametri din cale
-
vault integer Obligatoriu
ID-ul documentului din seif.
Exemplu:15
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/vault/15" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/vault/15', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
const response = await fetch('https://api.worbo.app/v1/vault/15', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/vault/15",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
Fără conținut
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Coduri de verificare#
Coduri de unică folosință trimise pe WhatsApp cu template-ul de autentificare al numărului, verificate de Worbo sau de organizație.
Trimite un cod de verificare pe WhatsApp#
Fără code, Worbo generează un cod din 6 cifre, valabil 10 minute, și îl verifică prin verifyOtp; cu code, organizația îl verifică singură. Mesajul pleacă imediat, cu template-ul de autentificare al numărului, aprobat din pagina lui. Un telefon despre care se știe că nu are WhatsApp primește imediat otp_undeliverable, ca site-ul să ofere SMS sau email; altfel, eșecul vine ca status al mesajului și prin webhook-ul message.failed. Un telefon primește cel mult 5 coduri în 15 minute și unul la 30 de secunde (otp_rate_limited, otp_too_soon). Codul nu apare niciodată în răspunsuri, webhooks sau inbox.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
phone string Obligatoriu
Telefonul care primește codul, în format internațional.
Exemplu:+40722123456 -
code string
Codul generat de organizație, care îl verifică singură; fără el, Worbo generează codul și îl verifică.
Exemplu:482913 -
number_id integer null
-
language string
Limba mesajului; implicit, limba contactului.
Exemplu:ro -
purpose string
La ce folosește codul, păstrat cu el, de exemplu login sau document.
Lungime maximă:64Exemplu:login
Răspunsuri
curl -X POST "https://api.worbo.app/v1/otp" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"phone": "+40722123456",
"code": "482913",
"language": "ro",
"purpose": "login"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/otp', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'phone' => '+40722123456',
'code' => '482913',
'language' => 'ro',
'purpose' => 'login',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/otp', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"phone": "+40722123456",
"code": "482913",
"language": "ro",
"purpose": "login",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/otp",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"phone": "+40722123456",
"code": "482913",
"language": "ro",
"purpose": "login",
},
)
data = response.json()
{
"data": {
"id": 880,
"phone": "+40722123456",
"purpose": "login",
"verifiable": true,
"expires_at": "2026-10-15T09:00:00+03:00",
"message_id": 7001,
"status": "pending"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Verifică un cod de verificare generat de Worbo#
Un cod se folosește o singură dată, în termenul lui, cu cel mult 5 încercări; răspunsul spune de ce o verificare nu a reușit. Un cod dat de organizație primește 409 otp_not_verifiable.
Parametri din cale
-
otp integer Obligatoriu
ID-ul codului de verificare, din răspunsul care l-a trimis.
Exemplu:880
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
code string ObligatoriuExemplu:
482913
Răspunsuri
curl -X POST "https://api.worbo.app/v1/otp/880/verify" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"code": "482913"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/otp/880/verify', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'code' => '482913',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/otp/880/verify', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"code": "482913",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/otp/880/verify",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"code": "482913",
},
)
data = response.json()
{
"data": {
"id": 880,
"verified": true,
"reason": "wrong_code",
"attempts_left": 4
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Recomandări#
Regulile motorului de recomandări și ce ar recomanda acum una dintre ele unui contact, cu motivul fiecărui articol.
Listează regulile de recomandare#
Regulile active, făcute în dashboard la Recomandări: catalogul, tipurile în ordinea lor, numărul de articole și cooldown-urile. Automatizările le folosesc după cheie.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/recommendation-rules" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/recommendation-rules', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/recommendation-rules', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/recommendation-rules",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"key": "ecom.cross_sell",
"name": "Bought together",
"catalog": "ecom.products",
"types": [
{
"type": "co_purchase",
"params": {}
}
],
"max_items": 3,
"contact_cooldown_days": 14,
"item_cooldown_days": 30,
"fill_bestsellers": true
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește rezultatele unei reguli de recomandare#
Pe o perioadă, implicit ultimele 30 de zile: recomandările trimise și destinatarii lor, pașii săriți pe motive, clicurile pe articole, conversiile în 7 zile de la mesaj (o comandă pentru produse, o rezervare pentru clase, un abonament pentru planuri), venitul per destinatar, grupul de control al automatizărilor, dezabonările de după mesaj și costul Meta per conversie.
Parametri din cale
-
rule string Obligatoriu
Cheia regulii de recomandare.
Exemplu:ecom.cross_sell
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/recommendation-rules/ecom.cross_sell/results" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/recommendation-rules/ecom.cross_sell/results', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/recommendation-rules/ecom.cross_sell/results', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/recommendation-rules/ecom.cross_sell/results",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"rule": "ecom.cross_sell",
"from": "2026-10-15T09:00:00+03:00",
"to": "2026-10-15T09:00:00+03:00",
"sent": 120,
"recipients": 118,
"skipped": {},
"clicks": 34,
"clickers": 29,
"items": [
{
"id": 310,
"name": "Filtre de cafea",
"clicks": 12
}
],
"goals": [
"order.created"
],
"conversions": 9,
"conversion_rate": 0.075,
"revenue": 1840.5,
"revenue_per_recipient": 15.6,
"currency": "RON",
"control": {
"contacts": 13,
"conversions": 0,
"rate": 0
},
"lift": 0.075,
"opt_outs": 1,
"cost": 18.4,
"cost_per_conversion": 2.04
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Previzualizează o regulă de recomandare pe un contact#
Ce ar recomanda acum regula contactului, cu motivul fiecărui articol, articolele lăsate deoparte și de ce, cooldown-ul regulii și consimțământul cerut. Nu se trimite nimic, iar cooldown-urile rămân cum sunt. Recomandările din istoricul contactului cer scopul recomandări personalizate pe lângă marketing.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
rule string ObligatoriuExemplu:
ecom.cross_sell -
contact_id integer ObligatoriuExemplu:
123
Răspunsuri
curl -X POST "https://api.worbo.app/v1/recommendations/preview" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"rule": "ecom.cross_sell",
"contact_id": 123
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/recommendations/preview', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'rule' => 'ecom.cross_sell',
'contact_id' => 123,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/recommendations/preview', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rule": "ecom.cross_sell",
"contact_id": 123,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/recommendations/preview",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"rule": "ecom.cross_sell",
"contact_id": 123,
},
)
data = response.json()
{
"data": {
"rule": "ecom.cross_sell",
"contact_id": 123,
"items": [
{
"id": 310,
"name": "Filtre de cafea",
"price": 19.9,
"currency": "RON",
"url": "string",
"image_url": "string",
"type": "co_purchase",
"score": 5,
"reason": "Often bought together with Coffee beans 1kg (5 orders).",
"details": {}
}
],
"excluded": {},
"empty": "cooldown",
"cooldown_until": "2026-10-15T09:00:00+03:00",
"purpose": "marketing",
"sendable": true,
"consent_reason": "string"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Template-uri#
Template-urile WhatsApp: ciornele verificate de linter, trimiterea la Meta și statusul.
Listează template-urile#
Parametri de query
-
number_id integer
Doar template-urile acestui număr.
Exemplu:3 -
status string
Doar template-urile cu acest status.
Exemplu:approved -
name string
Doar template-urile cu acest nume.
Exemplu:booking_confirmed -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/templates" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/templates', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/templates', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/templates",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 31,
"number_id": 3,
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"status": "approved",
"rejected_reason": "string",
"quality": "string",
"components": [
{}
],
"variables": [
{
"example": "Ana",
"field": "contact.first_name"
}
],
"source": "string",
"submitted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează ciorna unui template, verificată de linter#
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
number_id integer null
-
name string ObligatoriuExemplu:
booking_confirmed -
language string ObligatoriuExemplu:
ro -
category string ObligatoriuValori posibile:
utilitymarketing -
body string ObligatoriuExemplu:
Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată. -
examples string[]
-
fields string[]
Pentru fiecare variabilă, câmpul care o completează, de exemplu contact.first_name, sau null.
-
header_format string
-
header_text string
-
header_example string
-
footer string
-
buttons object[]
Răspunsuri
curl -X POST "https://api.worbo.app/v1/templates" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"body": "Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată.",
"examples": [
"Ana",
"3 octombrie, 18:00"
],
"fields": [
"contact.first_name",
null
]
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/templates', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'name' => 'booking_confirmed',
'language' => 'ro',
'category' => 'utility',
'body' => 'Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată.',
'examples' => [
'Ana',
'3 octombrie, 18:00',
],
'fields' => [
'contact.first_name',
null,
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/templates', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"body": "Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată.",
"examples": [
"Ana",
"3 octombrie, 18:00",
],
"fields": [
"contact.first_name",
null,
],
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/templates",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"body": "Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată.",
"examples": [
"Ana",
"3 octombrie, 18:00",
],
"fields": [
"contact.first_name",
None,
],
},
)
data = response.json()
{
"data": {
"id": 31,
"number_id": 3,
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"status": "approved",
"rejected_reason": "string",
"quality": "string",
"components": [
{}
],
"variables": [
{
"example": "Ana",
"field": "contact.first_name"
}
],
"source": "string",
"submitted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00",
"lint": {}
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un template#
Parametri din cale
-
template integer Obligatoriu
ID-ul template-ului.
Exemplu:31
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/templates/31" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/templates/31', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/templates/31', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/templates/31",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 31,
"number_id": 3,
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"status": "approved",
"rejected_reason": "string",
"quality": "string",
"components": [
{}
],
"variables": [
{
"example": "Ana",
"field": "contact.first_name"
}
],
"source": "string",
"submitted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Trimite un template la Meta#
Oprit de linter, cu motivul, sau acceptat, cu statusul „în revizuire”.
Parametri din cale
-
template integer Obligatoriu
ID-ul template-ului.
Exemplu:31
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X POST "https://api.worbo.app/v1/templates/31/submit" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/templates/31/submit', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/templates/31/submit', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/templates/31/submit",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
)
data = response.json()
{
"data": {
"id": 31,
"number_id": 3,
"name": "booking_confirmed",
"language": "ro",
"category": "utility",
"status": "approved",
"rejected_reason": "string",
"quality": "string",
"components": [
{}
],
"variables": [
{
"example": "Ana",
"field": "contact.first_name"
}
],
"source": "string",
"submitted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Oferte#
Ofertele găsite după cod și folosite, la recepție sau în software-ul sursei.
Găsește o ofertă după cod#
Parametri din cale
-
code string Obligatoriu
Codul ofertei.
Exemplu:AUTUMN-7KQ2
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/offers/AUTUMN-7KQ2" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/offers/AUTUMN-7KQ2', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/offers/AUTUMN-7KQ2', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/offers/AUTUMN-7KQ2",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Marchează o ofertă ca folosită#
Parametri din cale
-
code string Obligatoriu
Codul ofertei.
Exemplu:AUTUMN-7KQ2
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
location_id integer null
-
beneficiary_contact_id integer null
-
occurred_at string nullFormat:
date-time
Răspunsuri
curl -X POST "https://api.worbo.app/v1/offers/AUTUMN-7KQ2/redeem" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/offers/AUTUMN-7KQ2/redeem', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => new \stdClass(),
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/offers/AUTUMN-7KQ2/redeem', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/offers/AUTUMN-7KQ2/redeem",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={},
)
data = response.json()
{
"data": {
"id": 456,
"type": "fit.membership",
"source": "string",
"external_id": "abn-7781",
"title": "Full access 12 luni",
"fields": {
"plan": 12,
"starts_on": "2026-09-01",
"ends_on": "2027-08-31"
},
"statuses": {
"lifecycle": "active",
"payment": "ok"
},
"raw_status": "string",
"relations": [
{
"id": 77,
"contact_id": 123,
"role": "holder",
"primary": true,
"muted": false,
"valid_from": "2026-10-15",
"valid_until": "2026-10-15"
}
],
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Segmente#
Segmentele dinamice de contacte, numărate pe loc.
Listează segmentele#
Parametri de query
-
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/segments" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/segments', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/segments', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/segments",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 12,
"name": "Toți membrii",
"description": "string",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty"
}
]
},
"last_count": 240,
"counted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează un segment#
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
name string ObligatoriuExemplu:
Toți membrii -
description string
-
definition object Obligatoriu
Arată câmpurileAscunde câmpurile
-
match string ObligatoriuValori posibile:
allany -
conditions object[] Obligatoriu
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/segments" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Toți membrii",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty"
}
]
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/segments', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'name' => 'Toți membrii',
'definition' => [
'match' => 'all',
'conditions' => [
[
'type' => 'field',
'field' => 'first_name',
'operator' => 'not_empty',
],
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/segments', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Toți membrii",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty",
},
],
},
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/segments",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Toți membrii",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty",
},
],
},
},
)
data = response.json()
{
"data": {
"id": 12,
"name": "Toți membrii",
"description": "string",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty"
}
]
},
"last_count": 240,
"counted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Numără contactele unei definiții, fără să o salveze#
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
definition object Obligatoriu
Arată câmpurileAscunde câmpurile
-
match string ObligatoriuValori posibile:
allany -
conditions object[] Obligatoriu
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/segments/count" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty"
}
]
}
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/segments/count', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'definition' => [
'match' => 'all',
'conditions' => [
[
'type' => 'field',
'field' => 'first_name',
'operator' => 'not_empty',
],
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/segments/count', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty",
},
],
},
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/segments/count",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty",
},
],
},
},
)
data = response.json()
{
"data": {
"count": 240
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește un segment, cu numărul lui curent#
Parametri din cale
-
segment integer Obligatoriu
ID-ul segmentului.
Exemplu:12
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/segments/12" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/segments/12', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/segments/12', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/segments/12",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 12,
"name": "Toți membrii",
"description": "string",
"definition": {
"match": "all",
"conditions": [
{
"type": "field",
"field": "first_name",
"operator": "not_empty"
}
]
},
"last_count": 240,
"counted_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"count": 240
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Automatizări#
Citirea automatizărilor, pornirea uneia pentru un contact și scoaterea unui contact dintr-o rulare.
Listează automatizările#
Parametri de query
-
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/automations" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/automations', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/automations', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/automations",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 8,
"name": "Recâștigare",
"status": "active",
"trigger": "manual",
"number_id": 3,
"recipe": "string",
"version_id": 14,
"holdout_percent": 0,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește o automatizare, cu definiția și cifrele ei#
Parametri din cale
-
automation integer Obligatoriu
ID-ul automatizării.
Exemplu:8
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/automations/8" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/automations/8', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/automations/8', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/automations/8",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 8,
"name": "Recâștigare",
"status": "active",
"trigger": "manual",
"number_id": 3,
"recipe": "string",
"version_id": 14,
"holdout_percent": 0,
"created_at": "2026-10-15T09:00:00+03:00",
"updated_at": "2026-10-15T09:00:00+03:00",
"definition": {},
"report": {}
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Pornește o automatizare pentru un contact#
Doar o automatizare activă, cu pornire manuală. Rularea ia cel mai nou obiect al contactului de tipul ales în declanșator; același Idempotency-Key o pornește o singură dată.
Parametri din cale
-
automation integer Obligatoriu
ID-ul automatizării.
Exemplu:8
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
contact_id integer ObligatoriuExemplu:
123
Răspunsuri
curl -X POST "https://api.worbo.app/v1/automations/8/runs" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"contact_id": 123
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/automations/8/runs', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'contact_id' => 123,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/automations/8/runs', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"contact_id": 123,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/automations/8/runs",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contact_id": 123,
},
)
data = response.json()
{
"data": {
"id": 3301,
"automation_id": 8,
"contact_id": 123,
"object_id": 1,
"status": "active",
"exit_reason": "string",
"held_out": false,
"started_at": "2026-10-15T09:00:00+03:00",
"finished_at": "2026-10-15T09:00:00+03:00",
"converted_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Scoate un contact dintr-o rulare#
Parametri din cale
-
automation integer Obligatoriu
ID-ul automatizării.
Exemplu:8 -
run integer Obligatoriu
ID-ul rulării.
Exemplu:3301
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/automations/8/runs/3301" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/automations/8/runs/3301', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/automations/8/runs/3301', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/automations/8/runs/3301",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 3301,
"automation_id": 8,
"contact_id": 123,
"object_id": 1,
"status": "active",
"exit_reason": "string",
"held_out": false,
"started_at": "2026-10-15T09:00:00+03:00",
"finished_at": "2026-10-15T09:00:00+03:00",
"converted_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Campanii#
Ciornele campaniilor și estimarea lor; lansarea se aprobă în dashboard.
Listează campaniile#
Parametri de query
-
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/campaigns" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/campaigns', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/campaigns', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/campaigns",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 21,
"name": "Oferta de toamnă",
"status": "draft",
"kind": "template",
"text": "string",
"object_id": 1,
"object_roles": [
"string"
],
"purpose": "marketing",
"number_id": 3,
"template": "autumn_offer",
"variables": [
"string"
],
"header_text": "string",
"topic": "string",
"segment_id": 12,
"location_id": 1,
"scheduled_at": "2026-10-15T09:00:00+03:00",
"expires_at": "2026-10-15T09:00:00+03:00",
"wave_by": "size",
"wave_size": 1,
"wave_hours": 24,
"wave_segments": [
1
],
"budget": "250.00",
"total": 1,
"processed": 1,
"created_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează ciorna unei campanii#
Momentele vin în ISO 8601, cu fusul lor orar. Lansarea se aprobă în dashboard.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
name string ObligatoriuExemplu:
Oferta de toamnă -
kind string
free: un mesaj liber, fără template, doar către contactele cu fereastra de 24h deschisă pe număr. object: un template utility către oamenii unui obiect, în locul unui segment.
Implicit:templateValori posibile:templatefreeobject -
object_id integer null
Cu kind object: obiectul ai cărui oameni primesc anunțul.
Exemplu:456 -
object_roles string[] null
Cu kind object: rolurile oamenilor care îl primesc; fără roluri, toți.
-
text string null
Mesajul liber, același pentru toți; doar cu kind free.
Lungime maximă:4096 -
purpose string null
Ce este mesajul liber: marketing, cu acordul și plafonul lui, sau informare.
Valori posibile:marketingtransactional -
number_id integer nullExemplu:
3 -
template string nullExemplu:
autumn_offer -
variables string[]
-
header_text string null
-
topic string null
-
segment_id integer nullExemplu:
12 -
location_id integer null
-
scheduled_at string nullFormat:
date-timeExemplu:2026-10-20T10:00:00+03:00 -
expires_at string nullFormat:
date-time -
wave_by stringValori posibile:
sizelocationsegment -
wave_size integer null
-
wave_hours integerExemplu:
24 -
wave_segments integer[] null
-
budget number null
Răspunsuri
curl -X POST "https://api.worbo.app/v1/campaigns" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Oferta de toamnă",
"object_id": 456,
"object_roles": [
"holder"
],
"number_id": 3,
"template": "autumn_offer",
"segment_id": 12,
"scheduled_at": "2026-10-20T10:00:00+03:00",
"wave_by": "size",
"wave_hours": 24
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/campaigns', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'name' => 'Oferta de toamnă',
'object_id' => 456,
'object_roles' => [
'holder',
],
'number_id' => 3,
'template' => 'autumn_offer',
'segment_id' => 12,
'scheduled_at' => '2026-10-20T10:00:00+03:00',
'wave_by' => 'size',
'wave_hours' => 24,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/campaigns', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Oferta de toamnă",
"object_id": 456,
"object_roles": [
"holder",
],
"number_id": 3,
"template": "autumn_offer",
"segment_id": 12,
"scheduled_at": "2026-10-20T10:00:00+03:00",
"wave_by": "size",
"wave_hours": 24,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/campaigns",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Oferta de toamnă",
"object_id": 456,
"object_roles": [
"holder",
],
"number_id": 3,
"template": "autumn_offer",
"segment_id": 12,
"scheduled_at": "2026-10-20T10:00:00+03:00",
"wave_by": "size",
"wave_hours": 24,
},
)
data = response.json()
{
"data": {
"id": 21,
"name": "Oferta de toamnă",
"status": "draft",
"kind": "template",
"text": "string",
"object_id": 1,
"object_roles": [
"string"
],
"purpose": "marketing",
"number_id": 3,
"template": "autumn_offer",
"variables": [
"string"
],
"header_text": "string",
"topic": "string",
"segment_id": 12,
"location_id": 1,
"scheduled_at": "2026-10-15T09:00:00+03:00",
"expires_at": "2026-10-15T09:00:00+03:00",
"wave_by": "size",
"wave_size": 1,
"wave_hours": 24,
"wave_segments": [
1
],
"budget": "250.00",
"total": 1,
"processed": 1,
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Citește o campanie, cu raportul mesajelor și costul#
Parametri din cale
-
campaign integer Obligatoriu
ID-ul campaniei.
Exemplu:21
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/campaigns/21" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/campaigns/21', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/campaigns/21', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/campaigns/21",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 21,
"name": "Oferta de toamnă",
"status": "draft",
"kind": "template",
"text": "string",
"object_id": 1,
"object_roles": [
"string"
],
"purpose": "marketing",
"number_id": 3,
"template": "autumn_offer",
"variables": [
"string"
],
"header_text": "string",
"topic": "string",
"segment_id": 12,
"location_id": 1,
"scheduled_at": "2026-10-15T09:00:00+03:00",
"expires_at": "2026-10-15T09:00:00+03:00",
"wave_by": "size",
"wave_size": 1,
"wave_hours": 24,
"wave_segments": [
1
],
"budget": "250.00",
"total": 1,
"processed": 1,
"created_at": "2026-10-15T09:00:00+03:00",
"report": {}
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Estimează audiența și costul unei campanii#
Cu aceleași excluderi ca la lansare: fără WhatsApp, fără consimțământ, de nelivrat, plafonul de frecvență.
Parametri din cale
-
campaign integer Obligatoriu
ID-ul campaniei.
Exemplu:21
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X POST "https://api.worbo.app/v1/campaigns/21/estimate" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/campaigns/21/estimate', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/campaigns/21/estimate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/campaigns/21/estimate",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
)
data = response.json()
{
"data": {
"audience": 240,
"contactable": 198,
"excluded": {
"whatsapp": 12,
"consent": 28,
"optin": 10,
"marketing": 18,
"window": 0,
"undeliverable": 2
},
"capped": 0,
"other_countries": 0,
"number": {
"quality": "GREEN",
"marketing_paused_until": "2026-10-15T09:00:00+03:00"
},
"united_states": 0,
"template": {},
"cost": {
"amount": 10.79,
"free": 0,
"rate": 0.0545,
"currency": "EUR",
"country": "RO",
"budget_messages": 1
},
"waves": {
"count": 1,
"per_day": 198,
"last_at": "2026-10-15T09:00:00+03:00",
"sizes": [
{}
]
},
"limit": {
"daily": 1000,
"days": 1,
"over": false
},
"start": "2026-10-15T09:00:00+03:00",
"quiet_until": "2026-10-15T09:00:00+03:00",
"ends_before_last_wave": false
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Conversații#
Inboxul: conversațiile, mesajele lor, răspunsurile, alocarea și închiderea.
Listează conversațiile#
Parametri de query
-
status string
Doar conversațiile cu acest status.
Valori posibile:openpendingresolved -
contact_id integer
Doar conversațiile acestui contact.
Exemplu:123 -
assigned_user_id integer
Doar conversațiile alocate acestui membru.
Exemplu:5 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/conversations" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/conversations', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversations', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/conversations",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 640,
"contact_id": 123,
"number_id": 3,
"status": "open",
"assigned_user_id": 1,
"assigned_team_id": 1,
"unread": 1,
"last_message_at": "2026-10-15T09:00:00+03:00",
"last_message_direction": "inbound",
"last_message_preview": "string",
"untrusted_last_message_preview": "string",
"window_closes_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează mesajele unei conversații#
Parametri din cale
-
conversation integer Obligatoriu
ID-ul conversației.
Exemplu:640
Parametri de query
-
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/conversations/640/messages" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/conversations/640/messages', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversations/640/messages', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/conversations/640/messages",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 7001,
"contact_id": 123,
"number_id": 3,
"direction": "outbound",
"type": "template",
"text": "string",
"untrusted_text": "string",
"template": {
"name": "booking_confirmed",
"language": "ro"
},
"category": "utility",
"status": "pending",
"reason": "string",
"error_code": "string",
"wamid": "string",
"created_at": "2026-10-15T09:00:00+03:00",
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Răspunde cu un text liber, în fereastra de 24 de ore#
Parametri din cale
-
conversation integer Obligatoriu
ID-ul conversației.
Exemplu:640
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
text string ObligatoriuExemplu:
Bună! Cu ce vă ajutăm?
Răspunsuri
curl -X POST "https://api.worbo.app/v1/conversations/640/messages" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"text": "Bună! Cu ce vă ajutăm?"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/conversations/640/messages', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'text' => 'Bună! Cu ce vă ajutăm?',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversations/640/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"text": "Bună! Cu ce vă ajutăm?",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/conversations/640/messages",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"text": "Bună! Cu ce vă ajutăm?",
},
)
data = response.json()
{
"data": {
"id": 7001,
"contact_id": 123,
"number_id": 3,
"direction": "outbound",
"type": "template",
"text": "string",
"untrusted_text": "string",
"template": {
"name": "booking_confirmed",
"language": "ro"
},
"category": "utility",
"status": "pending",
"reason": "string",
"error_code": "string",
"wamid": "string",
"created_at": "2026-10-15T09:00:00+03:00",
"sent_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"read_at": "2026-10-15T09:00:00+03:00",
"failed_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Alocă o conversație unui membru#
Parametri din cale
-
conversation integer Obligatoriu
ID-ul conversației.
Exemplu:640
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
user_id integer Obligatoriu null
Membrul care preia conversația; null o lasă nealocată.
Exemplu:5
Răspunsuri
curl -X POST "https://api.worbo.app/v1/conversations/640/assign" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"user_id": 5
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/conversations/640/assign', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'user_id' => 5,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversations/640/assign', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_id": 5,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/conversations/640/assign",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"user_id": 5,
},
)
data = response.json()
{
"data": {
"id": 640,
"contact_id": 123,
"number_id": 3,
"status": "open",
"assigned_user_id": 1,
"assigned_team_id": 1,
"unread": 1,
"last_message_at": "2026-10-15T09:00:00+03:00",
"last_message_direction": "inbound",
"last_message_preview": "string",
"untrusted_last_message_preview": "string",
"window_closes_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Închide o conversație#
Parametri din cale
-
conversation integer Obligatoriu
ID-ul conversației.
Exemplu:640
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X POST "https://api.worbo.app/v1/conversations/640/close" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/conversations/640/close', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversations/640/close', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/conversations/640/close",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
)
data = response.json()
{
"data": {
"id": 640,
"contact_id": 123,
"number_id": 3,
"status": "open",
"assigned_user_id": 1,
"assigned_team_id": 1,
"unread": 1,
"last_message_at": "2026-10-15T09:00:00+03:00",
"last_message_direction": "inbound",
"last_message_preview": "string",
"untrusted_last_message_preview": "string",
"window_closes_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Cataloage#
Produse, servicii, clase, abonamente și locații, scrise unul câte unul sau în lot.
Listează cataloagele#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/catalogs" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/catalogs', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/catalogs', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/catalogs",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"key": "fit.classes",
"name": "Classes",
"kind": "class",
"currency": "RON",
"source": "fitness"
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează articolele unui catalog#
Parametri din cale
-
catalog string Obligatoriu
Cheia catalogului, de exemplu fit.classes.
Exemplu:fit.classes
Parametri de query
-
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/catalogs/fit.classes/items" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/catalogs/fit.classes/items', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/catalogs/fit.classes/items', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/catalogs/fit.classes/items",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 310,
"external_id": "yoga",
"sku": "string",
"name": "Yoga",
"price": "50.00",
"currency": "RON",
"stock": 1,
"available": true,
"recommendable": true,
"url": "string",
"image_url": "string",
"fields": {},
"updated_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează un articol după ID-ul lui la sursă#
Parametri din cale
-
catalog string Obligatoriu
Cheia catalogului, de exemplu fit.classes.
Exemplu:fit.classes
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
id integer
-
external_id stringExemplu:
yoga -
name stringExemplu:
Yoga -
sku string
-
price numberExemplu:
50 -
currency stringExemplu:
RON -
stock integer
-
available booleanExemplu:
true -
recommendable booleanExemplu:
true -
url string
-
image_url string
-
custom object
Răspunsuri
curl -X POST "https://api.worbo.app/v1/catalogs/fit.classes/items" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": true,
"recommendable": true
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/catalogs/fit.classes/items', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'external_id' => 'yoga',
'name' => 'Yoga',
'price' => 50,
'currency' => 'RON',
'available' => true,
'recommendable' => true,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/catalogs/fit.classes/items', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": true,
"recommendable": true,
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/catalogs/fit.classes/items",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": True,
"recommendable": True,
},
)
data = response.json()
{
"data": {
"id": 310,
"external_id": "yoga",
"sku": "string",
"name": "Yoga",
"price": "50.00",
"currency": "RON",
"stock": 1,
"available": true,
"recommendable": true,
"url": "string",
"image_url": "string",
"fields": {},
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"data": {
"id": 310,
"external_id": "yoga",
"sku": "string",
"name": "Yoga",
"price": "50.00",
"currency": "RON",
"stock": 1,
"available": true,
"recommendable": true,
"url": "string",
"image_url": "string",
"fields": {},
"updated_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Creează sau actualizează cel mult 100 de articole#
Parametri din cale
-
catalog string Obligatoriu
Cheia catalogului, de exemplu fit.classes.
Exemplu:fit.classes
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
items object[] Obligatoriu
Arată câmpurileAscunde câmpurile
-
id integer
-
external_id stringExemplu:
yoga -
name stringExemplu:
Yoga -
sku string
-
price numberExemplu:
50 -
currency stringExemplu:
RON -
stock integer
-
available booleanExemplu:
true -
recommendable booleanExemplu:
true -
url string
-
image_url string
-
custom object
-
Răspunsuri
curl -X POST "https://api.worbo.app/v1/catalogs/fit.classes/items/batch" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": true,
"recommendable": true
}
]
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/catalogs/fit.classes/items/batch', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'items' => [
[
'external_id' => 'yoga',
'name' => 'Yoga',
'price' => 50,
'currency' => 'RON',
'available' => true,
'recommendable' => true,
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/catalogs/fit.classes/items/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": true,
"recommendable": true,
},
],
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/catalogs/fit.classes/items/batch",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"items": [
{
"external_id": "yoga",
"name": "Yoga",
"price": 50,
"currency": "RON",
"available": True,
"recommendable": True,
},
],
},
)
data = response.json()
{
"data": [
{
"index": 0,
"status": "created",
"data": {
"id": 310,
"external_id": "yoga",
"sku": "string",
"name": "Yoga",
"price": "50.00",
"currency": "RON",
"stock": 1,
"available": true,
"recommendable": true,
"url": "string",
"image_url": "string",
"fields": {},
"updated_at": "2026-10-15T09:00:00+03:00"
},
"error": {
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "The request is not valid",
"status": 422,
"detail": "The name field is required.",
"code": "validation_failed",
"errors": {
"name": [
"The name field is required."
]
}
}
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Webhooks#
Endpoint-urile care primesc evenimentele Worbo, livrările și reluările lor.
Listează endpoint-urile de webhook#
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/webhook-endpoints" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/webhook-endpoints', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-endpoints', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/webhook-endpoints",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 4,
"url": "https://crm.example.com/worbo",
"description": "string",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot",
"enabled": true,
"disabled_reason": "string",
"failing_since": "2026-10-15T09:00:00+03:00",
"last_success_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
]
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Adaugă un endpoint de webhook#
Secretul de semnare vine în răspuns, doar acum.
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
url string ObligatoriuFormat:
uriExemplu:https://crm.example.com/worbo -
description string
-
events string[] Obligatoriu
-
payload stringValori posibile:
snapshotthin
Răspunsuri
curl -X POST "https://api.worbo.app/v1/webhook-endpoints" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/webhook-endpoints', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
'json' => [
'url' => 'https://crm.example.com/worbo',
'events' => [
'contact.created',
'message.received',
],
'payload' => 'snapshot',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-endpoints', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received",
],
"payload": "snapshot",
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/webhook-endpoints",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received",
],
"payload": "snapshot",
},
)
data = response.json()
{
"data": {
"id": 4,
"url": "https://crm.example.com/worbo",
"description": "string",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot",
"enabled": true,
"disabled_reason": "string",
"failing_since": "2026-10-15T09:00:00+03:00",
"last_success_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Schimbă adresa sau evenimentele unui endpoint#
Parametri din cale
-
endpoint integer Obligatoriu
ID-ul endpoint-ului de webhook.
Exemplu:4
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Corpul cereriiapplication/json
-
url string ObligatoriuFormat:
uriExemplu:https://crm.example.com/worbo -
description string
-
events string[] Obligatoriu
-
payload stringValori posibile:
snapshotthin
Răspunsuri
curl -X PATCH "https://api.worbo.app/v1/webhook-endpoints/4" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot"
}'
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://api.worbo.app/v1/webhook-endpoints/4', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
'json' => [
'url' => 'https://crm.example.com/worbo',
'events' => [
'contact.created',
'message.received',
],
'payload' => 'snapshot',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-endpoints/4', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received",
],
"payload": "snapshot",
}),
});
const data = await response.json();
import os
import requests
response = requests.patch(
"https://api.worbo.app/v1/webhook-endpoints/4",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
json={
"url": "https://crm.example.com/worbo",
"events": [
"contact.created",
"message.received",
],
"payload": "snapshot",
},
)
data = response.json()
{
"data": {
"id": 4,
"url": "https://crm.example.com/worbo",
"description": "string",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot",
"enabled": true,
"disabled_reason": "string",
"failing_since": "2026-10-15T09:00:00+03:00",
"last_success_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Șterge un endpoint de webhook#
Parametri din cale
-
endpoint integer Obligatoriu
ID-ul endpoint-ului de webhook.
Exemplu:4
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X DELETE "https://api.worbo.app/v1/webhook-endpoints/4" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.worbo.app/v1/webhook-endpoints/4', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-endpoints/4', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.delete(
"https://api.worbo.app/v1/webhook-endpoints/4",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"id": 4,
"deleted": true
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Rotește secretul de semnare al unui endpoint#
Secretul vechi rămâne valabil 24 de ore; între timp se trimit ambele semnături.
Parametri din cale
-
endpoint integer Obligatoriu
ID-ul endpoint-ului de webhook.
Exemplu:4
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X POST "https://api.worbo.app/v1/webhook-endpoints/4/rotate" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/webhook-endpoints/4/rotate', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-endpoints/4/rotate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/webhook-endpoints/4/rotate",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
)
data = response.json()
{
"data": {
"id": 4,
"url": "https://crm.example.com/worbo",
"description": "string",
"events": [
"contact.created",
"message.received"
],
"payload": "snapshot",
"enabled": true,
"disabled_reason": "string",
"failing_since": "2026-10-15T09:00:00+03:00",
"last_success_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00",
"secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează livrările evenimentelor#
Parametri de query
-
endpoint_id integer
Doar livrările către acest endpoint.
Exemplu:4 -
status string
Doar livrările cu acest status.
Valori posibile:pendingdeliveredfailed -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/webhook-deliveries" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/webhook-deliveries', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-deliveries', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/webhook-deliveries",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"id": 9001,
"endpoint_id": 4,
"event": {
"id": "msg_2mF0",
"type": "contact.created"
},
"status": "delivered",
"attempts": 1,
"last_status": 200,
"last_error": "string",
"next_attempt_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Retrimite o livrare#
Parametri din cale
-
delivery integer Obligatoriu
ID-ul livrării.
Exemplu:9001
Parametri de query
-
dry_run boolean
Trece prin toate verificările și întoarce ce s-ar întâmpla, fără să salveze nimic.
Antete
-
Idempotency-Key string
O cheie unică a cererii, de exemplu un UUID: o cerere repetată cu aceeași cheie primește primul răspuns, fără să se facă din nou lucrul.
Lungime maximă:255 -
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl -X POST "https://api.worbo.app/v1/webhook-deliveries/9001/replay" \
-H "Authorization: Bearer $WORBO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.worbo.app/v1/webhook-deliveries/9001/replay', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
'Idempotency-Key' => bin2hex(random_bytes(16)),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/webhook-deliveries/9001/replay', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://api.worbo.app/v1/webhook-deliveries/9001/replay",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
)
data = response.json()
{
"data": {
"id": 9001,
"endpoint_id": 4,
"event": {
"id": "msg_2mF0",
"type": "contact.created"
},
"status": "delivered",
"attempts": 1,
"last_status": 200,
"last_error": "string",
"next_attempt_at": "2026-10-15T09:00:00+03:00",
"delivered_at": "2026-10-15T09:00:00+03:00",
"created_at": "2026-10-15T09:00:00+03:00"
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/not_found",
"title": "Negăsit",
"status": 404,
"detail": "Resursa nu există sau aparține altei organizații.",
"code": "not_found"
}
{
"type": "https://worbo.app/docs/api/errors/idempotency_conflict",
"title": "Idempotency-Key a fost folosită pentru altă cerere",
"status": 409,
"detail": "Idempotency-Key a fost folosit pentru altă cerere.",
"code": "idempotency_conflict"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Referință
Rapoarte#
Rezultatele unei perioade și conversiile automatizărilor.
Citește rezultatele unei perioade#
Automatizările cu grupul de control, linia de bază, valoarea și costul, în zilele organizației.
Parametri de query
-
from string Obligatoriu
Prima zi a perioadei.
Format:dateExemplu:2026-10-01 -
to string Obligatoriu
Ultima zi a perioadei.
Format:dateExemplu:2026-10-15 -
location_id integer
Doar contactele acestei locații de bază.
Exemplu:7
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/reports/results" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/reports/results', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/reports/results', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/reports/results",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": {
"from": "2026-09-30T21:00:00+00:00",
"to": "2026-10-15T20:59:59+00:00",
"journeys": [
{
"id": 8,
"name": "Recâștigare",
"conversion": "string",
"entered": 40,
"converted": 6,
"control": {},
"value": 1194,
"sent": 40,
"clicked": 11,
"cost": 2.18
}
],
"conversions": [
{}
],
"baseline": {},
"cost": {
"amount": 2.18,
"currency": "EUR"
},
"value": 1194
}
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}
Listează conversiile automatizărilor#
Parametri de query
-
automation_id integer
Doar conversiile acestei automatizări.
Exemplu:8 -
since string
Doar ce s-a schimbat în acest moment sau după el.
Format:date-timeExemplu:2026-10-01T00:00:00+03:00 -
limit integer
Câte elemente are o pagină, între 1 și 100.
Implicit:25Minim:1Maxim:100 -
cursor string
next_cursor de la pagina anterioară.
Antete
-
Worbo-Version string
Versiunea API, ca dată; fără ea, versiunea cheii.
Valori posibile:2026-10-05
Răspunsuri
curl "https://api.worbo.app/v1/conversions" \
-H "Authorization: Bearer $WORBO_API_KEY"
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.worbo.app/v1/conversions', [
'headers' => [
'Authorization' => 'Bearer '.getenv('WORBO_API_KEY'),
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://api.worbo.app/v1/conversions', {
headers: {
Authorization: `Bearer ${process.env.WORBO_API_KEY}`,
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://api.worbo.app/v1/conversions",
headers={
"Authorization": f"Bearer {os.environ['WORBO_API_KEY']}",
},
)
data = response.json()
{
"data": [
{
"run_id": 3301,
"automation_id": 8,
"contact_id": 123,
"object_id": 1,
"held_out": false,
"converted_at": "2026-10-15T09:00:00+03:00",
"event_id": 1,
"value": 199,
"currency": "RON"
}
],
"next_cursor": "string",
"has_more": true
}
{
"type": "https://worbo.app/docs/api/errors/invalid_api_key",
"title": "Cheia API nu este validă",
"status": 401,
"detail": "Cheia nu e validă; o cheie pierdută nu se poate recupera, doar înlocui.",
"code": "invalid_api_key"
}
{
"type": "https://worbo.app/docs/api/errors/insufficient_scope",
"title": "Cheii API îi lipsește o permisiune",
"status": 403,
"detail": "Cheia nu are scope-ul operației.",
"code": "insufficient_scope"
}
{
"type": "https://worbo.app/docs/api/errors/validation_failed",
"title": "Cererea nu este validă",
"status": 422,
"detail": "Un parametru lipsește, nu e valid sau nu e cunoscut; câmpul errors spune care.",
"code": "validation_failed"
}
{
"type": "https://worbo.app/docs/api/errors/rate_limited",
"title": "Prea multe cereri",
"status": 429,
"detail": "Prea multe cereri; așteaptă secundele din Retry-After.",
"code": "rate_limited"
}