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

TypeScript · npm
npm install @dz-delivery/core
PHP · Composer
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

OptionValueNotes
apiTokenAPI token from the NOEST partner dashboardSent as Authorization: Bearer <token>
userGuidPartner GUID (same page)Sent as user_guid in every POST
autoValidatefalse by defaulttrue: valid/order right after creation

NoEST in TypeScript / Node.js

TypeScript
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

PHP
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

MethodSupportNotes
createParcelyesStays pending until validated (see autoValidate).
trackyesUnified status + history (event_key).
getFeesyesPartner rate card per wilaya (home, stop desk, return).
getWilayas / getCommunesyesActive communes only.
getStopDesksyesNOEST stations (id = station code, e.g. 16B).
listParcelsNOT_SUPPORTEDThe NOEST API has no order list.
cancelParcelyesOnly before validation.
healthCheckyesChecks 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
uploadpending
customer_validationcreated
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_pickupin_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_partnerdelivered
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_recureturned
ask_to_delete_by_admin, ask_to_delete_by_hubcancelled

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: otherwise VALIDATION_ERROR before any request.
  • Suspended account or unknown userGuid → AUTH_FAILED; duplicate order, inactive commune… → VALIDATION_ERROR with details[].code.
  • The baseUrl must 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…).