Introduction

L'API SwissLivraisonPro permet d'integrer votre systeme de commandes (site web, application, plateforme tierce) avec notre service de livraison. Vous pouvez :

  • Envoyer automatiquement des commandes via webhooks
  • Suivre les statuts de livraison en temps reel
  • Gerer les livreurs et les courses via l'API REST
  • Recevoir des callbacks de statut sur votre serveur

Base URL : https://swisslivraisonpro.ch

Authentification

Tokens Webhook

Chaque integration possede un token unique genere automatiquement. Ce token identifie votre restaurant et sa configuration. Il est inclus directement dans l'URL du webhook :

POST /webhook/{votre_token}

Le token est genere lors de la creation de l'integration dans le dashboard, section Integrations.

Cle API (Bearer Token)

Pour les endpoints d'administration, l'authentification se fait via une session admin ou un Bearer token :

Authorization: Bearer {api_key}

Authentification Livreur

Les livreurs s'authentifient via Firebase Auth (email + mot de passe). Deux flows :

  • PWA Web : firebase.auth().signInWithEmailAndPassword(email, pwd) cote client, puis POST /api/driver/firebase-login avec {idToken} qui retourne un cookie de session Firebase (HTTP-only, 14j).
  • APK Android native : Firebase SDK natif, puis Authorization: Bearer <Firebase idToken> sur chaque appel API.

Les anciens endpoints /api/driver/login (phone/password), /api/driver/forgot-password et /api/driver/reset-password ont ete retires en Phase 3 de la migration. Le reset password est desormais natif Firebase via sendPasswordResetEmail().

Webhook - Reception de commandes

POST /webhook/{token}

Point d'entree universel pour recevoir des commandes depuis n'importe quelle plateforme (Just Eat, Uber Eats, WooCommerce, Shopify, ou systeme personnalise).

Fonctionnement

  1. Creez une integration dans le dashboard pour obtenir un token
  2. Configurez le mapping des champs si necessaire
  3. Envoyez vos commandes en POST JSON vers /webhook/{token}
  4. La commande est normalisee, creee et automatiquement dispatchee aux livreurs

Reponse succes

{
  "ok": true,
  "order_id": 42,
  "source_order_id": "ORD-12345",
  "dispatch_result": "assigned"
}

Plateformes supportees

PlateformeMappingStatut callback
Just EatAutomatiqueOui
Uber EatsAutomatiqueOui
WooCommerceAutomatiqueOui
ShopifyAutomatiqueOui
PersonnaliseConfigurableConfigurable

Format du payload de commande

Pour les integrations personnalisees, envoyez un JSON avec les champs suivants :

{
  "id": "ORD-12345",
  "restaurantName": "Pizza Roma",
  "restaurantAddress": "Rue du Marche 12, 1204 Geneve",
  "customerName": "Jean Dupont",
  "customerPhoneNumber": "+41 79 123 45 67",
  "customerEmail": "jean@example.com",
  "deliveryAddress": "Avenue de la Gare 5, 1003 Lausanne",
  "deliveryLatitude": 46.5197,
  "deliveryLongitude": 6.6323
}

Champs

ChampTypeRequisDescription
idstringOuiIdentifiant unique de la commande
restaurantNamestringOuiNom du restaurant
restaurantAddressstringOuiAdresse de collecte
customerNamestringOuiNom du client
customerPhoneNumberstringRecommandeTelephone du client
customerEmailstringNonEmail du client
deliveryAddressstringOuiAdresse de livraison
deliveryLatitudefloatRecommandeLatitude de livraison
deliveryLongitudefloatRecommandeLongitude de livraison

Mapping personnalise

Si votre payload utilise des noms de champs differents, configurez un field_mapping lors de la creation de l'integration :

{
  "field_mapping": {
    "order_id": "order_number",
    "restaurant_name": "shop.name",
    "customer_name": "client.fullName",
    "delivery_address": "client.address.street",
    "delivery_lat": "client.address.lat",
    "delivery_lng": "client.address.lng"
  }
}

Les chemins supportent la notation pointee pour les objets imbriques (ex: client.address.street).

Statuts de livraison

Chaque commande passe par les statuts suivants :

