<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: developing-off</title>
    <description>The latest articles on DEV Community by developing-off (@developing-off).</description>
    <link>https://dev.to/developing-off</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4204250%2Fadaeb16a-269a-4fc0-9ef6-5b5cefcf05c8.jpg</url>
      <title>DEV Community: developing-off</title>
      <link>https://dev.to/developing-off</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/developing-off"/>
    <language>en</language>
    <item>
      <title>Intégrer Yalidine, ZR Express et DHD dans votre boutique avec un seul SDK (Node.js et PHP)</title>
      <dc:creator>developing-off</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:31:22 +0000</pubDate>
      <link>https://dev.to/developing-off/integrer-yalidine-zr-express-et-dhd-dans-votre-boutique-avec-un-seul-sdk-nodejs-et-php-1la0</link>
      <guid>https://dev.to/developing-off/integrer-yalidine-zr-express-et-dhd-dans-votre-boutique-avec-un-seul-sdk-nodejs-et-php-1la0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;em&gt;English version: &lt;a href="https://dev.to/developing-off/one-sdk-for-every-algerian-delivery-carrier-yalidine-zr-express-dhd-and-maystro-in-nodejs-and-14mb"&gt;read it here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si vous avez déjà développé une boutique en ligne en Algérie, vous connaissez le problème : chaque transporteur a sa propre API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yalidine&lt;/strong&gt; : headers &lt;code&gt;X-API-ID&lt;/code&gt; / &lt;code&gt;X-API-TOKEN&lt;/code&gt;, wilaya d'origine obligatoire, pagination par &lt;code&gt;page_size&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZR Express&lt;/strong&gt; : &lt;code&gt;X-Api-Key&lt;/code&gt; + &lt;code&gt;X-Tenant&lt;/code&gt;, création qui ne renvoie qu'un UUID, recherche des territoires par &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DHD, Anderson, World Express&lt;/strong&gt; (plateforme Ecotrack) : token Bearer, paramètres en query string, commandes à valider après création.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maystro&lt;/strong&gt; : pas d'API de suivi du tout, tout passe par webhooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et chacun a ses propres statuts : « En préparation », &lt;code&gt;OrderReceived&lt;/code&gt;, &lt;code&gt;41&lt;/code&gt;…&lt;/p&gt;

&lt;p&gt;J'ai écrit &lt;strong&gt;dz-delivery&lt;/strong&gt;, un SDK open source (MIT) qui expose &lt;strong&gt;la même interface&lt;/strong&gt; pour tous ces transporteurs, en &lt;strong&gt;TypeScript&lt;/strong&gt; et en &lt;strong&gt;PHP&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @dz-delivery/core      &lt;span class="c"&gt;# Node.js ≥ 18, zéro dépendance&lt;/span&gt;
composer require dz-delivery/sdk   &lt;span class="c"&gt;# PHP ≥ 8.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Le même code pour chaque transporteur
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@dz-delivery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yalidine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YALIDINE_API_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YALIDINE_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fromWilayaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// ou : createClient('zrexpress', { apiKey, tenant })&lt;/span&gt;
&lt;span class="c1"&gt;// ou : createClient('ecotrack', { token, courier: 'dhd' })&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFees&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;toWilayaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parcel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createParcel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;recipientName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mohamed Amine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0550123456&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cité 221 lots, n°98&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;wilayaName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Oran&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;communeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bir El Djir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;productName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;T-shirt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;parcel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parcel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trackingNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'pending' | 'in_transit' | 'delivered' | 'returned' | ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En PHP / Laravel, c'est la même chose avec &lt;code&gt;ClientFactory::create('yalidine', [...])&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que le SDK gère pour vous
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wilayas et communes&lt;/strong&gt; : par code officiel (1–58), par id du transporteur ou par nom. Le SDK les résout avant l'appel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Téléphones&lt;/strong&gt; : normalisés au format attendu par chaque transporteur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statuts unifiés&lt;/strong&gt; : &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;created&lt;/code&gt;, &lt;code&gt;in_transit&lt;/code&gt;, &lt;code&gt;delivered&lt;/code&gt;, &lt;code&gt;returned&lt;/code&gt;, &lt;code&gt;cancelled&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;. La réponse native reste disponible dans &lt;code&gt;raw&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erreurs typées&lt;/strong&gt; : &lt;code&gt;AUTH_FAILED&lt;/code&gt;, &lt;code&gt;VALIDATION_ERROR&lt;/code&gt;, &lt;code&gt;NOT_FOUND&lt;/code&gt;, &lt;code&gt;RATE_LIMITED&lt;/code&gt;…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop desks&lt;/strong&gt; : &lt;code&gt;getStopDesks({ wilayaId })&lt;/code&gt; pour les bureaux et points relais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extras ZR Express&lt;/strong&gt; : étiquettes PDF, création en masse, vérification des webhooks signés.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guides par transporteur
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/yalidine/" rel="noopener noreferrer"&gt;API Yalidine / GuepEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/zrexpress/" rel="noopener noreferrer"&gt;API ZR Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/maystro/" rel="noopener noreferrer"&gt;API Maystro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/ecotrack/" rel="noopener noreferrer"&gt;API Ecotrack (DHD, Anderson…)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contribuer
&lt;/h2&gt;

