Conectați sistemele proprii la Harmoniq pentru a consulta și actualiza date despre angajați, unități, concedii, performanță, instruiri și alte activități. API-ul folosește JSON prin HTTPS, cu chei separate pentru fiecare sistem și drepturi de acces pe resurse.
Ca proprietar sau administrator al companiei, deschideți Acces → Chei API și alegeți Cheie nouă.
Denumiți cheia după sistemul care o va folosi. Acordați doar drepturile de citire sau scriere necesare și, dacă este posibil, limitați accesul la adresele IP ale sistemului.
Copiați cheia: este afișată o singură dată. Harmoniq păstrează doar o amprentă a ei.
Apelați adresa companiei cu cheia în antetul Authorization.
Trimiteți cheia ca token Bearer în antetul Authorization. Cheia este valabilă doar la adresa companiei pentru care a fost creată. Puteți stabili o dată de expirare, limita accesul la adrese sau intervale IP și suspenda, reactiva ori revoca cheia. Modificările sunt înregistrate în numele persoanei care a creat-o. Dacă aceasta pierde dreptul de a administra chei API, cheia permite în continuare citirea, dar nu și scrierea.
Authorization: Bearer hq_12_••••••••
Drepturi
Pentru fiecare resursă, cheia poate primi drepturi de citire ({resource}:read) și de scriere ({resource}:write). Acestea se aplică datelor din întreaga companie. Există și două drepturi speciale: sensitive, pentru citirea și scrierea câmpurilor personalizate marcate ca sensibile, și metrics:write, pentru trimiterea valorilor KPI folosind referințe de business.
Cereri și răspunsuri
Cererile și răspunsurile folosesc JSON cu codare UTF-8. Pentru cererile cu corp, trimiteți antetul Content-Type: application/json.
Folosiți formatul AAAA-LL-ZZ pentru date și ISO 8601 pentru dată și oră. Răspunsurile folosesc UTC, de exemplu 2026-05-01T08:00:00Z.
O singură înregistrare este returnată ca {"data": {…}}; o listă ca {"data": […], "meta": {page, per_page, total, last_page}, "links": {next, prev}}.
Liste: page (de la 1), per_page (25 implicit, cel mult 100), sort (id, created_at, updated_at; cu minus pentru descrescător), updated_since (înregistrările modificate după un anumit moment, pentru sincronizare), plus filtrele fiecărei resurse.
Creați cu POST; modificați cu PATCH, trimițând doar câmpurile de schimbat; DELETE răspunde 204. Cererile care includ câmpuri fără drept de scriere sunt respinse.
Operațiile de scriere sunt atomice: toate modificările se salvează împreună sau nu se salvează niciuna.
GET https://compania-mea.harmoniq.ro/api/v1/employees?status=active&updated_since=2026-05-01T00:00:00Z&page=2
Erori
Erorile sunt returnate în formatul {"error": "<cod>", "message": "<text>"}. Pentru date invalide, API-ul returnează codul 422 și detalii în „errors”, pentru fiecare câmp afectat.
Stare
Cod
Ce înseamnă
401
invalid_token
Cheia lipsește, este necunoscută sau aparține altei companii.
403
token_inactive
Cheia este suspendată sau expirată.
403
insufficient_scope
Cheia nu are dreptul necesar pentru această operație.
403
ip_not_allowed
Cheia nu acceptă apeluri de la această adresă.
403
token_owner_inactive
Persoana care a creat cheia nu mai poate administra chei: cheia citește, dar nu scrie.
404
—
Resursa sau înregistrarea nu există în compania dumneavoastră (sau nu este în plan).
405
—
Resursa nu oferă această operație.
409
in_use
Înregistrarea este folosită în altă parte și nu poate fi ștearsă.
422
—
Date invalide. Nu s-a salvat nimic.
429
—
Prea multe cereri; încercați din nou după Retry-After secunde.
Limite
Limita este de 120 de cereri pe minut pentru fiecare cheie și 300 pentru fiecare adresă IP. La depășire, API-ul returnează codul 429. Antetul Retry-After indică timpul de așteptare până la următoarea încercare.
Versiuni
Versiunea curentă este 1 (/api/v1). Resursele, câmpurile și filtrele noi se adaugă în această versiune. Modificările incompatibile cu integrările existente vor fi introduse într-o versiune nouă, anunțată din timp.
Date personale
CNP-ul nu poate fi citit sau scris prin API.
Accesul la câmpurile personalizate sensibile necesită dreptul sensitive.
Rezultatele chestionarelor anonime sunt disponibile doar ca totaluri. Nu sunt accesibile cât timp răspunsurile sunt sigilate sau numărul lor este prea mic pentru a proteja anonimatul participanților.
Jurnalul API păstrează timp de 30 de zile cheia folosită, adresa apelată, codul răspunsului și durata, fără conținutul cererii sau al răspunsului. Ultimele apeluri pot fi consultate în Acces → Chei API.
Trimiterea valorilor KPI
Pentru a trimite valori KPI, puteți folosi referințe de business în loc de ID-uri interne. Trimiteți POST /api/v1/metrics/{key}/values cu perioada și valorile pentru angajați (identificați prin marcă), unități sau departamente (identificate prin cod). Operația necesită dreptul metrics:write. GET /api/v1/metrics listează indicatorii care acceptă aceste valori.
Arborele de țări, regiuni și zone din care fac parte unitățile; de el depinde și aria managerilor de zonă. Numele sunt unice între zonele cu același părinte. Ștergerea e refuzată cât timp unități sau subzone o folosesc.
Drepturi: geo_areas:read, geo_areas:write
Adrese
GET/api/v1/geo-areasListă
GET/api/v1/geo-areas/{id}O înregistrare
POST/api/v1/geo-areasCreare
PATCH/api/v1/geo-areas/{id}Modificare
DELETE/api/v1/geo-areas/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
name
stringobligatoriu
Nume, unic între zonele cu același părinte.
level_label
string | null
Cum se numește nivelul (țară, regiune, zonă).
parent_id
integer | null
Zona din care face parte; null pentru o zonă de nivel superior. Niciodată ea însăși sau una dintre subzonele ei.
Câmpurile adăugate de companie propriilor înregistrări, doar citire: ce înseamnă fiecare id din custom_fields al unei înregistrări, tipul și variantele lui. Câmpurile sensibile ale angajaților apar doar pentru o cheie cu dreptul sensitive. Câmpurile se definesc în aplicație.
Drepturi: custom_fields:read
Adrese
GET/api/v1/custom-fieldsListă
GET/api/v1/custom-fields/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator; cheia din custom_fields al unei înregistrări.
entity
employee | work_unit | department | position | team | companydoar citire
Tipul de înregistrare căruia îi aparține.
label
stringdoar citire
Numele, în limba cererii (Accept-Language).
type
text | textarea | number | date | boolean | select | multiselect | urldoar citire
Ce conține: text, textarea, number, date (Y-m-d), boolean, select, multiselect sau url.
options
array | nulldoar citire
Variantele unui select sau multiselect: id și etichetă; valoarea păstrată este id-ul.
is_required
booleandoar citire
Dacă valoarea este obligatorie.
visibility
reach | sensitivedoar citire
reach (toți cei care văd angajatul) sau sensitive.
is_active
booleandoar citire
Dacă este în folosință.
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
entity
employee | work_unit | department | position | team | company
Oamenii companiei. Crearea unui angajat creează și prima încadrare; mutările ulterioare se fac prin /placements. CNP-ul nu se citește și nu se scrie niciodată prin API. Conturile de acces se creează în aplicație.
Drepturi: employees:read, employees:write
Adrese
GET/api/v1/employeesListă
GET/api/v1/employees/{id}O înregistrare
POST/api/v1/employeesCreare
PATCH/api/v1/employees/{id}Modificare
DELETE/api/v1/employees/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
employee_number
string | null
Marca, unică în companie (folosită la potrivirea valorilor KPI).
first_name
stringobligatoriu
Prenume.
last_name
stringobligatoriu
Nume.
email
string | null
E-mail de serviciu.
phone
string | null
Telefon.
birth_date
date | null
Data nașterii.
hire_date
date | null
Data angajării (de la ea începe prima încadrare).
termination_date
date | null
Data plecării.
status
active | inactive | terminated
active, inactive sau terminated.
work_unit_id
integerobligatoriu
Unitatea încadrării principale de acum; obligatorie la creare, doar citire după.
department_id
integer | null
Departamentul încadrării principale (doar la creare).
position_id
integer | null
Funcția încadrării principale (doar la creare).
has_login
booleandoar citire
Dacă persoana se poate autentifica.
custom_fields
object
Câmpurile proprii ale companiei, după id; cele sensibile doar cu dreptul sensitive.
Unde lucrează fiecare persoană: unitate, departament și funcție, de când până când. O încadrare principală nouă o preia pe cea dinainte, care rămâne încadrare secundară curentă până când este încheiată.
Drepturi: placements:read, placements:write
Adrese
GET/api/v1/placementsListă
GET/api/v1/placements/{id}O înregistrare
POST/api/v1/placementsCreare
DELETE/api/v1/placements/{id}Ștergere
POST/api/v1/placements/{id}/endÎncheie încadrarea la valid_to (nu înainte de începutul ei).
POST/api/v1/placements/{id}/make-primaryO face încadrarea principală; cea principală dinainte devine secundară.
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
employee_id
integerobligatoriu
Persoana.
work_unit_id
integerobligatoriu
Unitatea.
department_id
integer | null
Departamentul.
position_id
integer | null
Funcția.
is_primary
boolean
Dacă este încadrarea principală a persoanei.
valid_from
dateobligatoriu
Prima zi.
valid_to
date | null
Ultima zi (gol: încă în vigoare).
created_at
datetimedoar citire
Creată.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
employee_id
integer
Doar ale acestei persoane.
work_unit_id
integer
Doar în această unitate.
current
boolean
true: doar încadrările în vigoare azi.
/api/v1/placements/{id}/end: valid_to (date) — Ultima zi a încadrării (Y-m-d).
Cererile de concediu, după aceleași reguli ca în aplicație: se numără zilele lucrătoare, se verifică soldul și suprapunerile și pornește fluxul de aprobare al companiei. Aprobarea și respingerea urmează fluxul cererii: cel care a creat cheia trebuie să fie aprobator la pasul curent.
Soldul anual al fiecărei persoane, pentru fiecare tip de concediu care se scade dintr-un sold. Listarea unui an îl deschide pentru toți oamenii activi, pro rata și cu zilele reportate, ca în aplicație; zilele folosite, în așteptare și disponibile se calculează. Zilele anului, ajustarea și zilele reportate se pot modifica — niciodată pentru persoana care a creat cheia.
Calendarul companiei. Participanții (sau unitatea) sunt anunțați despre un eveniment nou, o oră nouă sau un loc nou. Un eveniment nou se poate repeta: fiecare apariție devine un eveniment separat din aceeași serie și se modifică, se anulează sau se șterge separat.
Ce măsoară compania: cheia fiecărui indicator, unitatea de măsură, pentru cine se măsoară (nivelul) și cât de des (perioada). Doar citire; indicatorii se definesc în aplicație. Prin API se pot trimite valori doar pentru indicatorii cu sursa „api”.
Drepturi: kpi_metrics:read
Adrese
GET/api/v1/kpi-metricsListă
GET/api/v1/kpi-metrics/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
key
stringdoar citire
Cheia indicatorului, folosită în formule și la trimiterea valorilor.
Valoarea unui indicator pentru un subiect într-o perioadă. Crearea o scrie (sau înlocuiește valoarea existentă pentru acel subiect și acea perioadă); acceptă valori doar indicatorii cu sursa „api”. O valoare lipsă (null) înseamnă „fără date”, niciodată zero. Pentru multe valori după referințe de business (marcă, codul unității) folosiți POST /metrics/{key}/values.
Drepturi: metric_values:read, metric_values:write
Adrese
GET/api/v1/metric-valuesListă
GET/api/v1/metric-values/{id}O înregistrare
POST/api/v1/metric-valuesCreare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
metric
stringobligatoriu
Cheia indicatorului.
subject_type
employee | team | department | work_unit | geo_area | companydoar citire
Felul subiectului (nivelul indicatorului).
subject_id
integerobligatoriu
Id-ul subiectului (angajat, unitate, departament, zonă sau echipă; 0 pentru companie).
Fișele de performanță cu toate versiunile lor (ciornă, publicată, arhivată): părțile din care e făcut scorul, ponderile lor și nivelurile în care cade un scor. Doar citire; fișele se construiesc în aplicație, iar o versiune publicată nu se mai schimbă.
Drepturi: kpi_scorecards:read
Adrese
GET/api/v1/kpi-scorecardsListă
GET/api/v1/kpi-scorecards/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificatorul acestei versiuni.
family
stringdoar citire
Fișa, de-a lungul versiunilor ei.
version
integerdoar citire
Numărul versiunii.
name
stringdoar citire
Nume.
description
string | nulldoar citire
Descriere.
grain
employee | team | department | work_unit | geo_area | companydoar citire
Pe cine notează.
period
day | week | month | quarter | yeardoar citire
Cât de des notează.
status
draft | published | archiveddoar citire
draft, published sau archived.
effective_from
date | nulldoar citire
În vigoare de la.
effective_to
date | nulldoar citire
În vigoare până la.
published_at
datetime | nulldoar citire
Când a fost publicată această versiune.
components
arraydoar citire
Părțile: cheie, etichetă, pondere (0–1), țintă, format de afișare, dacă o vede angajatul.
levels
arraydoar citire
Nivelurile: nume, cel mai mic scor care îl atinge, culoare.
Scorurile pe fișele de performanță: rezultatul curent al fiecărui subiect și al fiecărei perioade, nivelul atins și valoarea și punctele fiecărei părți. Un total sau o parte fără date este null, niciodată zero. Doar citire; rezultatele apar la închiderea unei perioade.
Drepturi: kpi_results:read
Adrese
GET/api/v1/kpi-resultsListă
GET/api/v1/kpi-results/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
scorecard_id
integerdoar citire
Versiunea fișei care l-a calculat.
scorecard
stringdoar citire
Numele ei.
subject_type
employee | team | department | work_unit | geo_area | companydoar citire
Felul subiectului.
subject_id
integerdoar citire
Id-ul subiectului.
subject
string | nulldoar citire
Numele subiectului.
period
datedoar citire
Prima zi a perioadei.
total
string | nulldoar citire
Scorul, ca șir zecimal; null când nu sunt date.
level
string | nulldoar citire
Nivelul atins.
level_color
string | nulldoar citire
Culoarea nivelului.
bonus
string | nulldoar citire
Bonusul, când fișa îl calculează.
parts
arraydoar citire
Fiecare parte: cheie, etichetă, valoare și punctele aduse (șiruri zecimale; null pentru fără date).
created_at
datetimedoar citire
Când a fost calculat.
Filtre
scorecard_id
integer
Doar această versiune a fișei.
period
date
Prima zi a perioadei (Y-m-d).
subject_type
employee | team | department | work_unit | geo_area | company
Obiective după o regulă (de exemplu „produse focus”): perioada, parametrii și țintele pe unități. Regula și perioada nu se mai schimbă după creare. Acțiunea record păstrează ce au realizat oamenii sau unitățile; punctajul se calculează la închiderea perioadei. Un obiectiv deja punctat nu poate fi șters.
Drepturi: objectives:read, objectives:write
Adrese
GET/api/v1/objectivesListă
GET/api/v1/objectives/{id}O înregistrare
POST/api/v1/objectivesCreare
PATCH/api/v1/objectives/{id}Modificare
DELETE/api/v1/objectives/{id}Ștergere
POST/api/v1/objectives/{id}/recordPăstrează ce au realizat subiecții: măsurile lor înlocuiesc ce era înregistrat; măsurile goale șterg înregistrarea (din nou fără date).
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
rule_id
integerobligatoriu
Regula care îl punctează (doar la creare).
rule
stringdoar citire
Numele regulii.
name
stringobligatoriu
Nume.
description
text | null
Descriere.
period
stringobligatoriu
Cheia perioadei, în perioada regulii (doar la creare), de exemplu 2026-09.
period_start
datedoar citire
Prima zi.
period_end
datedoar citire
Ultima zi.
params
object
Valorile parametrilor regulii, după nume (celelalte se ignoră); lipsă: valorile implicite ale regulii.
targets
array
Țintele pe unități: o listă de {work_unit_id, target}. Când are ținte, obiectivul este doar pentru acele unități.
external_ref
string | null
Referința dumneavoastră (doar la creare).
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
rule_id
integer
Doar după această regulă.
period_start
date
Prima zi a perioadei (Y-m-d).
external_ref
string
Referința exactă.
/api/v1/objectives/{id}/record: achievements (array) — O listă de {subject_id, measures: {numele măsurii: număr}}; subiecți la nivelul regulii, din unitățile cu ținte.
Evaluările date pe grile: cui, de cine, pentru ce perioadă, punctele și rezultatul și răspunsul la fiecare criteriu. Doar citire; evaluările se dau în aplicație. Ciornele sunt lucrul evaluatorului și nu apar niciodată.
Drepturi: reviews:read
Adrese
GET/api/v1/reviewsListă
GET/api/v1/reviews/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
form_id
integerdoar citire
Versiunea grilei.
form
stringdoar citire
Numele grilei.
employee_id
integerdoar citire
Persoana evaluată.
evaluator_id
integer | nulldoar citire
Contul celui care a evaluat.
period_start
datedoar citire
Prima zi a perioadei.
period_end
datedoar citire
Ultima zi.
status
submitted | cancelleddoar citire
submitted sau cancelled.
total_points
string | nulldoar citire
Punctele obținute.
max_points
string | nulldoar citire
Punctele posibile.
result
string | nulldoar citire
Rezultatul (puncte sau procent, când grila dă procent).
comment
text | nulldoar citire
Comentariul evaluatorului, ca text simplu.
submitted_at
datetime | nulldoar citire
Când a fost trimisă.
cancelled_at
datetime | nulldoar citire
Când a fost anulată.
answers
arraydoar citire
Fiecare criteriu: cheie, variantele alese, o valoare, punctele și un comentariu.
Catalogul de cursuri. Titlul și descrierea se scriu în limba companiei (celelalte limbi se traduc în aplicație); capitolele și coperțile se scriu în aplicație. Un curs se poate șterge doar cât timp nu a fost alocat nimănui — altfel arhivați-l.
Drepturi: courses:read, courses:write
Adrese
GET/api/v1/coursesListă
GET/api/v1/courses/{id}O înregistrare
POST/api/v1/coursesCreare
PATCH/api/v1/courses/{id}Modificare
DELETE/api/v1/courses/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
title
stringobligatoriu
Titlu.
description
text | null
Descriere scurtă, text simplu.
category_id
integer | null
Categoria.
category
string | nulldoar citire
Numele categoriei.
author
string | null
Autor.
status
draft | published | archivedobligatoriu
draft, published sau archived; doar cursurile publicate pot fi alocate.
estimated_minutes
integer | null
Durata estimată, în minute.
validity_months
integer | null
Câte luni rămâne valabil certificatul; gol: nu expiră.
issues_certificate
boolean
Dacă la final se emite un certificat.
recertifies
boolean
Dacă oamenii sunt reînscriși înainte să expire certificatul.
points
integerobligatoriu
Punctele primite la final.
chapters_count
integerdoar citire
Numărul de capitole.
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
status
draft | published | archived
Doar cu această stare.
category_id
integer
Doar din această categorie.
q
string
O parte din titlu.
Exemplu de cerere
POST https://compania-mea.harmoniq.ro/api/v1/courses
{
"title": "Siguranța la incendiu",
"status": "published",
"estimated_minutes": 20,
"validity_months": 12,
"issues_certificate": true,
"recertifies": false,
"points": 10
}
Un curs publicat (sau un test de sine stătător) dat unor oameni: tuturor, unei unități, unei zone, unui departament, unei funcții sau unor angajați anume. Oamenii sunt înscriși imediat. Se șterge doar cât timp nimeni nu a început.
Acțiunile corective stabilite după audituri. Avansează ca pe pagina auditului: marcate ca rezolvate cu o notă, verificate, redeschise cu un motiv sau anulate.
Autorizații, contracte și regulamente, cu data expirării. API-ul citește datele documentului și numele, mărimea și tipul fișierului curent; fișierul se descarcă din aplicație. Un fișier se trimite ca {"name", "content_base64"} (aceleași tipuri ca în aplicație — PDF, Office, imagini, ZIP — cel mult 50 MB); un fișier trimis la un document existent adaugă o versiune nouă. Ștergerea mută documentul în coș, de unde se poate restaura din aplicație.
Drepturi: documents:read, documents:write
Adrese
GET/api/v1/documentsListă
GET/api/v1/documents/{id}O înregistrare
POST/api/v1/documentsCreare
PATCH/api/v1/documents/{id}Modificare
DELETE/api/v1/documents/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
title
stringobligatoriu
Titlu.
description
text | null
Descriere.
category_id
integer | null
Categoria (vedeți /document-categories).
work_unit_id
integer | null
Unitatea căreia îi aparține; gol pentru un document al companiei. Se alege doar la creare.
is_internal
boolean
Îl văd doar cei care administrează documentele.
expires_on
date | null
Data expirării.
expiry_state
valid | expiring | expired | nulldoar citire
valid, expiring sau expired (gol fără dată de expirare).
repeat_months
integer | null
Se reînnoiește la acest număr de luni.
alert_days
array | null
Cu câte zile înainte de expirare pleacă mementourile (cel mult 6).
versions
integerdoar citire
Câte versiuni ale fișierului există.
file_name
string | nulldoar citire
Numele fișierului curent.
file_size
integer | nulldoar citire
Mărimea, în octeți.
file_mime
string | nulldoar citire
Tipul.
file
fileobligatoriu
Fișierul: {"name": "…", "content_base64": "…"}. Obligatoriu la creare; la modificare adaugă o versiune.
version_note
string | null
O notă pentru versiunea fișierului (se citește nota versiunii curente).
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
work_unit_id
integer
Doar documentele acestei unități.
category_id
integer
Doar această categorie.
company
boolean
true: doar documentele companiei; false: doar ale unităților.
Cereri de a repara sau de a asigura ceva într-o unitate, cu istoricul lor. Se depun pentru persoana din requested_by (care trebuie să poată face solicitări pentru acea unitate) sau pentru cel care a creat cheia; se aplică fluxul de aprobare al categoriei. Se mută cu acțiunea move, cum poate face pe ecran cel care a creat cheia.
POST/api/v1/service-requests/{id}/moveMută solicitarea în altă stare (in_progress, resolved, unresolved, open, cancelled), cum poate cel care a creat cheia. Nerezolvată și redeschiderea cer un comentariu.
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
category_id
integerobligatoriu
Categoria (vedeți /service-categories).
work_unit_id
integerobligatoriu
Unitatea pentru care este.
title
stringobligatoriu
Titlu scurt.
description
textobligatoriu
Ce nu merge sau ce trebuie.
requested_by
integer
Utilizatorul pentru care se depune (o persoană din companie); cel care a creat cheia, dacă lipsește.
/api/v1/service-requests/{id}/move: status (awaiting_approval | open | in_progress | resolved | unresolved | rejected | cancelled) — Starea nouă.; comment (text) — De ce (obligatoriu pentru nerezolvată și la redeschidere).
Exemplu de cerere
POST https://compania-mea.harmoniq.ro/api/v1/service-requests
{
"category_id": 2,
"work_unit_id": 12,
"title": "Frigiderul de vaccinuri nu mai răcește",
"description": "text",
"requested_by": 17
}
Cereri de materiale, cu pozițiile lor. Se depun pentru persoana din requested_by (sau pentru cel care a creat cheia), pentru materiale active și o unitate pentru care poate cere; apoi se preiau, se finalizează (stocul scade) sau se anulează, cum poate pe ecran cel care a creat cheia.
Chestionarele publicate și închise, cu întrebările lor, și rezultatele doar ca totaluri: câți au ales fiecare răspuns, media unei scale și câți au răspuns la o întrebare liberă — niciodată ce au scris. Rezultatele unui chestionar anonim rămân ascunse cât timp răspunsurile sunt sigilate și cât are mai puțin de 5 răspunsuri.
Drepturi: surveys:read
Adrese
GET/api/v1/surveysListă
GET/api/v1/surveys/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
title
stringdoar citire
Titlu.
description
text | nulldoar citire
Descriere.
is_anonymous
booleandoar citire
Dacă răspunsurile sunt anonime.
is_mandatory
booleandoar citire
Dacă răspunsul este obligatoriu.
status
published | closeddoar citire
published sau closed.
opens_at
datetime | nulldoar citire
Când se deschide.
closes_at
datetime | nulldoar citire
Când se închide.
published_at
datetime | nulldoar citire
Când a fost publicat.
questions
arraydoar citire
Întrebările: id, tip (single, multiple, scale, text), text, obligatorie, variante.
results
objectdoar citire
Totaluri: hidden, sealed, responses, assigned, completed și, pe întrebare, câți au răspuns, numărul pe variantă sau pe valoare a scalei, media.
Răspunsurile la chestionarele nominale, câte un răspuns pe persoană cu ce a ales. Răspunsurile unui chestionar anonim nu se dau niciodată unul câte unul — doar totalurile, în /surveys.
Drepturi: survey_responses:read
Adrese
GET/api/v1/survey-responsesListă
GET/api/v1/survey-responses/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
stringdoar citire
Identificator (un UUID).
survey_id
integerdoar citire
Chestionarul.
employee_id
integerdoar citire
Cine a răspuns.
submitted_at
datetime | nulldoar citire
Când.
answers
arraydoar citire
Răspunsurile: întrebarea, varianta aleasă, valoarea (scală) sau textul.
Postările Social pentru toată compania (nu dintr-un grup), publicate. Le creează cel care a creat cheia: o postare sau, dacă poate face anunțuri, o știre, un anunț, o promoție sau un concurs; textul este simplu, cu un rând liber între paragrafe.
Drepturi: posts:read, posts:write
Adrese
GET/api/v1/postsListă
GET/api/v1/posts/{id}O înregistrare
POST/api/v1/postsCreare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
type
post | news | announcement | promotion | contestobligatoriu
post, news, announcement, promotion sau contest.
title
string | null
Titlu (opțional).
body
textobligatoriu
Textul (simplu, la citire).
author
string | nulldoar citire
Cine a scris-o.
comments_enabled
boolean
Dacă se pot face comentarii.
comments_count
integerdoar citire
Câte comentarii are.
published_at
datetime | null
Când se publică; un moment viitor o programează.
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Ultima modificare.
Filtre
type
post | news | announcement | promotion | contest
Doar acest tip.
Exemplu de cerere
POST https://compania-mea.harmoniq.ro/api/v1/posts
{
"type": "announcement",
"title": "Program de sărbători",
"body": "Între 24 și 26 decembrie programul este 9–14.",
"comments_enabled": true
}
Exemplu de răspuns
{
"data": {
"id": 120,
"type": "announcement",
"title": "Program de sărbători",
"body": "Între 24 și 26 decembrie programul este 9–14.",
"author": "Maria Matei",
"comments_enabled": true,
"comments_count": 3,
"published_at": "2026-05-01T08:00:00Z",
"created_at": "2026-05-01T08:00:00Z",
"updated_at": "2026-05-01T08:00:00Z"
}
}
Articole din baza de cunoștințe /knowledge-articles
Articolele publicate din baza de cunoștințe (proceduri, instrucțiuni), cu textul simplu, în limba cerută (Accept-Language) sau în limba companiei.
Oamenii pe care compania îi deservește — clienți și potențiali clienți. O adresă de email este unică în companie (a doua este refuzată). Acordul de marketing nu se scrie odată cu înregistrarea: se schimbă doar prin acțiunea consent, care îi păstrează istoricul (dat sau retras, cum, când, de cine). Acțiunea erase șterge datele persoanei la cererea ei și nu poate fi anulată: numele, emailul, telefonul, notele și ce s-a scris despre ea dispar, cifrele (cumpărări, valori ale oportunităților, note) rămân, iar înregistrarea nu mai poate fi modificată.
Drepturi: crm_contacts:read, crm_contacts:write
Adrese
GET/api/v1/crm-contactsListă
GET/api/v1/crm-contacts/{id}O înregistrare
POST/api/v1/crm-contactsCreare
PATCH/api/v1/crm-contacts/{id}Modificare
DELETE/api/v1/crm-contacts/{id}Ștergere
POST/api/v1/crm-contacts/{id}/consentÎnregistrează că persoana și-a dat sau și-a retras acordul de marketing, și cum.
POST/api/v1/crm-contacts/{id}/eraseȘterge datele persoanei la cererea ei (GDPR). Ireversibil.
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
first_name
string | null
Prenume.
last_name
string | null
Nume.
email
string | null
Adresa de email (unică în companie, păstrată cu litere mici).
phone
string | null
Telefon, așa cum a fost scris.
account_id
integer | null
Organizația din care face parte (vezi /crm-accounts).
job_title
string | null
Rolul său acolo.
city
string | null
Localitate.
country
string | null
Țara, cod ISO din două litere.
locale
string | null
Limba în care i se scrie (ro, en…).
status
lead | customer | inactive
lead (potențial), customer (client) sau inactive. O cumpărare sau o oportunitate câștigată face dintr-un potențial client un client.
De unde a venit: walk_in, website, phone, referral, campaign, event, partner sau other.
work_unit_id
integer | null
Unitatea (magazin, hotel, birou) care îl deservește; gol pentru niciuna.
owner_id
integer | null
Utilizatorul care se ocupă de el; cel care a creat cheia, dacă lipsește la creare.
tags
array
Etichete (litere mici, cel mult 20).
notes
text | null
Note.
marketing_consent
booleandoar citire
Dacă acceptă acum comunicări de marketing (doar citire — se schimbă prin acțiunea consent).
consent_updated_at
datetime | nulldoar citire
Când s-a schimbat ultima dată acordul.
last_activity_at
datetime | nulldoar citire
Când s-a făcut ultima dată ceva cu el.
erased_at
datetime | nulldoar citire
Când i-au fost șterse datele la cerere (înregistrarea e apoi doar de citit).
created_at
datetimedoar citire
Creat.
updated_at
datetimedoar citire
Modificat ultima dată.
Filtre
q
string
Nume, email sau telefon care conține textul.
email
string
Exact acest email (literele mari nu contează).
phone
string
Acest număr de telefon (se compară doar cifrele).
status
lead | customer | inactive
Doar cu această stare.
work_unit_id
integer
Doar ai acestei unități.
owner_id
integer
Doar ai acestui utilizator.
account_id
integer
Doar ai acestei organizații.
tag
string
Doar cu această etichetă.
consent
boolean
true: doar cei care acceptă marketing; false: doar cei care nu acceptă.
/api/v1/crm-contacts/{id}/consent: granted (boolean) — true: dat; false: retras.; channel (form | verbal | email | import | api | other) — Cum: form, verbal, email, import, api sau other (api, dacă lipsește).; note (string) — O notă (de exemplu unde se păstrează formularul).
Companiile și instituțiile cărora le vinde firma. Numele este unic în companie. Ștergerea uneia îi păstrează contactele și oportunitățile, fără legătură.
Drepturi: crm_accounts:read, crm_accounts:write
Adrese
GET/api/v1/crm-accountsListă
GET/api/v1/crm-accounts/{id}O înregistrare
POST/api/v1/crm-accountsCreare
PATCH/api/v1/crm-accounts/{id}Modificare
DELETE/api/v1/crm-accounts/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
name
stringobligatoriu
Denumire (unică în companie).
registration_number
string | null
Număr de înregistrare la Registrul Comerțului.
vat_number
string | null
Cod de TVA.
industry
string | null
Domeniu de activitate.
email
string | null
Adresa de email.
phone
string | null
Telefon.
website
string | null
Site.
address
string | null
Adresă.
city
string | null
Localitate.
country
string | null
Țara, cod ISO din două litere.
work_unit_id
integer | null
Unitatea (magazin, hotel, birou) care îl deservește; gol pentru niciuna.
owner_id
integer | null
Utilizatorul care se ocupă de el; cel care a creat cheia, dacă lipsește la creare.
Fluxurile prin care trec oportunitățile, cu etapele lor (configurate în aplicație). Fiecare companie are unul implicit. O etapă este în lucru (cu șansa ca o oportunitate de acolo să fie câștigată) sau închide oportunitatea ca fiind câștigată ori pierdută.
Drepturi: crm_pipelines:read
Adrese
GET/api/v1/crm-pipelinesListă
GET/api/v1/crm-pipelines/{id}O înregistrare
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
name
stringdoar citire
Denumire.
is_default
booleandoar citire
Dacă oportunitățile noi ajung aici când nu se indică un flux.
sort
integerdoar citire
Poziția în liste.
stages
arraydoar citire
Etapele, în ordine: id, name, kind (open, won sau lost), probability (0–100) și sort.
Vânzări, rezervări sau contracte în lucru într-un flux de vânzare. Fluxul și etapa se aleg la creare (prima etapă în lucru a fluxului implicit, dacă lipsesc); apoi o oportunitate își schimbă etapa doar prin move, win, lose și reopen. Starea urmează mereu etapa, iar closed_at se completează când este câștigată sau pierdută. O oportunitate câștigată face din contactul ei un client.
Drepturi: crm_deals:read, crm_deals:write
Adrese
GET/api/v1/crm-dealsListă
GET/api/v1/crm-deals/{id}O înregistrare
POST/api/v1/crm-dealsCreare
PATCH/api/v1/crm-deals/{id}Modificare
DELETE/api/v1/crm-deals/{id}Ștergere
POST/api/v1/crm-deals/{id}/moveMută oportunitatea în altă etapă (a fluxului ei sau a altuia — oportunitatea se mută odată cu ea).
POST/api/v1/crm-deals/{id}/winMarchează oportunitatea câștigată (etapa câștigată a fluxului).
POST/api/v1/crm-deals/{id}/loseMarchează oportunitatea pierdută (etapa pierdută a fluxului), cu motivul.
POST/api/v1/crm-deals/{id}/reopenReaduce o oportunitate încheiată în ultima etapă în lucru a fluxului.
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
title
stringobligatoriu
Ce se vinde.
pipeline_id
integer
Fluxul (vezi /crm-pipelines). Doar la creare.
stage_id
integer
Etapa. Doar la creare; apoi prin acțiuni.
status
open | won | lostdoar citire
open, won sau lost — tipul etapei.
contact_id
integer | null
Clientul (vezi /crm-contacts).
account_id
integer | null
Organizația (vezi /crm-accounts).
value
number | null
Cât valorează.
currency
string
Moneda valorii (cod ISO); moneda CRM a companiei, dacă lipsește.
Ce s-a făcut sau urmează să se facă cu clienții: apel, întâlnire, vizită, email, notă, sarcină și cumpărare. O sarcină așteaptă până este finalizată; orice altceva este făcut când se înregistrează (la done_at, dacă se trimite). O cumpărare are nevoie de sumă și face din contactul ei un client. O activitate a unei oportunități preia clientul, organizația și unitatea oportunității, dacă nu sunt trimise.
Ce au spus clienții: păreri (o notă de la 0 la 10 — cât de probabil ar recomanda firma — și/sau un comentariu) și reclamații. O părere are nevoie de o notă sau de un comentariu. O reclamație rămâne deschisă până este rezolvată, cu ce s-a făcut; poate fi redeschisă. Tipul se stabilește la creare.
Drepturi: crm_feedback:read, crm_feedback:write
Adrese
GET/api/v1/crm-feedbackListă
GET/api/v1/crm-feedback/{id}O înregistrare
POST/api/v1/crm-feedbackCreare
PATCH/api/v1/crm-feedback/{id}Modificare
DELETE/api/v1/crm-feedback/{id}Ștergere
POST/api/v1/crm-feedback/{id}/resolveRezolvă o reclamație, spunând ce s-a făcut.
POST/api/v1/crm-feedback/{id}/reopenRedeschide o reclamație rezolvată.
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
kind
feedback | complaintobligatoriu
feedback (părere) sau complaint (reclamație). Doar la creare.
Producătorii și brandurile ale căror campanii intră în spațiile de expunere și pe rafturile companiei: o singură listă pentru ambele module. Numele este unic în companie. Scrierea cere dreptul „Gestionează partenerii” pentru cel care a creat cheia.
Spații și expunere: tipurile de zone pe care compania le are în mai multe locații (o ramă click, un suport pe counter, un totem), cu dimensiunile și capacitatea lor obișnuite. Prețul lunar îl scrie doar cine vede sumele.
Spații și expunere: zonele fiecărei locații (unde sunt, cât de mari, cât încape pe fiecare față), doar în locațiile pe care cel care a creat cheia le amenajează. O zonă rămâne în locația ei. O zonă nouă de un anumit tip preia dimensiunile tipului pentru ce lipsește. Mai puține fețe sau mai puțin loc decât au nevoie campaniile ei în desfășurare sunt refuzate; o zonă cu campanii nu se poate șterge.
Drepturi: space_zones:read, space_zones:write
Adrese
GET/api/v1/space-zonesListă
GET/api/v1/space-zones/{id}O înregistrare
POST/api/v1/space-zonesCreare
PATCH/api/v1/space-zones/{id}Modificare
DELETE/api/v1/space-zones/{id}Ștergere
Câmpuri
Nume
Tip
Descriere
id
integerdoar citire
Identificator.
work_unit_id
integerobligatoriu
Locația (unitatea) — doar la creare.
zone_type_id
integer | null
Tipul zonei (vezi /space-zone-types), dacă are.
name
stringobligatoriu
Denumire (de exemplu „Totem dreapta ușii”).
description
text | null
Descriere.
width_cm
number | null
Lățime, în centimetri.
height_cm
number | null
Înălțime, în centimetri.
depth_cm
number | null
Adâncime, în centimetri.
area_m2
number | null
Suprafață, în metri pătrați.
faces
integer
Câte fețe are (1 sau 2).
capacity
integer
Câte materiale încap pe o față.
capacity_label
string | null
Ce numără capacitatea.
is_display
boolean
Dacă este spațiu de expunere.
monthly_price
number | null
Tariful pe lună (doar cine vede sumele îl scrie).
status
active | unavailable
active sau unavailable (temporar indisponibilă).
pin_x
number | nulldoar citire
Poziția pe schița locației, în procente de la stânga (se așază din aplicație).
Spațiu la raft: tipurile de mobilier (gondolă, capăt de raft, frigider) cu tariful — pe față de produs sau pe metru de raft, pe lună. Tarifele le scrie doar cine are dreptul la prețurile de la raft.
Spațiu la raft: planogramele descrise o dată — mobilierul, dimensiunile, rafturile de sus în jos, cu ce încape pe fiecare (fețe sau centimetri) și coeficientul lui de preț. Trimiterea câmpului shelves înlocuiește lista de rafturi; un raft pe care sunt campanii nu poate fi scos. Numele este unic.
Spațiu la raft: o planogramă amplasată într-o locație, cu eticheta, nota și costurile ei, doar în locațiile pe care cel care a creat cheia le amenajează. Ștergerea o scoate din locație: rămâne pentru istoricul campaniilor ei sau dispare dacă nu a avut niciuna; niciodată cât timp rulează o campanie pe ea. Costurile le scrie doar cine vede prețurile.
Campaniile ambelor module (module: spaces — zone de expunere; shelf — rafturi din planograme), scrise ca cel care a creat cheia. O campanie începe ca ciornă: locațiile (units) și regulile care numesc locurile din ele (rules) devin locurile ei. Acțiunea launch verifică locul și o trimite fiecărei locații, iar cancel o oprește. O campanie lansată își păstrează datele și locurile; se mai schimbă doar textul, partenerul, sumele și cererea de fotografii. Valoarea și costul le scrie doar cine vede sumele.
draft, scheduled (urmează), running (în desfășurare), ended sau cancelled.
units
array
Locațiile (id-uri de unități), împreună cu rules.
rules
array
Regulile care numesc locurile, împreună cu units. spaces: [{zone_type_id sau zone_id, face (A/B), quantity}]; shelf: [{planogram_id sau placement_id, position (raftul, de sus), quantity, products}].
targets
arraydoar citire
Locurile rezultate: pe locație, zona și fața sau amplasarea și raftul, cu cantitatea.
O campanie lansată, într-o locație: cine o pune și până când, dacă este pusă, refuzată (cu motivul), în curs de scoatere sau gata. Acțiunile se fac ca cel care a creat cheia (cine implementează acolo sau, pentru reopen, cine conduce campania). Fotografiile se trimit ca imagini în base64; o campanie care le cere nu se poate confirma fără ele.
/api/v1/merch-executions/{id}/confirm: photos (array) — Fotografii: [{name, content_base64}], JPEG/PNG/WebP, cel mult 10 MB fiecare, cel mult 10.; note (text) — Observații.
Acest site folosește doar cookie-urile de care are nevoie ca să funcționeze. Numărăm vizitele fără cookie-uri și fără să vă identificăm. Politica privind cookie-urile