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, puisPOST /api/driver/firebase-loginavec{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
- Creez une integration dans le dashboard pour obtenir un token
- Configurez le mapping des champs si necessaire
- Envoyez vos commandes en POST JSON vers
/webhook/{token} - 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
| Plateforme | Mapping | Statut callback |
|---|---|---|
| Just Eat | Automatique | Oui |
| Uber Eats | Automatique | Oui |
| WooCommerce | Automatique | Oui |
| Shopify | Automatique | Oui |
| Personnalise | Configurable | Configurable |
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
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | Oui | Identifiant unique de la commande |
restaurantName | string | Oui | Nom du restaurant |
restaurantAddress | string | Oui | Adresse de collecte |
customerName | string | Oui | Nom du client |
customerPhoneNumber | string | Recommande | Telephone du client |
customerEmail | string | Non | Email du client |
deliveryAddress | string | Oui | Adresse de livraison |
deliveryLatitude | float | Recommande | Latitude de livraison |
deliveryLongitude | float | Recommande | Longitude 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 :
| Statut | Description | Declencheur |
|---|---|---|
| received | Commande recue, preparation en cuisine | Systeme / Resto |
| pending | Prete, en attente d'un livreur (dispatch) | Systeme |
| accepted | Livreur a accepte la course | Livreur |
| to_restaurant | En route vers le restaurant | Livreur |
| at_restaurant | Arrive au restaurant | Livreur |
| collected | Commande recuperee | Livreur |
| to_customer | En route vers le client | Livreur |
| delivered | Commande livree | Livreur |
| Statuts non nominaux | ||
| on_hold | En attente (cuisine pas prete ou aucun livreur dispo) | Systeme |
| rejected | Course refusee par le livreur (re-dispatch) | Livreur |
| cancelled | Commande annulee | Resto / Systeme |
| returned | Colis retourne au restaurant | Livreur |
| failed | Echec de livraison | Systeme |
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
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/driver/orders | Liste des commandes assignees |
| GET | /api/driver/orders/{id} | Detail d'une commande |
| POST | /api/driver/orders/{id}/accept | Accepter une course |
| POST | /api/driver/orders/{id}/reject | Refuser une course |
| POST | /api/driver/orders/{id}/to-restaurant | En route vers le restaurant |
| POST | /api/driver/orders/{id}/at-restaurant | Arrive au restaurant |
| POST | /api/driver/orders/{id}/collected | Commande recuperee |
| POST | /api/driver/orders/{id}/to-customer | En route vers le client |
| POST | /api/driver/orders/{id}/deliver | Commande livree |
| POST | /api/driver/orders/{id}/scan-qr | Valider le ramassage par scan QR |
| POST | /api/driver/orders/{id}/problem | Signaler un probleme |
| POST | /api/driver/orders/{id}/request-replacement | Demander un remplacant (panne / transfert sur place) |
| POST | /api/driver/orders/{id}/forgotten-items | Signaler un oubli d'article (cree une commande complement) |
Localisation & statut
| Methode | Endpoint | Description |
|---|---|---|
| POST | /api/driver/location | Mettre a jour la position GPS |
| PUT | /api/driver/status | Changer le statut (online/offline) |
| GET | /api/driver/stats | Statistiques du livreur |
| GET | /api/driver/history | Historique des courses |
| GET | /api/driver/optimized-route | Route optimisee multi-arrets |
| POST | /api/driver/dispatch-ready | Signaler la disponibilite au dispatch (retour en ligne / GPS frais) |
| GET | /api/driver/pending-returns | Colis 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.
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/driver/orders/{id}/chat | Autorise le canal de la commande + renvoie le nom du canal RTDB |
| POST | /api/driver/orders/{id}/chat | Envoyer un message (ecrit dans RTDB) |
| GET | /api/driver/chat/fleet | Autorise le canal de la flotte (chat livreurs) |
| POST | /api/driver/chat/fleet | Envoyer un message dans le chat flotte |
| POST | /api/driver/push/fcm-register | Enregistrer le token FCM (notifications push, app Android) |
API Integrations
Gestion des integrations (necessite authentification admin).
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/integrations | Lister les integrations |
| POST | /api/integrations | Creer une integration |
| PUT | /api/integrations/{id} | Modifier une integration |
| DELETE | /api/integrations/{id} | Supprimer une integration |
| POST | /api/integrations/{id}/regenerate-token | Regenerer 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.
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/tenant-admin/catalog | Catalogue synchronise (articles + variantes) |
| POST | /api/tenant-admin/catalog/items/{sku_ref}/snooze | Mettre un article en rupture (indispo temporaire) |
| POST | /api/tenant-admin/catalog/items/{sku_ref}/unsnooze | Remettre un article disponible |
| PUT | /api/tenant-admin/catalog/items/{sku_ref}/restrictions | Restrictions de l'article (par canal) |
| PUT | /api/tenant-admin/catalog/items/{sku_ref}/channel-price | Prix 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.
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/tenant-admin/customers | Liste des clients |
| POST | /api/tenant-admin/customers/pull | Importer / synchroniser les clients depuis HubRise |
| GET | /api/tenant-admin/customers/{id} | Detail d'un client |
| POST | /api/tenant-admin/customers/{id}/delete | Supprimer 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 HTTP | Erreur | Description |
|---|---|---|
400 | invalid_json | Le corps de la requete n'est pas un JSON valide |
400 | no_order_id | Aucun identifiant de commande trouve |
400 | tenant_id required | Le champ tenant_id est requis |
401 | invalid_token | Token webhook invalide ou integration desactivee |
401 | unauthorized | Authentification requise |
200 | duplicate | La commande existe deja (retourne l'ID existant) |
Format de reponse d'erreur
{
"error": "invalid_token"
}
Format de reponse succes
{
"ok": true,
...
}
SwissLivraisonPro