&lt;p&gt;Le projet est sur GitHub : &lt;a href="https://github.com/developing-off/dz-delivery" rel="noopener noreferrer"&gt;https://github.com/developing-off/dz-delivery&lt;/a&gt;. Les contributions sont bienvenues, surtout pour ajouter des transporteurs (NoEST, MDM…) ou partager des réponses réelles anonymisées pour renforcer les tests.&lt;/p&gt;

&lt;p&gt;Si vous l'utilisez en production, dites-le moi en commentaire 🙏&lt;/p&gt;

</description>
      <category>algeria</category>
      <category>ecommerce</category>
      <category>typescript</category>
      <category>php</category>
    </item>
    <item>
      <title>One SDK for every Algerian delivery carrier: Yalidine, ZR Express, DHD and Maystro in Node.js and PHP</title>
      <dc:creator>developing-off</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:29:32 +0000</pubDate>
      <link>https://dev.to/developing-off/one-sdk-for-every-algerian-delivery-carrier-yalidine-zr-express-dhd-and-maystro-in-nodejs-and-14mb</link>
      <guid>https://dev.to/developing-off/one-sdk-for-every-algerian-delivery-carrier-yalidine-zr-express-dhd-and-maystro-in-nodejs-and-14mb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇫🇷 &lt;em&gt;Version française : &lt;a href="https://dev.to/developing-off/integrer-yalidine-zr-express-et-dhd-dans-votre-boutique-avec-un-seul-sdk-nodejs-et-php-1la0"&gt;lire ici&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have built an online store in Algeria, you know the drill: every delivery carrier has its own API, and none of them look alike.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yalidine&lt;/strong&gt;: &lt;code&gt;X-API-ID&lt;/code&gt; / &lt;code&gt;X-API-TOKEN&lt;/code&gt; headers, a mandatory origin wilaya, &lt;code&gt;page_size&lt;/code&gt; pagination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZR Express&lt;/strong&gt;: &lt;code&gt;X-Api-Key&lt;/code&gt; + &lt;code&gt;X-Tenant&lt;/code&gt;, a create endpoint that only returns a UUID, territory lookups through &lt;code&gt;POST&lt;/code&gt; search endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DHD, Anderson, World Express&lt;/strong&gt; (all on the Ecotrack platform): Bearer token, query-string parameters, orders that must be validated after creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maystro&lt;/strong&gt;: no tracking API at all — everything comes through webhooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And every one of them speaks its own status language: "En préparation", &lt;code&gt;OrderReceived&lt;/code&gt;, &lt;code&gt;41&lt;/code&gt;…&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;dz-delivery&lt;/strong&gt;, an open-source (MIT) SDK that exposes &lt;strong&gt;one interface&lt;/strong&gt; for all of these carriers, in &lt;strong&gt;TypeScript&lt;/strong&gt; and &lt;strong&gt;PHP&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @dz-delivery/core      &lt;span class="c"&gt;# Node.js ≥ 18, zero runtime dependencies&lt;/span&gt;
