Documentația completă a API-ului Shipo: autentificare, endpoint-uri, parametri, exemple de cod și răspunsuri. Integrează platforma în aplicația ta și automatizează expedierea coletelor.
Aici sunt listate modificările importante ale API-ului. Verifică această secțiune înainte de a face actualizări la integrarea ta. Modificările marcate Acțiune necesară pot cere schimbări în integrarea ta.
sender), cât și cele de livrare (recipient), pot fi acum listate, citite, create, modificate și șterse direct prin API, fără să intri pe site. GET /client/address le listează paginat, cu filtrul opțional party. PATCH /client/address/{id} modifică doar câmpurile trimise. O adresă de ridicare poate fi marcată ca implicită cu is_default. ID-urile se trimit în POST /shipment ca sender_address_id (ridicare) sau recipient_address_id (livrare), la serviciile cu adresă. Atenție: aceste endpoint-uri răspund la erorile de validare cu codul HTTP 422, nu cu 200 ca endpoint-urile mai vechi.GET /client/address_list funcționează în continuare, dar va fi eliminat în curând. Trece integrarea pe GET /client/address?party=sender, care returnează aceleași adrese de ridicare. Fiecare adresă are aceleași câmpuri de adresă (id, alias, name, company_name, phone, email și câmpurile address_*), plus is_default (adresa de ridicare implicită), complete (dacă adresa poate fi folosită într-o expediere) și full_address (adresa pe un singur rând). Sectorul vine ca număr (3), nu ca text ("Sectorul 3"). Câmpurile interne, de exemplu client_id sau courier_id, nu mai sunt incluse. Lista nu mai vine direct ca răspuns: adresele sunt în câmpul data, alături de pagination (implicit 100 de adrese pe pagină, maxim 500 cu per_page).sender_address_type locker sau pudo), pe lângă sender_address_id (ID-ul punctului din /points) trebuie trimise și câmpurile de adresă ale expeditorului: orașul (sender_address_city sau sender_address_city_id), strada (sender_address_street sau sender_address_street_id), numărul (sender_address_street_no) și, pentru București, sectorul (sender_address_sector). Coletul care nu poate fi livrat se returnează la această adresă. La Sameday, coletul se întoarce mai întâi în easybox-ul în care a fost predat și ajunge la adresă doar dacă nu este ridicat de acolo la timp. Fără aceste câmpuri, POST /shipment răspunde cu Validation failed. Serviciile cu ridicare de la adresă nu sunt afectate.sender_address_type locker sau pudo), pe lângă sender_address_id (ID-ul punctului din /points) trebuie trimise acum și câmpurile de adresă ale expeditorului: orașul (sender_address_city sau sender_address_city_id), strada (sender_address_street sau sender_address_street_id), numărul (sender_address_street_no) și, pentru București, sectorul (sender_address_sector). Dacă expedierea nu poate fi livrată, coletul se returnează la această adresă. Anterior aceste câmpuri erau cerute doar la FAN Courier. Fără ele, POST /shipment răspunde cu Validation failed. Serviciile cu ridicare de la adresă nu sunt afectate.ş ţ Ş Ţ, pe langa cele cu virgula ș ț Ș Ț. Anterior un nume ca Ştefan era refuzat cu eroarea invalid characters. La salvare si la trimiterea catre curier ele sunt transformate in forma corecta cu virgula, deci Ştefan apare in expediere ca Ștefan. Nu este nevoie de nicio modificare in integrarea ta.POST /shipment nu mai trimite automat expedierea catre curier daca esti client cu plata la termen si creditul disponibil nu acopera costul ei. Anterior expedierea pleca oricum, iar contul putea depasi limita de credit. Acum expedierea este salvata, iar raspunsul este 402 cu success: false si id-ul expedierii. Dupa achitarea soldului o poti trimite cu POST /shipment/send/{id}, fara sa o creezi din nou. Verifica in integrarea ta codul de raspuns, nu doar prezenta AWB-ului.insurance, open_on_delivery, notify_recipient și quick_cod trimise ca text ("false", "true") sunt acum interpretate corect. Anterior, "false" era tratat ca activat, deci se puteau factura servicii nedorite (asigurare, deschidere la livrare) și se putea trimite SMS către destinatar. Dacă integrarea ta trimitea aceste valori ca text, costul expedierilor se poate modifica. Verifică ce trimite. Valori acceptate: true, false, 1, 0, "1", "0", "true", "false"; orice altceva este respins la validare.GET /points, care returnează punctele de ridicare valabile pentru un tarif (rate_id), cu filtrare după localitate, județ, text liber sau coordonate. ID-ul returnat se trimite ca recipient_address_id (livrare în locker) sau sender_address_id (ridicare din locker). Atenție: pentru serviciile la adresă aceleași câmpuri primesc ID-ul unei adrese salvate, nu ID-ul unui punct. Documentația a fost clarificată în acest sens./client/address_list returnează acum întotdeauna o listă, conform documentației. Anterior, dacă existau adrese salvate, răspunsul era un obiect indexat după id ({"7": {...}}) în loc de [{...}], ceea ce putea genera erori în integrări. În plus, adresele care conțin caractere stocate greșit nu mai duc la un răspuns gol.quick_cod la request-ul /shipment, care activează rambursul rapid (Turbo) și taxează conform tarifului standard sau personalizat al contului. Se aplică doar dacă expedierea are cod > 0.auth-key în loc de auth_key. Actualizează integrarea pentru a folosi auth-key (cu cratimă) la request-ul /auth.API-ul Shipo permite integrarea programatică cu platforma noastră de expediții. Prin intermediul acestui API poți crea expedieri, calcula tarife, gestiona adrese și urmări colete.
https://api.shipo.ro/
API-ul folosește autentificare în doi pași:
auth-key) prin endpoint-ul /authAuthorization pentru toate celelalte request-uriToate răspunsurile sunt în format JSON. Răspunsurile de succes includ de obicei un câmp success: true, iar erorile includ un câmp message cu detalii despre eroare.
| Cod | Descriere |
|---|---|
| 200 | Request procesat cu succes |
| 201 | Resursă creată (de exemplu o adresă salvată, prin POST /client/address) |
| 400 | Request invalid (date lipsă sau incorecte) |
| 401 | Neautorizat (token lipsă sau invalid) |
| 403 | Acces interzis (cheie API invalidă) |
| 404 | Resursa cerută nu există (de exemplu o adresă salvată cu un ID necunoscut) |
| 405 | Metodă HTTP nepermisă |
| 422 | Date invalide, cu lista erorilor în errors. Îl folosesc doar endpoint-urile /client/address; celelalte răspund la erorile de validare cu 200 și success: false |
| 500 | Eroare internă server |
Pentru a accesa API-ul, trebuie mai întâi să obții un token de acces. Cheia API o poți genera din Setări → API.
Trimite cheia ta API în header-ul auth-key pentru a primi un token de acces valid 1 oră.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
auth-key |
string | Da | Cheia ta de autentificare API, generată din setări |
// Obține access token
fetch("https://api.shipo.ro/auth", {
method: "POST",
headers: {
"auth-key": "CHEIA_TA_API"
}
})
.then(response => response.json())
.then(data => {
console.log("Access Token:", data.access_token);
console.log("Expiră în:", data.expires_in, "secunde");
});
$ch = curl_init("https://api.shipo.ro/auth");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"auth-key: CHEIA_TA_API"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $response["access_token"];
echo $response["expires_in"]; // 3600 secunde
{
"access_token": "eyJhbGciOiJIUzI1NiIsIn...",
"expires_in": 3600
}
{ "error": "Unauthorized" }
{ "error": "Invalid auth-key" }
Authorization la fiecare request:Authorization: Bearer TOKEN_PRIMIT
Endpoint-uri pentru informațiile contului tău și pentru gestionarea adreselor salvate, de ridicare și de livrare.
Returnează informațiile de bază ale contului tău.
fetch("https://api.shipo.ro/client", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/client");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"id": 123,
"billing_type": "prepaid",
"name": "Ion Popescu",
"email": "[email protected]",
"status": "active",
"coord": [26.1027200000, 44.4361410000]
}
| Câmp | Tip | Descriere |
|---|---|---|
id | integer | ID-ul unic al clientului |
billing_type | string | Tipul de facturare: prepaid sau postpaid |
name | string | Numele clientului |
email | string | Email-ul clientului |
status | string | Statusul contului |
coord | array | Coordonatele implicite [longitudine, latitudine] |
client/address, descrise mai jos. GET /client/address?party=sender returnează aceleași adrese de ridicare, cu paginare, plus is_default, complete și full_address. Adresele sunt în câmpul data al răspunsului, iar sectorul vine ca număr.Returnează lista tuturor adreselor de ridicare (sender) asociate contului tău. Folosește id-ul adresei ca sender_address_id la crearea expedierilor.
fetch("https://api.shipo.ro/client/address_list", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/client/address_list");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
[
{
"id": 1,
"client_id": 123,
"party": "sender",
"alias": "Sediu",
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"phone": "0712345678",
"address_city_id": 16404,
"address_street_id": 5001,
"address_street_no": "10"
}
]
Returnează paginat adresele salvate ale contului tău, cele mai noi primele: adresele de ridicare (party: "sender") și adresele de livrare (party: "recipient"). Folosește id-ul unei adrese de ridicare ca sender_address_id, iar pe cel al unei adrese de livrare ca recipient_address_id în POST /shipment, la serviciile cu ridicare sau livrare la adresă. POST /shipment este disponibil conturilor cu plată la termen (postpaid).
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
party | string | Nu | sender (doar adresele de ridicare) sau recipient (doar adresele de livrare). Fără el primești ambele tipuri |
page_no | integer | Nu | Numărul paginii (default 1, min 1, max 100000) |
per_page | integer | Nu | Adrese per pagină (default 100, min 1, max 500) |
Lista conține doar adresele stradale salvate în cont, aceleași ca pe pagina Adrese din contul tău. Adresele de facturare nu sunt incluse.
// Adresele de ridicare, prima pagină
fetch("https://api.shipo.ro/client/address?party=sender&page_no=1&per_page=100", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => {
console.log("Total adrese:", data.pagination.total);
data.data.forEach(address => console.log(address.id, address.full_address));
});
// Adresele de livrare
// /client/address?party=recipient
$query = http_build_query([
"party" => "sender",
"page_no" => 1,
"per_page" => 100,
]);
$ch = curl_init("https://api.shipo.ro/client/address?" . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($response["data"] as $address) {
echo $address["id"] . " " . $address["full_address"] . PHP_EOL;
}
{
"success": true,
"pagination": {
"page": 1,
"per_page": 100,
"total": 1,
"total_pages": 1
},
"data": [
{
"id": 501,
"party": "sender",
"alias": "Depozit",
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"phone": "0712345678",
"email": "[email protected]",
"address_city_id": 16404,
"address_city": "BUCURESTI",
"address_county": "BUCURESTI",
"address_municipality": "",
"address_sector": 6,
"address_street_id": null,
"address_street": "Estacadei",
"address_street_type": "Strada",
"address_street_no": "15",
"address_building": "P41",
"address_entrance": "4",
"address_floor": "1",
"address_apartment": "53",
"address_postal_code": "062225",
"address_note": "",
"full_address": "Strada Estacadei, Nr. 15, Bl. P41, Sc. 4, Et. 1, Ap. 53, Sectorul 6, Bucuresti, Bucuresti, 062225",
"is_default": true,
"complete": true,
"added_on": "2026-10-13 10:15:00",
"modified_on": "2026-10-13 10:15:00"
}
]
}
| Câmp | Tip | Descriere |
|---|---|---|
success | boolean | Dacă operația a reușit |
pagination.page | integer | Pagina curentă |
pagination.per_page | integer | Adrese per pagină |
pagination.total | integer | Total adrese pentru filtrul ales |
pagination.total_pages | integer | Total pagini (0 dacă nu există adrese) |
data | array | Adresele, cele mai noi primele. Fiecare are câmpurile descrise la GET /client/address/{id} |
{
"success": false,
"message": "Validation failed",
"errors": [
{
"field": "per_page",
"code": "invalid_per_page",
"message": "per_page must be a whole number from 1 to 500."
}
]
}
Returnează o adresă salvată a contului tău, după ID. O adresă care nu există, o adresă a altui cont sau un ID care nu este un număr primesc același răspuns 404.
fetch("https://api.shipo.ro/client/address/502", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/client/address/502");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200 sau 404
curl_close($ch);
print_r($response);
{
"success": true,
"data": {
"id": 502,
"party": "recipient",
"name": "Maria Ionescu",
"company_name": "",
"phone": "0723456789",
"email": "[email protected]",
"address_city_id": 2989,
"address_city": "Cluj-Napoca",
"address_county": "Cluj",
"address_municipality": "",
"address_sector": null,
"address_street_id": 111689,
"address_street": "Clabucet",
"address_street_type": "Aleea",
"address_street_no": "8",
"address_building": "P1",
"address_entrance": "2",
"address_floor": "",
"address_apartment": "74",
"address_postal_code": "400537",
"address_note": "",
"full_address": "Aleea Clabucet, Nr. 8, Bl. P1, Sc. 2, Ap. 74, Cluj-Napoca, Cluj, 400537",
"complete": true,
"added_on": "2026-10-13 10:20:00",
"modified_on": "2026-10-13 10:20:00"
}
}
data)| Câmp | Tip | Descriere |
|---|---|---|
id | integer | ID-ul adresei. Se trimite ca sender_address_id (ridicare) sau recipient_address_id (livrare) în POST /shipment |
party | string | sender (adresă de ridicare) sau recipient (adresă de livrare) |
alias | string | Numele adresei în cont. Doar la adresele de ridicare |
name | string | Persoana de contact |
company_name | string | Companie (gol la persoane fizice) |
phone | string | Telefon |
email | string | Email. La adresele de ridicare este emailul contului |
address_city_id | integer|null | ID-ul orașului |
address_city | string | Orașul |
address_county | string | Județul |
address_municipality | string | Comuna sau municipiul, completat doar când deosebește localități cu același nume |
address_sector | integer|null | Sectorul (1-6) la București, null în rest |
address_street_id | integer|null | ID-ul străzii, null când strada a fost trimisă ca text |
address_street | string | Numele străzii, fără tip |
address_street_type | string | Tipul străzii (Strada, Bulevardul, Aleea etc.) |
address_street_no | string | Număr |
address_building | string | Bloc |
address_entrance | string | Scara |
address_floor | string | Etaj |
address_apartment | string | Apartament |
address_postal_code | string | Cod poștal |
address_note | string | Observații adresă |
full_address | string | Adresa completă pe un singur rând |
is_default | boolean | Dacă este adresa de ridicare implicită a contului. Doar la adresele de ridicare |
complete | boolean | Dacă adresa are toate datele cerute de POST /shipment. O adresă cu false este refuzată ca sender_address_id sau recipient_address_id până când o completezi cu PATCH |
added_on | string | Data creării (YYYY-MM-DD HH:MM:SS) |
modified_on | string | Data ultimei modificări (YYYY-MM-DD HH:MM:SS) |
{
"success": false,
"message": "Address not found"
}
Salvează în cont o adresă de ridicare (party: "sender") sau de livrare (party: "recipient"). Adresa trece prin aceleași verificări ca pe pagina Adrese din contul tău și prin limitele de lungime ale curierilor, deci poate fi folosită direct în POST /shipment. Răspunsul este 201 cu adresa salvată. Nu se verifică dacă adresa există deja, deci un request repetat pentru o adresă de livrare creează o a doua adresă (la adresele de ridicare, un alias repetat este refuzat).
| Câmp | Tip | Ridicare (sender) | Livrare (recipient) | Descriere |
|---|---|---|---|---|
party | string | Da | Da | sender pentru o adresă de ridicare, recipient pentru o adresă de livrare. Nu se mai poate schimba după creare |
alias | string | Da | Nu se acceptă | Numele adresei în cont, de exemplu Depozit (max. 20 car.). Unic printre adresele de ridicare ale contului, fără diferență între litere mari și mici |
name | string | Da | Da | Persoana de contact, prenume și nume (max. 48 car.) |
company_name | string | Nu | Nu | Companie (max. 35 car.). Completat înseamnă adresă de firmă, gol înseamnă persoană fizică |
phone | integer|string | Da | Da | Telefon valid (max. 20 car.) |
email | string | Ignorat | Nu | Email (max. 80 car.). La adresele de ridicare se folosește mereu emailul contului, iar valoarea trimisă este ignorată |
address_city_id | integer | Condiționat | Condiționat | ID-ul orașului (din /city), sau address_city. Are prioritate față de address_city |
address_city | string | Condiționat | Condiționat | Orașul ca text (max. 100 car.), dacă nu trimiți address_city_id. Se trimite împreună cu address_county |
address_county | string | Condiționat | Condiționat | Județul. Obligatoriu alături de address_city, cu excepția Bucureștiului |
address_municipality | string | Nu | Nu | Comuna sau municipiul. Necesar doar când în același județ există mai multe localități cu același nume |
address_sector | integer|string | Condiționat | Condiționat | Sectorul 1-6, ca număr (3) sau ca text ("Sectorul 3", "Sector 3"). Obligatoriu pentru București, ignorat la celelalte orașe |
address_street_id | integer | Condiționat | Condiționat | ID-ul străzii returnat de căutarea de străzi /address (câmpul system_id), sau address_street. Are prioritate față de text și trebuie să fie o stradă din orașul adresei |
address_street | string | Condiționat | Condiționat | Strada ca text, dacă nu trimiți address_street_id. Tipul și numele străzii au împreună max. 48 car. |
address_street_type | string | Nu | Nu | Tipul străzii (Strada, Bulevardul, Calea etc.), folosit doar cu address_street. Dacă lipsește, tipul este separat automat din text ("Strada Florilor" devine tipul Strada și numele Florilor) |
address_street_no | integer|string | Da | Da | Numărul (max. 10 car.): litere, cifre, spațiu sau cratimă, cu cel puțin o literă sau cifră |
address_building | integer|string | Nu | Nu | Bloc (max. 10 car.: litere, cifre, spațiu sau cratimă) |
address_entrance | integer|string | Nu | Nu | Scara (max. 5 car., aceleași caractere ca la bloc) |
address_floor | integer|string | Nu | Nu | Etaj (max. 5 car., aceleași caractere ca la bloc) |
address_apartment | integer|string | Nu | Nu | Apartament (max. 5 car., aceleași caractere ca la bloc) |
address_postal_code | integer|string | Nu | Nu | Cod poștal, exact 6 cifre. Dacă lipsește, este completat automat după stradă și oraș |
address_note | string | Nu | Nu | Observații adresă (max. 40 car.) |
is_default | boolean | Nu | Nu se acceptă | true face din adresă adresa de ridicare implicită a contului. Valori acceptate: true, false, 1, 0, "1", "0", "true", "false" |
address_city_id (din /city), fie address_city împreună cu address_county. Dacă în același județ există mai multe localități cu același nume, adaugă address_municipality sau trimite address_city_id; altfel adresa este refuzată pe address_city, ca să nu fie salvată într-o localitate greșită. Pentru București trimite doar address_city: "Bucuresti", fără județ (sunt acceptate și București și Bucharest).address_street_id, ID-ul returnat de căutarea de străzi /address (câmpul system_id), fie strada ca text în address_street, cu address_street_type opțional.address_sector este obligatoriu, ca număr de la 1 la 6 sau ca text "Sectorul N". În răspuns sectorul vine ca număr.address_postal_code, este completat automat după stradă și oraș.alias este obligatoriu și trebuie să fie unic în cont, iar emailul este mereu cel al contului. alias și is_default nu se trimit pentru adresele de livrare.POST /shipment o folosește când request-ul nu are expeditor. Cu is_default: true adresa nouă devine implicită. Fără is_default, prima adresă de ridicare devine implicită dacă în acel moment contul nu are una.fetch("https://api.shipo.ro/client/address", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
party: "sender",
alias: "Depozit",
name: "Ion Popescu",
company_name: "SC Exemplu SRL",
phone: "0712345678",
address_city: "Bucuresti",
address_sector: 6,
address_street: "Strada Estacadei",
address_street_no: "15",
address_building: "P41",
address_entrance: "4",
address_floor: "1",
address_apartment: "53",
is_default: true
})
})
.then(response => response.json().then(data => ({ status: response.status, data })))
.then(({ status, data }) => {
if (status === 201) {
console.log("Adresă salvată, ID:", data.data.id);
} else {
console.log("Erori:", data.errors);
}
});
$ch = curl_init("https://api.shipo.ro/client/address");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"party" => "sender",
"alias" => "Depozit",
"name" => "Ion Popescu",
"company_name" => "SC Exemplu SRL",
"phone" => "0712345678",
"address_city" => "Bucuresti",
"address_sector" => 6,
"address_street" => "Strada Estacadei",
"address_street_no" => "15",
"address_building" => "P41",
"address_entrance" => "4",
"address_floor" => "1",
"address_apartment" => "53",
"is_default" => true
])
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 201 la succes, 422 la erori de validare
curl_close($ch);
if ($status === 201) {
echo $response["data"]["id"];
} else {
print_r($response["errors"]);
}
{
"party": "recipient",
"name": "Maria Ionescu",
"phone": "0723456789",
"email": "[email protected]",
"address_city_id": 2989,
"address_street_id": 111689,
"address_street_no": "8",
"address_building": "P1",
"address_entrance": "2",
"address_apartment": "74"
}
{
"success": true,
"data": {
"id": 501,
"party": "sender",
"alias": "Depozit",
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"phone": "0712345678",
"email": "[email protected]",
"address_city_id": 16404,
"address_city": "BUCURESTI",
"address_county": "BUCURESTI",
"address_municipality": "",
"address_sector": 6,
"address_street_id": null,
"address_street": "Estacadei",
"address_street_type": "Strada",
"address_street_no": "15",
"address_building": "P41",
"address_entrance": "4",
"address_floor": "1",
"address_apartment": "53",
"address_postal_code": "062225",
"address_note": "",
"full_address": "Strada Estacadei, Nr. 15, Bl. P41, Sc. 4, Et. 1, Ap. 53, Sectorul 6, Bucuresti, Bucuresti, 062225",
"is_default": true,
"complete": true,
"added_on": "2026-10-13 10:15:00",
"modified_on": "2026-10-13 10:15:00"
}
}
Câmpurile din data sunt descrise la GET /client/address/{id}.
{
"success": false,
"message": "Validation failed",
"errors": [
{
"field": "phone",
"code": "invalid_phone",
"message": "Field 'phone' must be a valid phone number."
},
{
"field": "address_sector",
"code": "sector_required",
"message": "address_sector (1 to 6) is required for Bucuresti."
}
]
}
Toate câmpurile greșite apar în același răspuns, în errors. Fiecare eroare are câmpul (field), un cod (code) pe care îl poți folosi în integrare și un mesaj în engleză (message). Alte coduri posibile, de exemplu: required, duplicate_alias, county_required, city_not_found, city_ambiguous, street_not_in_city, invalid_street_id, street_too_long, invalid_sector, not_allowed, unknown_field. Un body care nu este un obiect JSON primește 400.
Modifică o adresă salvată, câmp cu câmp. Trimite doar câmpurile care se schimbă; cele pe care nu le trimiți își păstrează valorile. Câmpurile și limitele sunt cele de la POST /client/address, dar la modificare niciunul nu este obligatoriu. Răspunsul este 200 cu adresa după modificare.
| Situație | Ce se întâmplă |
|---|---|
| Câmp netrimis | Își păstrează valoarea |
| Câmp trimis cu valoarea actuală | Nu este modificat și nici verificat din nou. Poți citi adresa cu GET, schimba un câmp și trimite tot obiectul înapoi |
Câmp trimis cu null sau "" | Golește un câmp opțional. Un câmp obligatoriu nu poate fi golit (422). Golirea lui company_name face din adresă una de persoană fizică |
Orașul (address_city_id, address_city, address_county, address_municipality) | Se trimite ca un tot: dacă schimbi oricare dintre ele, orașul este înlocuit cu ce ai trimis. Strada trebuie trimisă din nou în același request, altfel primești 422 pe address_street. Dacă noul oraș este București și nu trimiți sector, rămâne sectorul existent (iar dacă adresa nu are sector, primești 422 pe address_sector); la alte orașe sectorul se golește |
Strada (address_street_id, address_street, address_street_type) | Se trimite tot ca un tot: dacă schimbi oricare dintre ele, strada este înlocuită cu ce ai trimis |
| Codul poștal | Dacă se schimbă orașul sau strada și nu trimiți address_postal_code, codul poștal este recalculat |
party | Nu se poate schimba. Aceeași valoare este ignorată, o valoare diferită primește 422 |
is_default | true face din adresă adresa de ridicare implicită. false anulează alegerea doar dacă adresa este cea implicită; contul rămâne atunci fără adresă implicită |
Câmpuri doar pentru citire (id, full_address, complete, added_on, modified_on, address_type) | Pot fi trimise înapoi așa cum le-ai primit de la GET și sunt ignorate. La adresele de ridicare, email este ignorat |
| Câmp necunoscut | Refuzat cu 422 și codul unknown_field, ca o greșeală de scriere să nu fie ignorată fără să afli |
Body gol ({}) | Nu schimbă nimic și returnează adresa |
Sunt verificate doar câmpurile pe care le schimbi. O adresă mai veche care nu respectă regulile actuale (de exemplu un etaj mai lung de 5 caractere) poate fi modificată în continuare; câmpurile pe care nu le atingi sunt păstrate exact cum erau.
fetch("https://api.shipo.ro/client/address/501", {
method: "PATCH",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
phone: "0722111222",
is_default: true
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/client/address/501");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"phone" => "0722111222",
"is_default" => true
])
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200, 404 sau 422
curl_close($ch);
print_r($response);
{
"address_city": "Cluj-Napoca",
"address_county": "Cluj",
"address_street": "Aleea Clabucet",
"address_street_no": "8"
}
{
"address_note": null
}
{
"success": true,
"data": {
"id": 501,
"party": "sender",
"alias": "Depozit",
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"phone": "0722111222",
"email": "[email protected]",
"address_city_id": 16404,
"address_city": "BUCURESTI",
"address_county": "BUCURESTI",
"address_municipality": "",
"address_sector": 6,
"address_street_id": null,
"address_street": "Estacadei",
"address_street_type": "Strada",
"address_street_no": "15",
"address_building": "P41",
"address_entrance": "4",
"address_floor": "1",
"address_apartment": "53",
"address_postal_code": "062225",
"address_note": "",
"full_address": "Strada Estacadei, Nr. 15, Bl. P41, Sc. 4, Et. 1, Ap. 53, Sectorul 6, Bucuresti, Bucuresti, 062225",
"is_default": true,
"complete": true,
"added_on": "2026-10-13 10:15:00",
"modified_on": "2026-10-13 11:02:00"
}
}
{
"success": false,
"message": "Validation failed",
"errors": [
{
"field": "address_street",
"code": "street_required_with_city",
"message": "Send the street again when the city changes."
}
]
}
{
"success": false,
"message": "Address not found"
}
Șterge o adresă salvată a contului tău. Dacă era adresa de ridicare implicită, contul rămâne fără adresă implicită și nicio altă adresă nu devine implicită în locul ei; POST /shipment fără expeditor folosește atunci prima adresă de ridicare completă. Expedierile create deja cu această adresă nu sunt afectate.
fetch("https://api.shipo.ro/client/address/502", {
method: "DELETE",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/client/address/502");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200 sau 404
curl_close($ch);
print_r($response);
{
"success": true
}
{
"success": false,
"message": "Address not found"
}
/client/address lucrează cu adresele stradale salvate în cont, de ridicare și de livrare. Erorile de validare primesc codul HTTP 422, cu success: false și lista errors. Atenție: endpoint-urile mai vechi răspund la erorile de validare cu 200, deci verifică în integrare codul HTTP. O adresă inexistentă sau a altui cont primește 404 (Address not found), un body care nu este un obiect JSON primește 400, iar o metodă HTTP nepermisă primește 405, cu metodele acceptate în header-ul Allow. ID-urile adreselor se trimit în POST /shipment ca sender_address_id (adresă de ridicare) sau recipient_address_id (adresă de livrare), la serviciile cu ridicare sau livrare la adresă. POST /shipment este disponibil conturilor cu plată la termen (postpaid).Caută și găsește ID-ul orașului necesar pentru celelalte endpoint-uri.
Caută orașe după nume. Returnează o listă de orașe care corespund termenului, inclusiv coordonatele geografice.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
term | string | Da | Termenul de căutare (min. 2, max. 100 caractere) |
fetch("https://api.shipo.ro/city?term=Bucuresti", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/city?" . http_build_query(["term" => "Bucuresti"]));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
[
{
"id": 16404,
"label": "Bucuresti, Bucuresti",
"value": "Bucuresti",
"county": "Bucuresti",
"coord": [26.1027200000, 44.4361410000]
}
]
Caută străzi într-un anumit oraș. Rezultatele pot fi folosite ca sender_address_street_id sau recipient_address_street_id.
Caută străzi după nume într-un anumit oraș.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
term | string | Da | Numele străzii (min. 2, max. 100 caractere) |
city | string | Da | Numele orașului în care se caută strada |
fetch("https://api.shipo.ro/address?term=Victoriei&city=Bucuresti", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$query = http_build_query(["term" => "Victoriei", "city" => "Bucuresti"]);
$ch = curl_init("https://api.shipo.ro/address?" . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
[
{
"id": 5001,
"label": "Calea Victoriei",
"value": "Calea Victoriei"
}
]
Obține lista curierilor disponibili și serviciile lor.
Returnează lista curierilor activi împreună cu serviciile lor. Poți filtra după tipul adresei expeditorului.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
sender_address_type | string | Nu | Filtrează: address, locker, pudo |
fetch("https://api.shipo.ro/couriers", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
sender_address_type: "address"
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/couriers");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"sender_address_type" => "address"
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
[
{
"id": 1,
"name": "FAN Courier",
"slug": "fancourier",
"enabled": true,
"logo": "https://shipo.ro/assets/couriers/icon-square-fancourier.jpg",
"services": [
{
"id": 10,
"courier_id": 1,
"type": "standard",
"sender_address_type": "address",
"recipient_address_type": "address",
"description": "Livrare standard la adresă"
}
]
}
]
Calculează tarifele de expediere și obține lista serviciilor disponibile.
Returnează toate serviciile de expediere. Folosește id-ul ca rate_id la crearea expedierilor.
fetch("https://api.shipo.ro/rates/services", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/rates/services");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
[
{
"id": 10,
"courier_id": 1,
"type": "standard",
"sender_address_type": "address",
"recipient_address_type": "address",
"description": "Livrare standard la adresă"
}
]
| Câmp | Tip | Descriere |
|---|---|---|
id | integer | ID serviciu (folosește ca rate_id) |
courier_id | integer | ID curier |
type | string | Tipul serviciului |
sender_address_type | string | address, locker, pudo |
recipient_address_type | string | address, locker, pudo |
description | string | Descrierea serviciului |
Calculează tarifele de expediere în funcție de rută și colete.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
sender_city | integer | Da | ID adresă ridicare (din GET /client/address?party=sender) |
delivery_city | string | Da | Orașul de livrare |
cod | float | Nu | Valoare ramburs (0 dacă nu se aplică) |
parcels | array | Nu | Lista coletelor. Implicit: 1 colet 30x20x10cm, 1kg |
courier | array | Nu | Filtrare după slug curier (ex: ["fancourier"]) |
sender_type | string | Nu | Filtrare: address sau locker |
| Câmp | Tip | Descriere |
|---|---|---|
length | integer | Lungime cm (implicit: 30) |
width | integer | Lățime cm (implicit: 20) |
height | integer | Înălțime cm (implicit: 10) |
weight | integer | Greutate kg (implicit: 1) |
fetch("https://api.shipo.ro/rates", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
sender_city: 1,
delivery_city: "Cluj-Napoca",
cod: 150.00,
parcels: [
{ length: 30, width: 20, height: 15, weight: 2 }
]
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/rates");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"sender_city" => 1,
"delivery_city" => "Cluj-Napoca",
"cod" => 150.00,
"parcels" => [
["length" => 30, "width" => 20, "height" => 15, "weight" => 2]
]
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"1": {
"rate_id": 1,
"courier_slug": "fancourier",
"courier_name": "FAN Courier",
"service_type": "standard",
"total_fee": 15.50,
"is_cod_available": true
},
"15": {
"rate_id": 15,
"courier_slug": "dpd",
"courier_name": "DPD",
"service_type": "standard",
"total_fee": 14.80,
"is_cod_available": true
}
}
{
"success": false,
"message": "No couriers deliver this shipment"
}
Obține lista punctelor de ridicare (lockere sau puncte PUDO) valabile pentru un tarif. Folosește id-ul punctului ca recipient_address_id (livrare în locker) sau sender_address_id (ridicare din locker) la crearea expedierii.
address, câmpurile sender_address_id / recipient_address_id primesc ID-ul unei adrese salvate. Pentru serviciile locker sau pudo, aceleași câmpuri primesc ID-ul punctului returnat de /points. Nu sunt interschimbabile.Returnează punctele valabile pentru tariful trimis. Curierul și tipul punctului (locker sau PUDO) sunt deduse automat din rate_id, deci lista conține doar puncte acceptate de acel serviciu.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
rate_id | integer | Da | ID-ul tarifului (din /rates). Determină curierul și tipul punctului |
party | string | Condiționat | sender sau recipient. Necesar doar dacă tariful folosește tipuri diferite de puncte pe cele două capete |
city | string | Nu | Filtrare după localitate. Caută fragmente, nu potrivire exactă (Ocna returnează și Ocna Mureș, și Târgu Ocna) |
county | string | Nu | Filtrare după județ, tot pe fragment |
term | string | Nu | Căutare liberă, pe fragment, în numele punctului, stradă și localitate |
coord | string | Nu | Căutare după coordonate, format latitudine,longitudine (ex: 46.7712,23.6236). Rezultatele sunt ordonate crescător după distanță și fiecare punct primește distance_km |
radius | float | Nu | Raza de căutare în km, folosită împreună cu coord. Implicit 10, minim 0.1, maxim 200. Valorile în afara intervalului sunt aduse la limită, deci radius=0 înseamnă 100 m, nu „fără limită” |
max_results | integer | Nu | Limitează numărul de puncte returnate. Se aplică după sortare, deci cu coord primești cele mai apropiate N puncte. Implicit toate; minim 1 |
street conține adresa completă), accepted_payment lipsește la FAN Courier și Poșta Română, iar opening_hours este completat doar la punctele PUDO DPD și Poșta Română. Fă integrarea tolerantă la câmpuri goale — garantate pentru toți curierii sunt id, name, city, county, postal_code, address, lat și lng.// Cele mai apropiate 5 lockere de un set de coordonate
fetch("https://api.shipo.ro/points?rate_id=42&coord=46.7712,23.6236&radius=15&max_results=5", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
// Sau toate lockerele dintr-o localitate
// /points?rate_id=42&city=Cluj-Napoca
$query = http_build_query([
"rate_id" => 42,
"coord" => "46.7712,23.6236",
"radius" => 15,
"max_results" => 5,
]);
$ch = curl_init("https://api.shipo.ro/points?" . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"courier": "sameday",
"type": "locker",
"total": 37,
"returned": 2,
"data": [
{
"id": 1234,
"name": "easybox OMV Belu",
"county": "Bucuresti",
"city": "Sectorul 4",
"street": "Sos. Oltenitei, Nr. 2",
"street_no": "",
"postal_code": "041304",
"address": "Sos. Oltenitei, Nr. 2, Sectorul 4, Bucuresti",
"lat": 44.3931,
"lng": 26.1174,
"opening_hours": "",
"accepted_payment": "Card",
"dropoff_allowed": 1,
"distance_km": 1.24
}
]
}
| Câmp | Descriere |
|---|---|
courier | Slug-ul curierului dedus din rate_id |
type | locker sau pudo, dedus tot din tarif |
total | Câte puncte au corespuns filtrelor, înainte de max_results |
returned | Câte puncte sunt efectiv în data, după max_results |
data[].id | Valoarea care se trimite ca recipient_address_id sau sender_address_id. Poate fi numar sau text, in functie de curier (GLS foloseste un cod de forma 021173-PARCELLOCK), deci trimite-l mai departe exact asa cum l-ai primit, fara sa-l convertesti in numar |
data[].dropoff_allowed | 1 daca punctul accepta predarea unui colet. Un punct cu 0 poate fi folosit doar ca destinatie, nu ca sender_address_id |
data[].distance_km | Apare doar când folosești coord. Este 0 pentru un punct aflat exact la coordonatele cerute |
{
"success": false,
"message": "Filtering by county is not available for this courier"
}
Alte mesaje posibile: Missing rate_id, Rate not found or inactive, This rate delivers to an address, so it does not use lockers or pudo points, This rate uses a different point type for sender and recipient. Add party=sender or party=recipient, Invalid coord. Expected "latitude,longitude"….
Creează, validează, trimite și anulează expedieri.
Returnează lista paginată a expedierilor contului autentificat. Maxim 500 expedieri per pagină.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
page_no | integer | Nu | Numărul paginii (default 1, min 1, max 100000) |
per_page | integer | Nu | Expedieri per pagină (default 100, min 1, max 500) |
status_order | string | Nu | Filtru pe status comandă: completed, paid, finalized, canceled, refunded |
status_delivery | string | Nu | Filtru pe status livrare: order_placed, collected, in_transit, out_for_delivery, delivered, canceled, dropoff_locker, dropoff_pudo, loaded_locker, loaded_pudo, return_to_sender |
awb | string | Nu | Filtru pe AWB exact (max 20 caractere alfanumerice) |
from | string | Nu | Data minimă placed_on (format YYYY-MM-DD) |
to | string | Nu | Data maximă placed_on (format YYYY-MM-DD) |
fetch("https://api.shipo.ro/shipments?page_no=1&per_page=100&status_delivery=delivered&from=2026-01-01&to=2026-04-29", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipments?page_no=1&per_page=100&status_delivery=delivered&from=2026-01-01&to=2026-04-29");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"pagination": {
"page": 1,
"per_page": 100,
"total": 237,
"total_pages": 3
},
"data": [
{
"id": 12345,
"awb": "2150012345678",
"order_id": "PICKUP-9876",
"courier": "fancourier",
"courier_name": "FAN Courier",
"status_order": "paid",
"status_delivery": "delivered",
"is_return": false,
"cost": 19.99,
"cod": 250.00,
"weight": 3,
"weight_initial": 3,
"parcel_count": 2,
"IBAN": "RO12BREL0005123456789012",
"account_holder": "SC Exemplu SRL",
"open_on_delivery": true,
"insurance": true,
"declared_value": 500,
"is_recalculated": false,
"is_reweighed": false,
"is_atypical": false,
"is_bnpl": false,
"is_oversized": false,
"is_redirected": false,
"is_quick_cod": false,
"contents": "Electronice",
"note": "Fragil",
"placed_on": "2026-04-15 12:34:56",
"added_on": "2026-04-15 12:30:00",
"label_a4": "https://shipo.ro/downloader/awb/label_a4_12345.pdf",
"label_a6": "https://shipo.ro/downloader/awb/label_a6_12345.pdf",
"sender": {
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"email": "[email protected]",
"phone": "0712345678",
"address": "Strada Exemplu nr. 10, Bucuresti",
"address_type": "address",
"address_country": "Romania",
"address_county": "Bucuresti",
"address_municipality": "Bucuresti",
"address_city": "Bucuresti",
"address_sector": "1",
"address_street": "Strada Exemplu",
"address_street_type": "Strada",
"address_street_no": "10",
"address_building": "",
"address_entrance": "",
"address_floor": "",
"address_apartment": "",
"address_postal_code": "010101",
"address_intercom": "",
"address_note": ""
},
"recipient": {
"name": "Maria Ionescu",
"company_name": "",
"email": "[email protected]",
"phone": "0723456789",
"address": "Strada Florilor nr. 25, Cluj-Napoca",
"address_type": "address",
"address_country": "Romania",
"address_county": "Cluj",
"address_municipality": "Cluj-Napoca",
"address_city": "Cluj-Napoca",
"address_sector": "",
"address_street": "Strada Florilor",
"address_street_type": "Strada",
"address_street_no": "25",
"address_building": "",
"address_entrance": "",
"address_floor": "",
"address_apartment": "",
"address_postal_code": "400123",
"address_intercom": "",
"address_note": ""
},
"parcels": [
{ "weight": 3, "initial_weight": 3, "length": 40, "width": 30, "height": 20 },
{ "weight": 1, "initial_weight": 1, "length": 20, "width": 15, "height": 10 }
]
}
]
}
is_return = true){
"id": 12346,
"is_return": true,
"pending_approval": false,
"return_reason": "Produs deteriorat",
"return_IBAN": "RO12BREL0005987654321098",
"return_account_holder": "Andrei Popa"
}
| Câmp | Tip | Descriere |
|---|---|---|
| Răspuns top-level | ||
success | boolean | Dacă operația a reușit |
pagination.page | integer | Pagina curentă |
pagination.per_page | integer | Expedieri per pagină |
pagination.total | integer | Total expedieri pentru filtrele selectate |
pagination.total_pages | integer | Total pagini disponibile |
data | array | Lista expedierilor (sortate după placed_on descrescător) |
| Identificatori | ||
data[].id | integer | ID expediție Shipo |
data[].awb | string | Numărul AWB (gol dacă nu s-a generat încă) |
data[].order_id | string | ID-ul ridicării (pickup ID-ul atribuit de curier) |
data[].courier | string | Slug curier (ex: fancourier, cargus, dpd) |
data[].courier_name | string | Nume curier |
| Statusuri | ||
data[].status_order | string | Status comandă (completed, paid, finalized, canceled, refunded) |
data[].status_delivery | string | Status livrare (order_placed, collected, in_transit, out_for_delivery, delivered, canceled, dropoff_locker, dropoff_pudo, loaded_locker, loaded_pudo, return_to_sender) |
| Date generale | ||
data[].is_return | boolean | Dacă expedierea este retur |
data[].cost | float | Cost total expediere (RON) |
data[].cod | float | Valoare ramburs (RON) |
data[].weight | float | Greutate totală curentă (kg) |
data[].weight_initial | float | Greutate totală inițială (kg) |
data[].parcel_count | integer | Număr colete |
data[].IBAN | string | IBAN pentru ramburs (gol dacă nu este COD) |
data[].account_holder | string | Titular cont IBAN |
data[].declared_value | float | Valoare declarată (RON) |
data[].contents | string | Conținut colet |
data[].note | string | Observații |
data[].placed_on | string | Data plasare AWB (YYYY-MM-DD HH:MM:SS) |
data[].added_on | string | Data creare în sistem |
data[].label_a4 | string|null | URL etichetă A4 |
data[].label_a6 | string|null | URL etichetă A6 |
| Servicii extra (boolean) | ||
data[].open_on_delivery | boolean | Deschidere la livrare |
data[].insurance | boolean | Asigurare colet |
| Flag-uri stare (boolean) | ||
data[].is_recalculated | boolean | Expedierea a fost recalculată |
data[].is_reweighed | boolean | Recalcularea a inclus o re-cântărire |
data[].is_atypical | boolean | Colet atipic |
data[].is_bnpl | boolean | Plată după livrare (Buy Now Pay Later) |
data[].is_oversized | boolean | Colet supradimensionat |
data[].is_redirected | boolean | Expediție redirecționată |
data[].is_quick_cod | boolean | Ramburs rapid |
Date expeditor (data[].sender) | ||
sender.name | string | Nume complet |
sender.company_name | string | Companie |
sender.email | string | |
sender.phone | string | Telefon |
sender.address | string | Adresă concatenată |
sender.address_type | string | Tip adresă: address, locker, pudo |
sender.address_country | string | Țară |
sender.address_county | string | Județ |
sender.address_municipality | string | Municipiu / oraș principal |
sender.address_city | string | Localitate |
sender.address_sector | string | Sector (1-6, doar București) |
sender.address_street | string | Stradă |
sender.address_street_type | string | Tip stradă (Strada, Bulevard, etc.) |
sender.address_street_no | string | Număr stradă |
sender.address_building | string | Bloc |
sender.address_entrance | string | Scara |
sender.address_floor | string | Etaj |
sender.address_apartment | string | Apartament |
sender.address_postal_code | string | Cod poștal |
sender.address_intercom | string | Interfon |
sender.address_note | string | Observații adresă |
Date destinatar (data[].recipient) | ||
Aceleași câmpuri ca sender, prefixate recipient. | ||
Colete (data[].parcels) | ||
parcels[].weight | float | Greutate curentă (kg) |
parcels[].initial_weight | float | Greutate inițială (kg) |
parcels[].length | float | Lungime (cm) |
parcels[].width | float | Lățime (cm) |
parcels[].height | float | Înălțime (cm) |
Câmpuri retur (doar dacă is_return = true) | ||
data[].pending_approval | boolean | Returul este în așteptare aprobare |
data[].return_reason | string | Motivul returului |
data[].return_IBAN | string | IBAN-ul clientului care a inițiat returul |
data[].return_account_holder | string | Titular cont IBAN client retur |
{
"success": false,
"message": "Validation failed",
"errors": {
"per_page": ["Câmpul per_page nu poate fi mai mare decât 500."]
}
}
Creează o nouă expediere. Răspunsul conține AWB-ul și link-urile pentru etichete.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
| Informații generale | |||
rate_id | integer | Da | ID serviciu curierat (din /rates/services) |
contents | string | Da | Conținut colet (max. 40 car., alfanumeric) |
note | string | Nu | Observații (max. 40 car.) |
parcels | array | Da | Lista coletelor (length, width, height, weight) |
| Servicii extra | |||
cod | float | Nu | Valoare ramburs. Contul tău trebuie să aibă IBAN și Titular cont completate în setări |
insurance | boolean | Nu | Asigurare colet |
declared_value | float | Condiționat | Obligatoriu dacă insurance=true. Între 1 și 5000 |
open_on_delivery | boolean | Nu | Deschidere la livrare |
notify_recipient | boolean | Nu | Notificare destinatar prin SMS la generarea AWB-ului |
quick_cod | boolean | Nu | Ramburs rapid (Turbo). Se aplică doar dacă expedierea are cod > 0 |
| Adresa expeditor | |||
sender_address_id | integer|string | Condiționat | Pentru servicii cu ridicare de la adresă: ID adresă salvată (din GET /client/address?party=sender) — opțional, dar dacă e specificat, câmpurile de adresă nu mai sunt necesare. Pentru servicii cu ridicare din locker/pudo: obligatoriu, ID-ul punctului din /points. Se trimit în plus și câmpurile de adresă ale expeditorului (oraș, stradă, număr), deoarece coletul nelivrat se returnează la această adresă |
sender_company_name | string | Nu | Companie expeditor (max. 35 car.) |
sender_name | string | Condiționat | Nume complet (max. 48 car.) |
sender_phone | integer|string | Condiționat | Telefon (max. 48 car.) |
sender_address_city | string | Condiționat | Oraș expeditor (sau sender_address_city_id). Se trimite împreună cu sender_address_county |
sender_address_county | string | Condiționat | Județ expeditor. Obligatoriu alături de sender_address_city, cu excepția Bucureștiului |
sender_address_municipality | string | Nu | Comună expeditor. Necesară doar pentru localitățile cu același nume în același județ (altfel se ia prima potrivire) |
sender_address_city_id | integer | Condiționat | ID oraș expeditor (sau sender_address_city) |
sender_address_sector | integer | Condiționat | Sector 1-6. Obligatoriu pt București |
sender_address_street | string | Condiționat | Stradă text liber (max. 48 car.), sau sender_address_street_id |
sender_address_street_id | integer | Condiționat | ID stradă (sau sender_address_street) |
sender_address_street_no | integer|string | Condiționat | Nr. stradă (max. 10 car.). Obligatoriu dacă nu se folosește o adresă salvată prin sender_address_id, inclusiv la ridicarea din locker/pudo |
sender_address_building | integer|string | Nu | Bloc (max. 10 car.) |
sender_address_entrance | integer|string | Nu | Scara (max. 10 car.) |
sender_address_floor | integer|string | Nu | Etaj (max. 10 car.) |
sender_address_apartment | integer|string | Nu | Apartament (max. 10 car.) |
sender_address_postal_code | integer|string | Nu | Cod poștal (exact 6 cifre) |
| Adresa destinatar | |||
recipient_address_id | integer|string | Condiționat | Pentru servicii cu livrare la adresă: ID adresă salvată a destinatarului (din GET /client/address?party=recipient). Pentru servicii cu livrare în locker/pudo: obligatoriu, ID-ul punctului din /points |
recipient_company_name | string | Nu | Companie destinatar (max. 35 car.) |
recipient_name | string | Da | Nume complet (max. 48 car.) |
recipient_phone | integer|string | Da | Telefon (max. 48 car.) |
recipient_email | string | Condiționat | Email (max. 80 car.). Obligatoriu pt locker/pudo și pentru FAN Courier (cu excepția unei adrese salvate) |
recipient_address_city | string | Condiționat | Oraș destinatar (sau recipient_address_city_id). Se trimite împreună cu recipient_address_county |
recipient_address_county | string | Condiționat | Județ destinatar. Obligatoriu alături de recipient_address_city, cu excepția Bucureștiului |
recipient_address_municipality | string | Nu | Comună destinatar. Necesară doar pentru localitățile cu același nume în același județ (altfel se ia prima potrivire) |
recipient_address_city_id | integer | Condiționat | ID oraș (sau recipient_address_city) |
recipient_address_sector | integer | Condiționat | Sector 1-6. Obligatoriu pt București |
recipient_address_street | string | Condiționat | Stradă text liber (max. 48 car.), sau recipient_address_street_id |
recipient_address_street_id | integer | Condiționat | ID stradă (sau recipient_address_street) |
recipient_address_street_no | integer|string | Condiționat | Nr. stradă (max. 10 car.). Obligatoriu dacă nu se folosește recipient_address_id |
recipient_address_building | integer|string | Nu | Bloc (max. 10 car.) |
recipient_address_entrance | integer|string | Nu | Scara (max. 10 car.) |
recipient_address_floor | integer|string | Nu | Etaj (max. 10 car.) |
recipient_address_apartment | integer|string | Nu | Apartament (max. 10 car.) |
recipient_address_postal_code | integer|string | Nu | Cod poștal (exact 6 cifre) |
| Metadate | |||
meta | object | Nu | Info suplimentare (os_type, os_version, utm_url) |
sender_address_id (din GET /client/address?party=sender), câmpurile individuale de adresă nu mai sunt necesare. Pentru serviciile care livrează în locker sau punct PUDO, trimite recipient_address_id cu ID-ul punctului obținut din /points — în acest caz sunt necesare numele, telefonul și emailul destinatarului (emailul este obligatoriu pentru locker/pudo, pentru că acolo se trimite codul de ridicare), fără câmpuri de adresă. Simetric, pentru serviciile care ridică din locker/pudo, trimite sender_address_id cu ID-ul punctului din /points.sender_address_id cu ID-ul punctului, cât și câmpurile de localitate și stradă ale expeditorului. Coletul care nu poate fi livrat se returnează la această adresă (la Sameday, după ce nu este ridicat din easybox-ul în care a fost predat).GET /client/address?party=sender, iar ID-urile lor se trimit ca sender_address_id. Adresele de livrare salvate sunt disponibile prin GET /client/address?party=recipient, iar ID-urile lor se trimit ca recipient_address_id la serviciile address. Adrese noi, de ridicare sau de livrare, se creează cu POST /client/address. ID-ul unei adrese de ridicare nu este acceptat ca recipient_address_id și nici invers. Fără o adresă salvată, trimite câmpurile de adresă individual.sender_address_city + sender_address_county și sender_address_street), fie ca ID-uri (sender_address_city_id, sender_address_street_id), la fel pentru destinatar. Dacă în același județ există mai multe localități cu același nume, adaugă sender_address_municipality (respectiv recipient_address_municipality) sau folosește ID-ul, altfel se ia prima potrivire. Pentru București se trimite doar sender_address_city: "Bucuresti", fără județ, împreună cu sender_address_sector.oras_plecare, strada_plecare, oras_sosire și strada_sosire rămân acceptate pentru integrările existente și au prioritate dacă sunt trimise împreună cu noile denumiri. Ele așteaptă localitatea într-un singur câmp, în formatul "Oraș, Județ".fetch("https://api.shipo.ro/shipment", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
rate_id: 10,
contents: "Haine",
sender_address_id: 1,
recipient_name: "Maria Ionescu",
recipient_phone: "0723456789",
recipient_address_city: "Cluj-Napoca",
recipient_address_county: "Cluj",
recipient_address_street: "Strada Memorandumului",
// variantă secundară: recipient_address_street_id: 3001 (ID stradă din /address)
recipient_address_street_no: "15",
parcels: [
{ length: 30, width: 20, height: 10, weight: 1 }
]
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"rate_id" => 10,
"contents" => "Haine",
"sender_address_id" => 1,
"recipient_name" => "Maria Ionescu",
"recipient_phone" => "0723456789",
"recipient_address_city" => "Cluj-Napoca",
"recipient_address_county" => "Cluj",
"recipient_address_street" => "Strada Memorandumului",
// variantă secundară: "recipient_address_street_id" => 3001 (ID stradă din /address)
"recipient_address_street_no" => "15",
"parcels" => [
["length" => 30, "width" => 20, "height" => 10, "weight" => 1]
]
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
Alege un tarif cu recipient_address_type: "locker" din /rates, ia ID-ul punctului din /points?rate_id=42 și trimite-l ca recipient_address_id. Nu se trimit câmpuri de adresă pentru destinatar, dar emailul este obligatoriu.
fetch("https://api.shipo.ro/shipment", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
rate_id: 42,
contents: "Haine",
sender_address_id: 7,
recipient_address_id: 1234,
recipient_name: "Maria Ionescu",
recipient_phone: "0723456789",
recipient_email: "[email protected]",
parcels: [
{ length: 30, width: 20, height: 10, weight: 2 }
]
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"rate_id" => 42,
"contents" => "Haine",
"sender_address_id" => 7,
"recipient_address_id" => 1234,
"recipient_name" => "Maria Ionescu",
"recipient_phone" => "0723456789",
"recipient_email" => "[email protected]",
"parcels" => [
["length" => 30, "width" => 20, "height" => 10, "weight" => 2]
]
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
fetch("https://api.shipo.ro/shipment", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
rate_id: 10,
contents: "Electronice",
note: "Fragil",
cod: 250.00,
insurance: true,
declared_value: 500,
open_on_delivery: true,
notify_recipient: true,
quick_cod: true,
sender_name: "Ion Popescu",
sender_phone: "0712345678",
sender_company_name: "SC Exemplu SRL",
sender_address_city: "Bucuresti",
sender_address_sector: 1,
sender_address_street: "Strada Aviatorilor",
sender_address_street_no: "10",
recipient_name: "Maria Ionescu",
recipient_phone: "0723456789",
recipient_email: "[email protected]",
recipient_address_city: "Cluj-Napoca",
recipient_address_county: "Cluj",
recipient_address_street: "Strada Memorandumului",
// variantă secundară: recipient_address_street_id: 3001 (ID stradă din /address)
recipient_address_street_no: "25",
parcels: [
{ length: 40, width: 30, height: 20, weight: 3 },
{ length: 20, width: 15, height: 10, weight: 1 }
]
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"rate_id" => 10,
"contents" => "Electronice",
"note" => "Fragil",
"cod" => 250.00,
"insurance" => true,
"declared_value" => 500,
"open_on_delivery" => true,
"notify_recipient" => true,
"quick_cod" => true,
"sender_name" => "Ion Popescu",
"sender_phone" => "0712345678",
"sender_company_name" => "SC Exemplu SRL",
"sender_address_city" => "Bucuresti",
"sender_address_sector" => 1,
"sender_address_street" => "Strada Aviatorilor",
"sender_address_street_no" => "10",
"recipient_name" => "Maria Ionescu",
"recipient_phone" => "0723456789",
"recipient_email" => "[email protected]",
"recipient_address_city" => "Cluj-Napoca",
"recipient_address_county" => "Cluj",
"recipient_address_street" => "Strada Memorandumului",
// variantă secundară: "recipient_address_street_id" => 3001 (ID stradă din /address)
"recipient_address_street_no" => "25",
"parcels" => [
["length" => 40, "width" => 30, "height" => 20, "weight" => 3],
["length" => 20, "width" => 15, "height" => 10, "weight" => 1]
]
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"expedition": 12345,
"awb": "2150012345678",
"label_a4": "https://shipo.ro/downloader/awb/label_a4_12345.pdf",
"label_a6": "https://shipo.ro/downloader/awb/label_a6_12345.pdf",
"message": "Shipment created successfully."
}
| Câmp | Tip | Descriere |
|---|---|---|
success | boolean | Dacă operația a reușit |
expedition | integer | ID expediție |
awb | string | Numărul AWB |
label_a4 | string | URL etichetă A4 |
label_a6 | string | URL etichetă A6 |
{
"success": false,
"message": "Validation failed",
"errors": {
"rate_id": ["Câmpul rate_id este obligatoriu."],
"contents": ["Câmpul contents este obligatoriu."]
}
}
Validează datele fără a crea expedierea. Aceiași parametri ca POST /shipment.
fetch("https://api.shipo.ro/shipment/validate", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
rate_id: 10,
contents: "Haine",
sender_address_id: 1,
recipient_name: "Maria Ionescu",
recipient_phone: "0723456789",
recipient_address_city: "Cluj-Napoca",
recipient_address_county: "Cluj",
recipient_address_street: "Strada Memorandumului",
// variantă secundară: recipient_address_street_id: 3001 (ID stradă din /address)
recipient_address_street_no: "15",
parcels: [{ length: 30, width: 20, height: 10, weight: 1 }]
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment/validate");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"rate_id" => 10,
"contents" => "Haine",
"sender_address_id" => 1,
"recipient_name" => "Maria Ionescu",
"recipient_phone" => "0723456789",
"recipient_address_city" => "Cluj-Napoca",
"recipient_address_county" => "Cluj",
"recipient_address_street" => "Strada Memorandumului",
// variantă secundară: "recipient_address_street_id" => 3001 (ID stradă din /address)
"recipient_address_street_no" => "15",
"parcels" => [["length" => 30, "width" => 20, "height" => 10, "weight" => 1]]
])
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{ "success": true, "message": "Validation passed" }
{
"success": false,
"message": "Validation failed",
"errors": { "recipient_name": ["Câmpul recipient_name este obligatoriu."] }
}
Trimite o expediere existentă către curier.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
id | integer | Da | ID expediție (din răspunsul de creare) |
fetch("https://api.shipo.ro/shipment/send/12345", {
method: "POST",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment/send/12345");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"ec": "1",
"expedition": 12345,
"awb": "2150012345678",
"label_a4": "https://shipo.ro/downloader/awb/label_a4_12345.pdf",
"label_a6": "https://shipo.ro/downloader/awb/label_a6_12345.pdf",
"message": "Shipment sent to courier successfully."
}
{
"success": false,
"ec": "1",
"expedition": 12345,
"message": "Shipment could not be sent to courier."
}
Anulează o expediere existentă folosind numărul AWB.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
awb | string | Da | Numărul AWB (2-100 caractere) |
fetch("https://api.shipo.ro/shipment/cancel/2150012345678", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/shipment/cancel/2150012345678");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{ "success": true, "message": "Shipment canceled successfully." }
{ "success": false, "message": "Shipment could not be canceled." }
{ "success": false, "message": "Shipment not found." }
Endpoint dedicat clienților care au magazine online asociate. Returnează retururile expediate către magazinele tale, inclusiv pe cele plătite de clientul care a inițiat returul (acelea nu apar în /shipments pentru că nu sunt asociate contului tău).
/shipments. Date sensibile precum IBAN-ul, costul expedierii, valoarea rambursului și flag-urile de stare sunt omise, deoarece returul poate aparține altui client.
Returnează lista paginată a retururilor expediate către magazinele online asociate contului autentificat. Maxim 500 retururi per pagină. Sortate descrescător după placed_on.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
page_no | integer | Nu | Numărul paginii (default 1, min 1, max 100000) |
per_page | integer | Nu | Retururi per pagină (default 100, min 1, max 500) |
status_order | string | Nu | Filtru pe status comandă: completed, paid, finalized, canceled, refunded |
status_delivery | string | Nu | Filtru pe status livrare: order_placed, collected, in_transit, out_for_delivery, delivered, canceled, dropoff_locker, dropoff_pudo, loaded_locker, loaded_pudo, return_to_sender |
awb | string | Nu | Filtru pe AWB exact (max 20 caractere alfanumerice) |
from | string | Nu | Data minimă placed_on (format YYYY-MM-DD) |
to | string | Nu | Data maximă placed_on (format YYYY-MM-DD) |
pending_approval | boolean | Nu | Filtrează după starea de aprobare: 1 sau true pentru retururi în așteptare aprobare, 0 sau false pentru cele deja procesate |
fetch("https://api.shipo.ro/store-returns?page_no=1&per_page=100&pending_approval=1", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/store-returns?page_no=1&per_page=100&pending_approval=1");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"pagination": {
"page": 1,
"per_page": 100,
"total": 18,
"total_pages": 1
},
"data": [
{
"id": 12345,
"awb": "2150012345678",
"order_id": "PICKUP-9876",
"courier": "fancourier",
"courier_name": "FAN Courier",
"status_order": "paid",
"status_delivery": "delivered",
"is_return": true,
"belongs_to_store": false,
"pending_approval": false,
"return_reason": "Produs deteriorat",
"weight": 3,
"parcel_count": 2,
"contents": "Electronice",
"note": "Fragil",
"placed_on": "2026-04-15 12:34:56",
"added_on": "2026-04-15 12:30:00",
"sender": {
"name": "Maria Ionescu",
"company_name": "",
"email": "[email protected]",
"phone": "0723456789",
"address": "Strada Florilor nr. 25, Cluj-Napoca",
"address_type": "address",
"address_country": "Romania",
"address_county": "Cluj",
"address_municipality": "Cluj-Napoca",
"address_city": "Cluj-Napoca",
"address_sector": "",
"address_street": "Strada Florilor",
"address_street_type": "Strada",
"address_street_no": "25",
"address_building": "",
"address_entrance": "",
"address_floor": "",
"address_apartment": "",
"address_postal_code": "400123",
"address_intercom": "",
"address_note": ""
},
"recipient": {
"name": "Ion Popescu",
"company_name": "SC Exemplu SRL",
"email": "[email protected]",
"phone": "0712345678",
"address": "Strada Exemplu nr. 10, Bucuresti",
"address_type": "address",
"address_country": "Romania",
"address_county": "Bucuresti",
"address_municipality": "Bucuresti",
"address_city": "Bucuresti",
"address_sector": "1",
"address_street": "Strada Exemplu",
"address_street_type": "Strada",
"address_street_no": "10",
"address_building": "",
"address_entrance": "",
"address_floor": "",
"address_apartment": "",
"address_postal_code": "010101",
"address_intercom": "",
"address_note": ""
},
"parcels": [
{ "weight": 3, "initial_weight": 3, "length": 40, "width": 30, "height": 20 },
{ "weight": 1, "initial_weight": 1, "length": 20, "width": 15, "height": 10 }
]
}
]
}
| Câmp | Tip | Descriere |
|---|---|---|
| Răspuns top-level | ||
success | boolean | Dacă operația a reușit |
pagination.page | integer | Pagina curentă |
pagination.per_page | integer | Retururi per pagină |
pagination.total | integer | Total retururi pentru filtrele selectate |
pagination.total_pages | integer | Total pagini disponibile |
data | array | Lista retururilor (sortate după placed_on descrescător) |
| Identificatori | ||
data[].id | integer | ID expediție Shipo |
data[].awb | string | Numărul AWB (gol dacă nu s-a generat încă, ex: retur în așteptare aprobare) |
data[].order_id | string | ID-ul ridicării (pickup ID-ul atribuit de curier) |
data[].courier | string | Slug curier (ex: fancourier, cargus, dpd) |
data[].courier_name | string | Nume curier |
| Statusuri | ||
data[].status_order | string | Status comandă (completed, paid, finalized, canceled, refunded) |
data[].status_delivery | string | Status livrare (order_placed, collected, in_transit, out_for_delivery, delivered, canceled, dropoff_locker, dropoff_pudo, loaded_locker, loaded_pudo, return_to_sender) |
| Date retur | ||
data[].is_return | boolean | Întotdeauna true pe acest endpoint |
data[].belongs_to_store | boolean | true dacă returul este în contul tău (magazinul a plătit prin fluxul de aprobare, deci apare și în /shipments). false dacă returul este în contul altui client (clientul care a inițiat returul a plătit, deci nu apare în /shipments) |
data[].pending_approval | boolean | Returul este în așteptare aprobare |
data[].return_reason | string | Motivul returului |
| Date generale | ||
data[].weight | float | Greutate totală (kg) |
data[].parcel_count | integer | Număr colete |
data[].contents | string | Conținut colet |
data[].note | string | Observații |
data[].placed_on | string | Data plasare retur (YYYY-MM-DD HH:MM:SS) |
data[].added_on | string | Data creare în sistem |
Date expeditor (data[].sender) — clientul care returnează | ||
sender.name | string | Nume complet |
sender.company_name | string | Companie |
sender.email | string | |
sender.phone | string | Telefon |
sender.address | string | Adresă concatenată |
sender.address_type | string | Tip adresă: address, locker, pudo |
sender.address_country | string | Țară |
sender.address_county | string | Județ |
sender.address_municipality | string | Municipiu / oraș principal |
sender.address_city | string | Localitate |
sender.address_sector | string | Sector (1-6, doar București) |
sender.address_street | string | Stradă |
sender.address_street_type | string | Tip stradă (Strada, Bulevard, etc.) |
sender.address_street_no | string | Număr stradă |
sender.address_building | string | Bloc |
sender.address_entrance | string | Scara |
sender.address_floor | string | Etaj |
sender.address_apartment | string | Apartament |
sender.address_postal_code | string | Cod poștal |
sender.address_intercom | string | Interfon |
sender.address_note | string | Observații adresă |
Date destinatar (data[].recipient) — magazinul tău | ||
Aceleași câmpuri ca sender, prefixate recipient. | ||
Colete (data[].parcels) | ||
parcels[].weight | float | Greutate curentă (kg) |
parcels[].initial_weight | float | Greutate inițială (kg) |
parcels[].length | float | Lungime (cm) |
parcels[].width | float | Lățime (cm) |
parcels[].height | float | Înălțime (cm) |
{
"success": false,
"message": "Validation failed",
"errors": {
"per_page": ["Câmpul per_page nu poate fi mai mare decât 500."]
}
}
Urmărește statusul expedierilor tale.
Returnează statusul curent și istoricul statusurilor.
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
awb | string | Da | Numărul AWB al expedierii |
fetch("https://api.shipo.ro/tracking?awb=2150012345678", {
method: "GET",
headers: {
"Authorization": "Bearer TOKEN"
}
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init("https://api.shipo.ro/tracking?" . http_build_query(["awb" => "2150012345678"]));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer TOKEN"
]
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
{
"success": true,
"data": {
"awb": "2150012345678",
"status": "in_transit",
"statusName": "În tranzit",
"statusClasses": {
"order_placed": "pastStep",
"picked_up": "pastStep",
"in_transit": "currentStep",
"out_for_delivery": "futureStep",
"delivered": "futureStep"
},
"statusLog": {}
}
}
| Câmp | Tip | Descriere |
|---|---|---|
awb | string | Numărul AWB |
status | string | Statusul curent |
statusName | string | Numele statusului în română |
statusClasses | object | Clase CSS: pastStep, currentStep, futureStep |
statusLog | object | Istoricul statusurilor |
{ "success": false, "message": "Missing awb" }