StatutDescriptionDeclencheur
receivedCommande recue, preparation en cuisineSysteme / Resto
pendingPrete, en attente d'un livreur (dispatch)Systeme
acceptedLivreur a accepte la courseLivreur
to_restaurantEn route vers le restaurantLivreur
at_restaurantArrive au restaurantLivreur
collectedCommande recupereeLivreur
to_customerEn route vers le clientLivreur
deliveredCommande livreeLivreur
Statuts non nominaux
on_holdEn attente (cuisine pas prete ou aucun livreur dispo)Systeme
rejectedCourse refusee par le livreur (re-dispatch)Livreur
cancelledCommande annuleeResto / Systeme
returnedColis retourne au restaurantLivreur
failedEchec de livraisonSysteme

Callbacks de statut

Si vous configurez un status_push_url sur votre integration, SwissLivraisonPro enverra un POST a cette URL a chaque changement de statut :

POST {votre_status_push_url}
Content-Type: application/json
Authorization: Bearer {votre_api_key}

{
  "order_id": "ORD-12345",
  "status": "InDelivery",
  "internal_status": "collected"
}

Le champ status est traduit selon le mapping de votre plateforme. Le champ internal_status contient toujours le statut interne SwissLivraisonPro.

API Livreur

Tous les endpoints livreur utilisent le prefixe /api/driver et l'authentification Firebase (ID token en Authorization: Bearer pour l'app native, ou cookie de session Firebase pour le web — cf. section Authentification). Ces endpoints sont internes aux apps livreur SwissLivraisonPro.

Commandes

MethodeEndpointDescription
GET/api/driver/ordersListe des commandes assignees
GET/api/driver/orders/{id}Detail d'une commande
POST/api/driver/orders/{id}/acceptAccepter une course
POST/api/driver/orders/{id}/rejectRefuser une course
POST/api/driver/orders/{id}/to-restaurantEn route vers le restaurant
POST/api/driver/orders/{id}/at-restaurantArrive au restaurant
POST/api/driver/orders/{id}/collectedCommande recuperee
POST/api/driver/orders/{id}/to-customerEn route vers le client
POST/api/driver/orders/{id}/deliverCommande livree
POST/api/driver/orders/{id}/scan-qrValider le ramassage par scan QR
POST/api/driver/orders/{id}/problemSignaler un probleme
POST/api/driver/orders/{id}/request-replacementDemander un remplacant (panne / transfert sur place)
POST/api/driver/orders/{id}/forgotten-itemsSignaler un oubli d'article (cree une commande complement)

Localisation & statut

MethodeEndpointDescription
POST/api/driver/locationMettre a jour la position GPS
PUT/api/driver/statusChanger le statut (online/offline)
GET/api/driver/statsStatistiques du livreur
GET/api/driver/historyHistorique des courses
GET/api/driver/optimized-routeRoute optimisee multi-arrets
POST/api/driver/dispatch-readySignaler la disponibilite au dispatch (retour en ligne / GPS frais)
GET/api/driver/pending-returnsColis a retourner au restaurant

Chat & notifications

Le chat (livreur ↔ client ↔ restaurant, et chat de flotte) est temps reel via Firebase RTDB : l'endpoint d'autorisation pose l'ACL et renvoie le nom du canal, puis le client lit/ecrit directement dans RTDB (live). Les notifications push utilisent FCM (Firebase Cloud Messaging) cote app native. Le Web Push (VAPID) a ete retire.

MethodeEndpointDescription
GET/api/driver/orders/{id}/chatAutorise le canal de la commande + renvoie le nom du canal RTDB
POST/api/driver/orders/{id}/chatEnvoyer un message (ecrit dans RTDB)
GET/api/driver/chat/fleetAutorise le canal de la flotte (chat livreurs)
POST/api/driver/chat/fleetEnvoyer un message dans le chat flotte
POST/api/driver/push/fcm-registerEnregistrer le token FCM (notifications push, app Android)

API Integrations

Gestion des integrations (necessite authentification admin).

MethodeEndpointDescription
GET/api/integrationsLister les integrations
POST/api/integrationsCreer une integration
PUT/api/integrations/{id}Modifier une integration
DELETE/api/integrations/{id}Supprimer une integration
POST/api/integrations/{id}/regenerate-tokenRegenerer le token

