One SDK to create, track and price parcels with Yalidine, ZRExpress, Maystro, Ecotrack (DHD…), NoEST, E-com, MDM and Elogistia — TypeScript and PHP, same contract.
Returns the current parcel plus its event history (oldest → newest). Maystro: pass parcel.id (Maystro UUID) or the tracking number, not your orderId (webhooks optional).
Paginated list of the account’s parcels with their unified status. No event history — use track() for that. Available on ZRExpress, Yalidine, Maystro, E-com and MDM; Ecotrack (not implemented yet), NoEST and Elogistia throw NOT_SUPPORTED (see the compatibility matrix). Prefer webhooks in production.
cancelParcel accepts a tracking number or an internal id. healthCheck probes the credentials (wilayas, bypassing the cache) → { ok, provider, latencyMs }.
await shipping.cancelParcel(parcel.trackingNumber);
const health = await shipping.healthCheck();
Svix / Standard Webhooks — the raw body is required (before JSON.parse). Headers svix-id / svix-timestamp / svix-signature (aliases webhook-*). Tolerance window ~5 min.
Create: max 100, orderId required on each item. Delete: max 200, UUID or tracking number (auto-detected). 200 / 207 / 400 responses → a structured result, no exception when the body is a bulk report.
Amount ≤ 150,000 DZD (fees included). Phone numbers in international format (+213…). Stop desks are hubs; filter by wilaya only. Without a stateId, the parcel stays in OrderReceived until it is switched to “prêt à expédier” (ready to ship) in the portal.
fromWilayaId (or fromWilayaName), the origin wilaya, goes in the client config: createParcel and getFees need it. Cancellation only while the parcel is “En préparation” (preparing). GuepEx = same API, different baseUrl.
track / cancelParcel / listParcels and PDF labels (getLabels); for webhooks (an endpoint you write yourself), mapMaystroStatus converts the pushed status code. getStopDesks requires communeId.
One provider, many couriers via courier (dhd, anderson, worldexpress…) or the tenant’s HTTPS baseUrl. The autoValidate option validates the order right after creation.
apiToken + userGuid. Orders are not validated by default (autoValidate). No listParcels. Commune names are matched loosely (“Bab Ezzouar” / “Bab Azzouar”).
apiKey + storeId. Products are stocked at MDM (catalog id PRD-…). listParcels filters status and dates server-side (orderId page by page in the SDK); no cancellation through the API.
How do I use the Yalidine API from Node.js or PHP?
Install @dz-delivery/core (npm) or dz-delivery/sdk (Composer), then create a yalidine client with your apiId, apiToken and origin wilaya. Yalidine guide.
How do I integrate ZR Express into my store?
A zrexpress client with your apiKey and tenant is all you need to create, track, price, list and cancel parcels — plus labels, bulk operations and signed webhooks. ZRExpress guide.
Are DHD, Anderson, World Express… supported?
Yes: they are carriers on the Ecotrack platform. A single ecotrack provider covers them all, using a built-in courier key or your tenant’s URL. Ecotrack guide.
Can I switch carriers without rewriting my code?
Yes. Every carrier returns the same objects and the same normalized statuses (pending, in_transit, delivered…). Only the client configuration changes, except for operations a carrier’s API does not offer: those throw NOT_SUPPORTED (see the compatibility matrix).
Does it work with Laravel, WooCommerce or Shopify?
The PHP SDK installs in any Composer project (see the Laravel example in the PHP guide). For a Node.js backend or a Shopify app, use the npm package.
Is it free?
Yes, the SDK is open source under the MIT license. You use your own API credentials with each carrier.