API de fichiers OptiRoutes

Guide destiné aux équipes logicielles qui connectent une entreprise à OptiRoutes : charger des commandes, récupérer les POD, les exports et les rapports — de façon sécurisée, en HTTPS.

EN · HE · AR · RU · ES · IT · CS · RO · EL · DE · FR · PT · JA · KO · ZH · NL · PL · TR · SV · DA · NB · FI · HU · SK · HR · BG · UK · ID · MS · TH · VI · HI · LT · SL

Présentation

Chaque entreprise dans OptiRoutes dispose de son propre dossier de fichiers privé : les commandes qu’elle charge, les bons de livraison signés (POD) avec leurs photos et leurs signatures, les exports de tournées et les rapports de fin de journée. L’API de fichiers permet à vos systèmes de lire et d’écrire directement dans ce dossier, sans serveur FTP intermédiaire.

Démarrer en 3 étapes

  1. Créer une clé. Dans OptiRoutes, le responsable ouvre Paramètres → API et fichiers, clique sur Nouvelle clé, lui donne un nom (par exemple « serveur ERP »), choisit les autorisations et copie la clé. La clé n’est affichée qu’une seule fois.
  2. Vérifier la connexion.
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me
  3. Télécharger les POD signés du jour dans un seul fichier ZIP :
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"

Sécurité — à lire attentivement

Authentification

Envoyez la clé dans chaque requête, dans l’un de ces en-têtes :

Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Une clé ressemble à opr_2813_… (le numéro de l’entreprise, puis 32 caractères aléatoires).

Le dossier de l’entreprise

DossierContenuQui écrit
orders_files/Le fichier quotidien des commandes qu’OptiRoutes charge : orders_files/YYYY-MM-DD.csv (ou .json / .TXT, selon le réglage de Paramètres → Chargement des livraisons). Exports de tournées : orders_files/routes_export_YYYY_MM_DD.csv.Vous (commandes) · OptiRoutes (exports)
pod/YYYY/MM/DD/Les POD signés de ce jour : <order>_sign_….pdf, la signature et les photos (<order>_….png/jpg).OptiRoutes
pod/Bons de livraison sources à faire signer dans l’application chauffeur : pod/<order number>.pdf.Vous
reports/YYYY/MM/Rapports de fin de journée et de retours.OptiRoutes
podBaseFile/Le formulaire de base du POD.Vous
inbox/Dossier libre pour les fichiers que vous souhaitez transmettre.Vous

Référence

AppelAutorisationFonction
GET /api/v1/metouteVérifie la clé. Renvoie le numéro de l’entreprise, les autorisations de la clé et votre adresse.
GET /api/v1/files?folder=<folder>files:read (pod:read : pod/ uniquement)Liste un niveau de dossier : fichiers (nom, chemin, taille, date de modification) et sous-dossiers.
GET /api/v1/files/download?path=<file>files:read (pod:read : pod/ uniquement)Télécharge un fichier.
PUT /api/v1/files?path=<file>files:writeEnvoie un fichier (le corps de la requête est le fichier, ou un formulaire multipart avec un champ file). Un fichier existant est remplacé. 50 Mo maximum.
DELETE /api/v1/files?path=<file>files:writeSupprime un fichier que vous avez envoyé (là où l’envoi est autorisé).
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>]pod:readLes fichiers POD d’un jour, chacun avec son numéro de commande et son type : signed_pdf, signature, photo.
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf]pod:readTous les fichiers POD du jour dans un seul fichier ZIP.

Exemple de réponse d’un listing :

{
  "ok": true,
  "folder": "pod/2026/10/11/",
  "items": [
    { "name": "12345_sign_2026_10_11.pdf", "path": "pod/2026/10/11/12345_sign_2026_10_11.pdf",
      "type": "file", "size": 84213, "modified": "2026-10-11T09:14:02.000Z" }
  ]
}

Tâches courantes

Envoyer le fichier des commandes du jour

# curl (Linux / macOS / Windows 10+)
curl -X PUT -H "Authorization: Bearer $OPTIROUTES_KEY" \
     --data-binary @orders.csv -H "Content-Type: text/csv" \
     "https://srv2.optiroutes.com/api/v1/files?path=orders_files/$(date +%F).csv"

