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

  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
pendingCommande creee, en attente d'un livreurSysteme
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

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

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}/pickupRamassage effectue
POST/api/driver/orders/{id}/problemSignaler un probleme

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

Chat & notifications

MethodeEndpointDescription
GET/api/driver/orders/{id}/chatMessages du chat
POST/api/driver/orders/{id}/chatEnvoyer un message
GET/api/driver/push/vapid-keyCle VAPID pour push
POST/api/driver/push/subscribeS'abonner aux push
POST/api/driver/push/unsubscribeSe desabonner

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"
}

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,
  ...
}