NoEST API for Node.js and PHP
NoEST (NOEST Express) offers a public API for its e-commerce partners. With dz-delivery, the noest provider talks to that API with the same code as every other carrier.
Install
npm install @dz-delivery/core
composer require dz-delivery/sdk
Node.js ≥ 18 (zero dependencies) or PHP ≥ 8.2 (Guzzle 7). Every carrier implements the same interface, so the same code works with the others once the client is configured; some operations are not available on every carrier and throw NOT_SUPPORTED (see the capability matrix).
NoEST credentials
| Option | Value | Notes |
|---|---|---|
apiToken | API token from the NOEST partner dashboard | Sent as Authorization: Bearer <token> |
userGuid | Partner GUID (same page) | Sent as user_guid in every POST |
autoValidate | false by default | true: valid/order right after creation |
NoEST in TypeScript / Node.js
import { createClient, isShippingError } from '@dz-delivery/core'; const noest = createClient('noest', { apiToken: process.env.NOEST_API_TOKEN!, userGuid: process.env.NOEST_USER_GUID!, autoValidate: true, // hand the parcel to the carrier right away }); try { const desks = await noest.getStopDesks({ wilayaId: 16 }); const quote = await noest.getFees({ toWilayaId: 16 }); const parcel = await noest.createParcel({ recipientName: 'Mohamed Amine', phone: '0550123456', address: 'Cité 221 lots, n°98', wilayaId: 16, communeName: 'Bab Ezzouar', productName: 'T-shirt', price: 2500, orderId: 'ORDER-1001', }); const { parcel: current, events } = await noest.track(parcel.trackingNumber); } catch (err) { if (isShippingError(err)) console.error(err.code, err.message); }
NoEST in PHP / Laravel
use DzDelivery\ClientFactory; use DzDelivery\Errors\ShippingError; $noest = ClientFactory::create('noest', [ 'apiToken' => getenv('NOEST_API_TOKEN'), 'userGuid' => getenv('NOEST_USER_GUID'), 'autoValidate' => true, ]); try { $quote = $noest->getFees(['toWilayaId' => 16]); $parcel = $noest->createParcel([ 'recipientName' => 'Mohamed Amine', 'phone' => '0550123456', 'address' => 'Cité 221 lots, n°98', 'wilayaId' => 16, 'communeName' => 'Bab Ezzouar', 'productName' => 'T-shirt', 'price' => 2500, 'orderId' => 'ORDER-1001', ]); $result = $noest->track($parcel->trackingNumber); } catch (ShippingError $e) { echo "{$e->code}: {$e->getMessage()}"; }
Full PHP guide (Laravel, errors, testing): PHP guide.
Supported methods
| Method | Support | Notes |
|---|---|---|
createParcel | yes | Stays pending until validated (see autoValidate). |
track | yes | Unified status + history (event_key). |
getFees | yes | Partner rate card per wilaya (home, stop desk, return). |
getWilayas / getCommunes | yes | Active communes only. |
getStopDesks | yes | NOEST stations (id = station code, e.g. 16B). |
listParcels | NOT_SUPPORTED | The NOEST API has no order list. |
cancelParcel | yes | Only before validation. |
healthCheck | yes | Checks the token (real call). |
NoEST statuses → unified statuses
track reads the event_key of each activity[] row (or, when it is missing, the English event label, e.g. Delivered) and maps it to a unified status. Remark events (edited_informations, edit_price, edit_wilaya, extra_fee) keep the previous status; French display labels such as « Validé » (validated) are not recognized and map to unknown.
NoEST status (event_key) | Unified status |
|---|---|
upload | pending |
customer_validation | created |
validation_collect_colis, validation_reception_admin, validation_reception, fdr_activated, sent_to_redispatch, nouvel_tentative_asked_by_customer, mise_a_jour, colis_suspendu, return_redispatched_to_livraison, pickedup, valid_return_pickup | in_transit |
livre, livred, verssement_admin_cust, verssement_admin_cust_canceled, verssement_hub_cust_canceled, validation_reception_cash_by_partener, echange_valide, echange_valid_by_hub, pickup_picked_recu, colis_pickup_transmit_to_partner | delivered |
return_asked_by_customer, return_asked_by_hub, return_dispatched_to_partenaire, return_validated_by_partener, return_dispatched_to_warehouse, retour_dispatched_to_partenaires, colis_retour_transmit_to_partner, annulation_dispatch_retour, cancel_return_dispatched_to_partenaire, livraison_echoue_recu | returned |
ask_to_delete_by_admin, ask_to_delete_by_hub | cancelled |
Full list of unified statuses and what they mean: SDK statuses.
Good to know about the NoEST API
- Validation: without
autoValidate: true, orders stay editable and deletable, but NOEST does not pick them up. - Commune names: NOEST spells some names differently, e.g. “Bab Azzouar”. The SDK also accepts “Bab Ezzouar” (spelling-tolerant match, only when exactly one commune matches).
orderId(the NOEST reference) must be at least 5 characters long: otherwiseVALIDATION_ERRORbefore any request.- Suspended account or unknown
userGuid→AUTH_FAILED; duplicate order, inactive commune… →VALIDATION_ERRORwithdetails[].code. - The
baseUrlmust use HTTPS.
Detailed native mapping (endpoints, fields, statuses): PROVIDERS.md.
NoEST FAQ
Where do I find my NoEST token and GUID?
In the NOEST partner dashboard, API section. You need both.
Why are my NoEST orders not being picked up?
They are not validated. Set autoValidate: true or validate them from the dashboard.
Can I list my NoEST parcels?
No: the NOEST API has no list endpoint, so listParcels returns NOT_SUPPORTED. Use track with a tracking number.
Other carriers
Same interface, same normalized statuses (pending, in_transit, delivered…).