# PowerShell
Invoke-RestMethod -Method Put -InFile .\orders.csv -ContentType 'text/csv' `
  -Headers @{ Authorization = "Bearer $env:OPTIROUTES_KEY" } `
  -Uri "https://srv2.optiroutes.com/api/v1/files?path=orders_files/$(Get-Date -f yyyy-MM-dd).csv"

OptiRoutes charge le fichier comme il le fait aujourd’hui (par le chargement automatique de Paramètres → Chargement des livraisons, ou par « Charger un fichier » de l’utilisateur).

Télécharger les POD signés d’une commande

curl -H "Authorization: Bearer $OPTIROUTES_KEY" "https://srv2.optiroutes.com/api/v1/pod?date=2026-10-11&order=12345"
# then, for each item:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -OJ "https://srv2.optiroutes.com/api/v1/files/download?path=pod/2026/10/11/12345_sign_2026_10_11.pdf"

Télécharger le rapport de fin de journée

curl -H "Authorization: Bearer $OPTIROUTES_KEY" "https://srv2.optiroutes.com/api/v1/files?folder=reports/2026/10/"
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -OJ "https://srv2.optiroutes.com/api/v1/files/download?path=reports/2026/10/report_2026_10_11.csv"

Python

import os, datetime, requests

BASE = "https://srv2.optiroutes.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['OPTIROUTES_KEY']}"}

# upload today's orders
day = datetime.date.today().isoformat()
with open("orders.csv", "rb") as f:
    r = requests.put(f"{BASE}/files", params={"path": f"orders_files/{day}.csv"},
                     data=f, headers={**H, "Content-Type": "text/csv"}, timeout=60)
r.raise_for_status()

# download every signed POD of the day
pods = requests.get(f"{BASE}/pod", params={"date": day}, headers=H, timeout=60).json()["items"]
for p in pods:
    if p["kind"] == "signed_pdf":
        data = requests.get(f"{BASE}/files/download", params={"path": p["path"]}, headers=H, timeout=60)
        open(p["name"], "wb").write(data.content)

C# (.NET)

using var http = new HttpClient { BaseAddress = new Uri("https://srv2.optiroutes.com/api/v1/") };
http.DefaultRequestHeaders.Authorization =
    new("Bearer", Environment.GetEnvironmentVariable("OPTIROUTES_KEY"));

// upload today's orders
var day = DateTime.Today.ToString("yyyy-MM-dd");
using var content = new ByteArrayContent(File.ReadAllBytes("orders.csv"));
content.Headers.ContentType = new("text/csv");
(await http.PutAsync($"files?path=orders_files/{day}.csv", content)).EnsureSuccessStatusCode();

// the day's PODs as one ZIP
var zip = await http.GetByteArrayAsync($"pod/archive?date={day}");
File.WriteAllBytes($"pod-{day}.zip", zip);

Node.js

const BASE = 'https://srv2.optiroutes.com/api/v1';
const H = { Authorization: `Bearer ${process.env.OPTIROUTES_KEY}` };
const day = new Date().toISOString().slice(0, 10);

// list and download the day's signed PODs (Node 18+)
const { items } = await (await fetch(`${BASE}/pod?date=${day}`, { headers: H })).json();
for (const p of items.filter((i) => i.kind === 'signed_pdf')) {
  const res = await fetch(`${BASE}/files/download?path=${encodeURIComponent(p.path)}`, { headers: H });
  await require('fs/promises').writeFile(p.name, Buffer.from(await res.arrayBuffer()));
}

Travailler comme avec FTP — un script de synchronisation de dossier

Les équipes qui travaillaient avec FTP peuvent garder un dossier de leur propre serveur synchronisé avec le dossier de l’entreprise : une tâche planifiée télécharge les nouveaux fichiers (par exemple les POD) et envoie ceux que vous déposez dans un dossier local. Le script PowerShell ci-dessous fait les deux ; exécutez-le toutes les quelques minutes depuis le Planificateur de tâches de Windows (sous Linux, utilisez les lignes curl avec cron).