composer require dz-delivery/sdk   &lt;span class="c"&gt;# PHP ≥ 8.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Same code, any carrier
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@dz-delivery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yalidine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YALIDINE_API_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YALIDINE_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fromWilayaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// origin wilaya (Algiers)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// or: createClient('zrexpress', { apiKey, tenant })&lt;/span&gt;
&lt;span class="c1"&gt;// or: createClient('ecotrack', { token, courier: 'dhd' })&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFees&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;toWilayaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// { deliveryFee, stopDeskFee, currency: 'DZD' }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parcel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createParcel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;recipientName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mohamed Amine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0550123456&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cité 221 lots, n°98&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;wilayaName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Oran&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;communeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bir El Djir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;productName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;T-shirt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// cash on delivery, in DZD&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;parcel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parcel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trackingNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'pending' | 'in_transit' | 'delivered' | 'returned' | ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In PHP / Laravel it is the same thing with &lt;code&gt;ClientFactory::create('yalidine', [...])&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the SDK handles for you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wilayas and communes&lt;/strong&gt;: pass the official code (1–58), the carrier's own id, or a name — the SDK resolves it before calling the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone numbers&lt;/strong&gt;: normalized to the format each carrier expects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified statuses&lt;/strong&gt;: &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;created&lt;/code&gt;, &lt;code&gt;in_transit&lt;/code&gt;, &lt;code&gt;delivered&lt;/code&gt;, &lt;code&gt;returned&lt;/code&gt;, &lt;code&gt;cancelled&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;. The native response is still available in &lt;code&gt;raw&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typed errors&lt;/strong&gt;: &lt;code&gt;AUTH_FAILED&lt;/code&gt;, &lt;code&gt;VALIDATION_ERROR&lt;/code&gt;, &lt;code&gt;NOT_FOUND&lt;/code&gt;, &lt;code&gt;RATE_LIMITED&lt;/code&gt;, &lt;code&gt;NOT_SUPPORTED&lt;/code&gt;…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop desks&lt;/strong&gt;: &lt;code&gt;getStopDesks({ wilayaId })&lt;/code&gt; for carrier offices and pickup points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account sync&lt;/strong&gt;: &lt;code&gt;listParcels()&lt;/code&gt; to pull parcel statuses (ZR Express).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZR Express extras&lt;/strong&gt;: PDF labels, bulk create/delete, signed webhook verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Carrier guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/yalidine/" rel="noopener noreferrer"&gt;Yalidine / GuepEx API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/zrexpress/" rel="noopener noreferrer"&gt;ZR Express API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/maystro/" rel="noopener noreferrer"&gt;Maystro Delivery API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developing-off.github.io/dz-delivery/ecotrack/" rel="noopener noreferrer"&gt;Ecotrack API (DHD, Anderson, World Express…)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;The code is on GitHub: &lt;a href="https://github.com/developing-off/dz-delivery" rel="noopener noreferrer"&gt;https://github.com/developing-off/dz-delivery&lt;/a&gt;. Contributions are very welcome — especially new carriers (NoEST, MDM…) or anonymized real API responses to strengthen the test fixtures.&lt;/p&gt;

&lt;p&gt;If you use it in production, let me know in the comments 🙏&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>opensource</category>
      <category>ecommerce</category>
      <category>php</category>
    </item>
  </channel>
</rss>
