Urmărire publică
Endpoint-uri publice, fără autentificare, care alimentează pagina de status pe care o vede clientul pentru comanda lui. Nu se trimite niciun Bearer token — autorizarea se face exclusiv prin tracking_token-ul de 40 de caractere generat la crearea comenzii.
Fără prefix de versiune
Aceste căi sunt sub /api/track/..., nu sub /api/v1. Tenantul este rezolvat din token prin indexul central, nu din subdomeniu sau din cheia API.
Payload-ul este deliberat filtrat: doar prenumele clientului, numărul mascat de înmatriculare și cronologia de status. Nu expune adresa, numele de familie, notele interne, costurile sau identitatea mecanicului.
În plus, modulul public_tracking trebuie să fie activ pe tenant; altfel răspunsul este 404.
Endpoint-uri
| Metodă | Cale | Descriere |
|---|---|---|
| GET | /api/track/{token} | Statusul comenzii (JSON public filtrat). |
| GET | /api/track/{token}/estimate/{estimate} | Devizul, pentru pagina de aprobare. |
| POST | /api/track/{token}/estimate/{estimate}/respond | Trimite deciziile clientului pe liniile devizului. |
| POST | /api/track/{token}/inspection/{inspection}/acknowledge | Clientul confirmă o inspecție finalizată. |
{token} trebuie să fie 40 de caractere alfanumerice; {estimate} și {inspection} sunt numerice.
Status comandă
curl https://tenant.notsowms.ro/api/track/f3a9c1e8b2d74a6f90c5e1d8a7b4c2f0e9d6a3b1Răspuns 200:
{
"shop": { "name": "Moto Service SRL", "locale": "ro" },
"work_order": {
"number": "WO-2026-000142",
"status": "in_progress",
"status_label": "În lucru",
"intake_date": "2026-05-25T09:30:00+00:00",
"promise_date": "2026-05-28T00:00:00+00:00",
"last_update_at": "2026-05-25T11:05:00+00:00",
"customer_first_name": "Andrei",
"vehicle": {
"make": "Yamaha",
"model": "MT-07",
"model_year": 2024,
"plate_masked": "B1•••••"
}
},
"timeline": [
{ "at": "2026-05-25T09:30:00+00:00", "status": "received", "label": "Primit" },
{ "at": "2026-05-25T11:05:00+00:00", "status": "in_progress", "label": "În lucru" }
],
"notes_to_customer": [
{ "at": "2026-05-25T11:05:00+00:00", "text": "Am început lucrul, vă anunțăm la finalizare." }
],
"inspection_summary": {
"inspection_id": 333,
"result": "advise",
"fail_count": 0,
"advise_count": 2,
"acknowledged": false
}
}status_label și etichetele din timeline sunt traduse în limba tenantului. inspection_summary este null cât timp nu există o inspecție finalizată. plate_masked păstrează doar primele 2 caractere.
Erori: 404 dacă token-ul este necunoscut, tenantul e suspendat sau modulul e inactiv; 410 dacă link-ul de urmărire a fost revocat sau a expirat.
Deviz — aprobare
Pagina de aprobare cere, pe lângă token-ul de urmărire, și approval_token-ul devizului (generat la trimiterea devizului).
curl "https://tenant.notsowms.ro/api/track/f3a9.../estimate/555?approval_token=ab12cd34..."Răspuns 200:
{
"estimate": {
"id": 555,
"version": 1,
"status": "sent",
"currency": "RON",
"subtotal_cents": 52000,
"tax_cents": 9880,
"total_cents": 61880,
"deposit_required_cents": 20000,
"valid_until": "2026-06-25",
"customer_message": "Devizul pentru revizia de 10.000 km.",
"lines": [
{ "id": 1, "line_type": "labor", "description": "Manoperă revizie", "quantity": 1, "total_cents": 30000, "tax_cents": 5700, "customer_decision": "pending" },
{ "id": 2, "line_type": "part", "description": "Set plăcuțe frână față", "quantity": 1, "total_cents": 22000, "tax_cents": 4180, "customer_decision": "pending" }
]
}
}Erori: 403 dacă approval_token lipsește sau nu corespunde; 404 dacă devizul nu aparține comenzii din token.
Trimiterea deciziilor
curl -X POST https://tenant.notsowms.ro/api/track/f3a9.../estimate/555/respond \
-H "Content-Type: application/json" \
-d '{
"approval_token": "ab12cd34...",
"decisions": [
{ "line_id": 1, "decision": "approved" },
{ "line_id": 2, "decision": "declined" }
]
}'| Câmp | Tip | Obligatoriu | Note |
|---|---|---|---|
approval_token | string | da | Token-ul devizului. |
decisions | array | da | Minim 1 element. |
decisions[].line_id | integer | da | Id-ul liniei de deviz. |
decisions[].decision | enum | da | approved | declined | deferred. |
Deciziile sunt înregistrate cu responded_via = tap_link, status-ul devizului se recalculează, iar răspunsul include status-ul rezultat plus devizul actualizat:
{ "status": "partially_approved", "estimate": { /* … */ } }Inspecție — confirmare
curl -X POST https://tenant.notsowms.ro/api/track/f3a9.../inspection/333/acknowledgeMarchează inspecția finalizată drept confirmată de client (setează customer_acknowledged_at dacă nu e deja setat). Răspuns 200:
{ "acknowledged_at": "2026-05-25T12:00:00+00:00" }Erori: 404 dacă inspecția nu aparține comenzii din token.