# optiroutes-sync.ps1 — download new PODs, upload what is in .\outbox (run every 5 minutes)
$Base  = 'https://srv2.optiroutes.com/api/v1'
$H     = @{ Authorization = "Bearer $env:OPTIROUTES_KEY" }
$Local = 'C:\OptiRoutes'
New-Item -ItemType Directory -Force "$Local\pod", "$Local\outbox", "$Local\sent" | Out-Null

# 1. today's and yesterday's PODs -> C:\OptiRoutes\pod\YYYY-MM-DD\
foreach ($d in (Get-Date), (Get-Date).AddDays(-1)) {
  $day = $d.ToString('yyyy-MM-dd'); $dir = "$Local\pod\$day"
  New-Item -ItemType Directory -Force $dir | Out-Null
  $list = Invoke-RestMethod -Headers $H -Uri "$Base/pod?date=$day"
  foreach ($f in $list.items) {
    $dest = Join-Path $dir $f.name
    if (-not (Test-Path $dest)) {
      Invoke-WebRequest -Headers $H -OutFile $dest -Uri ("$Base/files/download?path=" + [uri]::EscapeDataString($f.path))
    }
  }
}

# 2. every file in C:\OptiRoutes\outbox -> orders_files/, then moved to C:\OptiRoutes\sent
Get-ChildItem "$Local\outbox" -File | ForEach-Object {
  Invoke-RestMethod -Method Put -Headers $H -InFile $_.FullName -ContentType 'application/octet-stream' `
    -Uri ("$Base/files?path=" + [uri]::EscapeDataString("orders_files/" + $_.Name)) | Out-Null
  Move-Item $_.FullName "$Local\sent\" -Force
}

Faire passer une entreprise de FTP à l’API

Le responsable bascule dans Paramètres → API et fichiers → Comment circulent les fichiers de l'entreprise : API (recommandé). À partir de ce moment, plus rien n’est envoyé au FTP de l’entreprise, et chaque fichier se trouve à la place dans le dossier de l’entreprise :

Avec FTPAvec l’API
Vous déposez le fichier des commandes sur le FTPPUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv
Les POD signés sont poussés vers /POD/ sur votre FTPGET /api/v1/pod?date=… / /api/v1/pod/archive?date=…
L’export des tournées est poussé vers /orders/orders_files/routes_export_YYYY_MM_DD.csv
Les rapports sont poussés vers /orders/YYYY/MM/reports/YYYY/MM/

Les nouvelles entreprises travaillent avec l’API dès le départ. Le retour à FTP se fait avec le même commutateur.

Entreprises sur l’ancien serveur OptiRoutes

Une entreprise qui travaille encore avec l’ancien serveur OptiRoutes (WEB) peut utiliser l’API pour ses POD signés : créez une clé avec l’autorisation pod:read et utilisez /api/v1/pod, /api/v1/pod/archive et /api/v1/files/download?path=pod/…. Ses autres fichiers continuent de circuler comme aujourd’hui, jusqu’à ce que l’entreprise passe au nouveau serveur.

Erreurs

Une erreur renvoie {"ok": false, "error": "<code>", "message": "<explanation>"}.

HTTPerrorQue faire
401missing_key / invalid_keyEnvoyez la clé ; vérifiez qu’elle n’a pas été révoquée ni n’a expiré.
403scope_missingLa clé n’a pas l’autorisation — créez une clé qui la possède.
403ip_not_allowedAppelez depuis une adresse autorisée, ou mettez à jour les adresses de la clé.
403folder_read_onlyN’envoyez que vers orders_files/, inbox/, podBaseFile/ ou pod/<file>.pdf.
400invalid_path / invalid_dateLes chemins sont relatifs (orders_files/a.csv), les dates au format YYYY-MM-DD.
404not_found / no_pod_filesAucun fichier de ce nom / aucun POD ce jour-là.
413file_too_large50 Mo maximum par fichier.
429rate_limitedAttendez une minute et réessayez.
502 / 503storage_unavailable / files_api_unavailableTemporaire — réessayez dans une minute.

Limites

Aide

Le responsable de l’entreprise voit chaque clé, sa dernière utilisation et les derniers appels dans Paramètres → API et fichiers. Pour tout autre besoin, contactez le support OptiRoutes en indiquant le numéro de l’entreprise et l’heure de l’appel — n’envoyez jamais la clé elle-même.