Creer une integration

POST /api/integrations
Content-Type: application/json

{
  "tenant_id": "rest_abc123",
  "platform": "custom",
  "name": "Mon Site Web",
  "status_push_url": "https://monsite.ch/api/delivery-status",
  "field_mapping": {
    "order_id": "id",
    "restaurant_name": "restaurant.name",
    "customer_name": "customer.name",
    "delivery_address": "customer.address"
  }
}

Reponse

{
  "ok": true,
  "integration_id": 7,
  "webhook_url": "/webhook/abc123def456",
  "webhook_token": "abc123def456"
}

Stock & Disponibilite

La disponibilite des articles suit le modele HubRise : un article se met en rupture temporaire (snooze) sans le retirer du catalogue. Le catalog est le catalogue synchronise (HubRise) ; les articles sont references par sku_ref.

MethodeEndpointDescription
GET/api/tenant-admin/catalogCatalogue synchronise (articles + variantes)
POST/api/tenant-admin/catalog/items/{sku_ref}/snoozeMettre un article en rupture (indispo temporaire)
POST/api/tenant-admin/catalog/items/{sku_ref}/unsnoozeRemettre un article disponible
PUT/api/tenant-admin/catalog/items/{sku_ref}/restrictionsRestrictions de l'article (par canal)
PUT/api/tenant-admin/catalog/items/{sku_ref}/channel-pricePrix specifique par canal
DELETE/api/tenant-admin/catalog/items/{sku_ref}/channel-price/{variant_ref}Supprimer un prix par canal

Clients

Base clients du restaurant, synchronisee avec HubRise (import depuis la liste clients HubRise). Authentifiee tenant-admin.

MethodeEndpointDescription
GET/api/tenant-admin/customersListe des clients
POST/api/tenant-admin/customers/pullImporter / synchroniser les clients depuis HubRise
GET/api/tenant-admin/customers/{id}Detail d'un client
POST/api/tenant-admin/customers/{id}/deleteSupprimer un client

Exemples d'integration

Envoyer une commande (curl)

curl -X POST https://swisslivraisonpro.ch/webhook/VOTRE_TOKEN \
  -H "Content-Type: application/json" \
  -d '{
    "id": "CMD-001",
    "restaurantName": "Pizzeria Bella",
    "restaurantAddress": "Rue de Lausanne 42, 1201 Geneve",
    "customerName": "Marie Martin",
    "customerPhoneNumber": "+41 78 900 11 22",
    "deliveryAddress": "Chemin des Fleurs 8, 1202 Geneve",
    "deliveryLatitude": 46.2108,
    "deliveryLongitude": 6.1467
  }'

Creer une integration (curl)

curl -X POST https://swisslivraisonpro.ch/api/integrations \
  -H "Content-Type: application/json" \
  -H "Cookie: session=VOTRE_SESSION" \
  -d '{
    "tenant_id": "rest_abc123",
    "platform": "custom",
    "name": "Mon Site Web"
  }'

Webhook depuis WooCommerce

Dans WooCommerce, allez dans Reglages > Avance > Webhooks :

  • Statut : Actif
  • Sujet : Commande creee
  • URL : https://swisslivraisonpro.ch/webhook/VOTRE_TOKEN
  • Version API : WP REST API v3

Webhook depuis Shopify

Dans Shopify, allez dans Parametres > Notifications > Webhooks :

  • Evenement : Creation de commande
  • URL : https://swisslivraisonpro.ch/webhook/VOTRE_TOKEN
  • Format : JSON

Codes d'erreur

Code HTTPErreurDescription
400invalid_jsonLe corps de la requete n'est pas un JSON valide
400no_order_idAucun identifiant de commande trouve
400tenant_id requiredLe champ tenant_id est requis
401invalid_tokenToken webhook invalide ou integration desactivee
401unauthorizedAuthentification requise
200duplicateLa commande existe deja (retourne l'ID existant)

Format de reponse d'erreur

{
  "error": "invalid_token"
}

Format de reponse succes

{
  "ok": true,
  ...
}