API MDM Express en Node.js et PHP

MDM Express stocke vos produits et les expédie. Avec dz-delivery, le provider mdm utilise son API v2 (colis, géographie, bureaux) avec le même code que les autres transporteurs.

Installer

TypeScript · npm
npm install @dz-delivery/core
PHP · Composer
composer require dz-delivery/sdk

Node.js ≥ 18 (aucune dépendance) ou PHP ≥ 8.2 (Guzzle 7). Le même code fonctionne ensuite pour les autres transporteurs : seule la configuration du client change.

Identifiants MDM Express

OptionValeurNotes
apiKeyClé API créée dans le tableau de bord MDMEnvoyée en x-api-key
storeIdVotre boutique MDM (STR-…)Obligatoire pour créer un colis

MDM Express en TypeScript / Node.js

TypeScript
import { createClient, isShippingError } from '@dz-delivery/core';

const mdm = createClient('mdm', {
  apiKey: process.env.MDM_API_KEY!,
  storeId: process.env.MDM_STORE_ID!,  // STR-…
});

const quote = await mdm.getFees({ toWilayaId: 16, toCommuneId: 'Bab Ezzouar' });

try {
  const parcel = await mdm.createParcel({
    recipientName: 'Mohamed Amine',
    phone: '0550123456',
    address: 'Cité 221 lots, n°98',
    wilayaId: 16,
    communeName: 'Bab Ezzouar',
    // produits stockés chez MDM : leur id catalogue (PRD-…)
    productList: [{ name: 'T-shirt', quantity: 1, productId: 'PRD-B5C63A' }],
    price: 2500,
  });

  const { parcel: current, events } = await mdm.track(parcel.trackingNumber);
} catch (err) {
  if (isShippingError(err)) console.error(err.code, err.message);
}

// Colis livrés, filtrés côté MDM
const delivered = await mdm.listParcels({ status: 'delivered', pageSize: 50 });

MDM Express en PHP / Laravel

PHP
use DzDelivery\ClientFactory;
use DzDelivery\Errors\ShippingError;

$mdm = ClientFactory::create('mdm', [
    'apiKey'  => getenv('MDM_API_KEY'),
    'storeId' => getenv('MDM_STORE_ID'),
]);

try {
    $parcel = $mdm->createParcel([
        'recipientName' => 'Mohamed Amine',
        'phone'         => '0550123456',
        'address'       => 'Cité 221 lots, n°98',
        'wilayaId'      => 16,
        'communeName'   => 'Bab Ezzouar',
        'productList'   => [['name' => 'T-shirt', 'quantity' => 1, 'productId' => 'PRD-B5C63A']],
        'price'         => 2500,
    ]);

    $result = $mdm->track($parcel->trackingNumber);
} catch (ShippingError $e) {
    echo "{$e->code}: {$e->getMessage()}";
}

Guide PHP complet (Laravel, erreurs, tests) : guide-php.md.

Méthodes supportées

MéthodeSupportNotes
createParcelouiProduits du catalogue MDM (productId ou sku = PRD-…) et storeId.
trackouiStatut unifié + historique.
getFeesouiTarif exact par commune (domicile ou bureau) et frais de retour.
getWilayas / getCommunesouiIds de commune MDM (DZA161601).
getStopDesksouiBureaux des transporteurs partenaires de MDM.
listParcelsouiFiltres status et updatedSince appliqués côté MDM.
cancelParcelNOT_SUPPORTEDPas d’annulation par API : depuis le tableau de bord MDM.
healthCheckouiVérifie la clé (appel réel).

À savoir sur l’API MDM Express

  • Testé en réel (octobre 2026, lecture seule) : wilayas, communes, bureaux, tarifs, liste, suivi, erreurs.
  • Fulfilment : MDM expédie des produits stockés chez lui. Chaque ligne de productList doit porter son id catalogue MDM ; un produit inconnu → VALIDATION_ERROR sur productList.
  • price est ce que paie le destinataire : MDM n’ajoute pas de frais de livraison par-dessus.
  • MDM n’a pas de champ « référence commande » : orderId est écrit dans les notes (Ref: …) et reste filtrable avec listParcels({ orderId }).
  • Le baseUrl doit être en HTTPS.

Mapping natif détaillé (endpoints, champs, statuts) : PROVIDERS.md.

FAQ MDM Express

Où trouver ma clé API et mon storeId MDM ?

Dans le tableau de bord MDM : la clé API dans les paramètres API, le storeId (STR-…) dans votre boutique.

Puis-je envoyer un produit qui n’est pas stocké chez MDM ?

Non : MDM refuse les produits hors catalogue. Ajoutez d’abord le produit dans MDM, puis utilisez son id PRD-….

Comment annuler un colis MDM ?

L’API n’a pas d’annulation : cancelParcel renvoie NOT_SUPPORTED. Annulez depuis le tableau de bord MDM.

Autres transporteurs

Même interface, mêmes statuts normalisés (pending, in_transit, delivered…).