API pentru dezvoltatori
Depozio expune un API REST server-to-server: magazinul tău trimite comenzile în depozit, citește stocul vandabil și statusul livrării, și primește webhook-uri când coletul pleacă. E același API pe care îl folosesc integrările noastre — nu o versiune redusă.
1. Adresa și autentificarea
Fiecare firmă are propriul subdomeniu, iar API-ul răspunde DOAR pe el:
https://<firma>.depozio.ro/api/v1
Autentificarea e un token Bearer, generat din panou: Setări → Sincronizare API → „Emite token nou”. Token-ul se vede o singură dată, la emitere. Îi alegi scope-urile și termenul de expirare (inclusiv „fără expirare”), iar data expirării se vede în tabelul de token-uri — nu moare nimic pe nespuse.
Scope-uri disponibile:
| Scope | Ce deschide |
|---|---|
| sync:products | Sincronizare produse |
| sync:orders | Comenzi (ingest + cancel) |
| sync:returns | Sincronizare retururi |
| sync:stock | Citire stoc |
| sync:gls | Citire puncte livrare GLS (ParcelShop/Locker) |
| sync:sameday | Citire easybox-uri Sameday |
2. Antete
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/json # pe POST
Idempotency-Key: <UUID v4> # opțional, recomandat pe POST
Idempotency-Key e un UUID per request (nu per comandă). Același key în
24 de ore întoarce exact răspunsul anterior, deci poți relua în siguranță după un timeout.
Două detalii care contează: se memorează doar răspunsurile 2xx (un retry după 422 cu payload
corectat se procesează normal), iar același key cu alt corp întoarce
409 idempotency_key_conflict.
3. Endpoint-uri
Comenzi
| POST | /webhooks/orders | Trimite o comandă în depozit. Idempotent pe `site_order_id`. | sync:orders |
| POST | /webhooks/orders/cancel | Cere anularea unei comenzi care nu a plecat încă. | sync:orders |
| GET | /sync/orders/{site_order_id} | Statusul comenzii + AWB-ul și curierul real. | sync:orders |
Produse
| POST | /sync/products | Creează/actualizează produse după SKU. | sync:products |
| POST | /sync/products/{sku}/deactivate | Scoate un SKU din vânzare (stocul rămâne). | sync:products |
| POST | /sync/products/deactivate | Aceeași operație, cu SKU-ul în corp. | sync:products |
Stoc
| GET | /sync/stock | Stocul vandabil pe SKU (fără carantină, retur, locații inactive). | sync:stock |
Retururi
| POST | /sync/returns | Anunță un retur inițiat de client. | sync:returns |
Puncte de livrare
| GET | /gls/delivery-points | ParcelShop-uri și lockere GLS, pentru selectorul din checkout. | sync:gls |
| GET | /sameday/delivery-points | Easybox-uri Sameday. | sync:sameday |
Formatul complet al fiecărui corp (câmpuri, validări, exemple) e în specificația pe care ți-o trimitem la cerere — scrie-ne de pe pagina de contact.
4. Webhook-uri către tine
Configurezi o adresă HTTPS în panou, iar Depozio îți trimite acolo un POST semnat (HMAC-SHA256 pe corpul brut, în antetul de semnătură) la fiecare eveniment:
- order.status_changed
- order.shipped
- order.delivered
- order.returned
- return.status_changed
- stock.threshold_alert
- stock.insufficient
- order.blocked
Livrările se reîncearcă, iar fiecare încercare se vede în panou, cu răspunsul primit — deci un webhook picat nu e o presupunere, e un rând pe care îl poți retrimite.
5. Erori
Orice eroare are aceeași formă, cu un cod stabil pe care poți ramifica:
{
"status": "error",
"error": "validation_failed",
"message": "...",
"errors": { "items.0.sku": ["..."] }
}
Coduri uzuale: unauthenticated,
missing_ability,
validation_failed,
missing_skus,
order_not_found,
order_in_progress,
rate_limited,
tenant_suspended.
Mesajele sunt în engleză și sunt pentru dezvoltator, nu pentru utilizatorul final.
6. Versionare, stabilitate, CORS
API-ul e server-to-server: token-ul nu are ce căuta într-un browser, deci nu publicăm antete CORS pentru terți. Cheamă-l din backend-ul tău.
Versiunea trăiește în cale (/api/v1). Ne angajăm ca
v1 să rămână stabil cel puțin 12 luni după anunțul unei versiuni noi.
Adăugăm câmpuri fără preaviz — clientul tău trebuie să ignore ce nu cunoaște —, dar nu
ștergem și nu schimbăm sensul unui câmp existent în v1. Când ceva intră în retragere,
răspunsurile poartă antetele Deprecation și
Sunset, deci o poți vedea din cod, nu dintr-un email.
7. Limite
Cererile cu token valid intră pe limita standard per token; cele fără token au o limită mai
strânsă, per IP. La depășire primești 429 rate_limited
cu antetul Retry-After — respectă-l, nu relua imediat.
Cum începi
- Deschizi un cont (sau ceri acces la cel al firmei).
- Emiți un token din Setări → Sincronizare API, cu scope-urile de care ai nevoie.
- Sincronizezi catalogul de produse — o comandă cu un SKU necunoscut e respinsă.
- Trimiți prima comandă pe
/webhooks/orders.