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 l'endpoint /api/driver/login avec leur email et mot de passe. Un token JWT est retourne pour les appels suivants.
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 |
|---|---|---|
| pending | Commande creee, en attente d'un livreur | 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 |
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 necessitent un token JWT.
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}/pickup | Ramassage effectue |
| POST | /api/driver/orders/{id}/problem | Signaler un probleme |
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 |
Chat & notifications
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/driver/orders/{id}/chat | Messages du chat |
| POST | /api/driver/orders/{id}/chat | Envoyer un message |
| GET | /api/driver/push/vapid-key | Cle VAPID pour push |
| POST | /api/driver/push/subscribe | S'abonner aux push |
| POST | /api/driver/push/unsubscribe | Se desabonner |
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"
}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