OptiRoutes Files API

Príručka pre softvérové tímy, ktoré pripájajú spoločnosť k OptiRoutes: načítanie objednávok, získavanie POD, exportov a zostáv – bezpečne cez 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

Čo to je

Každá spoločnosť v OptiRoutes má vlastný súkromný priečinok súborov: objednávky, ktoré načítava, podpísané dodacie listy (POD) s ich fotografiami a podpismi, exporty trás a zostavy na konci dňa. Files API umožňuje vašim systémom čítať a zapisovať do tohto priečinka priamo, bez servera FTP medzi tým.

Začnite v 3 krokoch

  1. Vytvorte kľúč. V OptiRoutes manažér otvorí Nastavenia → API a súbory, klikne na Nový kľúč, pomenuje ho (napríklad „Server ERP“), vyberie oprávnenia a skopíruje kľúč. Kľúč sa zobrazí len raz.
  2. Overte pripojenie.
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me
  3. Stiahnite dnešné podpísané POD ako jeden ZIP:
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"

Zabezpečenie – prečítajte si

Overenie

Kľúč posielajte v každej požiadavke v jednej z týchto hlavičiek:

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

Kľúč vyzerá ako opr_2813_… (číslo spoločnosti, potom 32 náhodných znakov).

Priečinok spoločnosti

PriečinokČo obsahujeKto zapisuje
orders_files/Denný súbor objednávok, ktorý OptiRoutes načítava: orders_files/YYYY-MM-DD.csv (alebo .json / .TXT, podľa nastavenia v Nastavenia → Načítanie). Exporty trás: orders_files/routes_export_YYYY_MM_DD.csv.Vy (objednávky) · OptiRoutes (exporty)
pod/YYYY/MM/DD/Podpísané POD daného dňa: <order>_sign_….pdf, podpis a fotografie (<order>_….png/jpg).OptiRoutes
pod/Zdrojové dodacie listy na podpis v aplikácii vodiča: pod/<order number>.pdf.Vy
reports/YYYY/MM/Zostavy na konci dňa a zostavy vrátení.OptiRoutes
podBaseFile/Základný formulár POD.Vy
inbox/Voľný priečinok pre súbory, ktoré chcete odovzdať.Vy

Referencia

VolanieOprávnenieČo robí
GET /api/v1/meakékoľvekOverí kľúč. Vráti číslo spoločnosti, oprávnenia kľúča a vašu adresu.
GET /api/v1/files?folder=<folder>files:read (pod:read: len pod/)Vypíše jednu úroveň priečinka: súbory (názov, cesta, veľkosť, zmena) a podpriečinky.
GET /api/v1/files/download?path=<file>files:read (pod:read: len pod/)Stiahne jeden súbor.
PUT /api/v1/files?path=<file>files:writeNahrá súbor (telo požiadavky je súbor alebo formulár multipart s poľom file). Existujúci súbor sa nahradí. Najviac 50 MB.
DELETE /api/v1/files?path=<file>files:writeOdstráni súbor, ktorý ste nahrali (tam, kam smiete nahrávať).
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>]pod:readSúbory POD daného dňa, každý s číslom objednávky a druhom: signed_pdf, signature, photo.
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf]pod:readVšetky súbory POD daného dňa ako jeden ZIP.

Príklad odpovede výpisu:

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

Bežné úlohy

Nahranie dnešného súboru objednávok

# 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 načíta súbor tak, ako ho načítava dnes (automatické načítanie v Nastavenia → Načítanie alebo „Načítať súbor“ používateľa).

Stiahnutie podpísaných POD jednej objednávky

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"

Stiahnutie zostavy na konci dňa

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()));
}

Práca ako s FTP – skript na synchronizáciu priečinka

Tímy, ktoré pracovali s FTP, môžu udržiavať priečinok na vlastnom serveri synchronizovaný s priečinkom spoločnosti: naplánovaná úloha sťahuje nové súbory (napríklad POD) a nahráva súbory, ktoré vložíte do lokálneho priečinka. Skript PowerShell nižšie robí oboje; spúšťajte ho každých niekoľko minút z Plánovača úloh Windows (v Linuxe použite riadky curl s 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
}

Presun spoločnosti z FTP na API

Manažér prepne v Nastavenia → API a súbory → Súbory sa presúvajú cez: API. Od tej chvíle sa na FTP spoločnosti nič neposiela a každý súbor je namiesto toho v priečinku spoločnosti:

S FTPS API
Súbor objednávok dávate na FTPPUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv
Podpísané POD sa posielajú do /POD/ na vašom FTPGET /api/v1/pod?date=… / /api/v1/pod/archive?date=…
Export trás sa posiela do /orders/orders_files/routes_export_YYYY_MM_DD.csv
Zostavy sa posielajú do /orders/YYYY/MM/reports/YYYY/MM/

Nové spoločnosti pracujú s API od začiatku. Návrat na FTP je ten istý prepínač.

Spoločnosti na starom serveri OptiRoutes

Spoločnosť, ktorá ešte pracuje so starým serverom OptiRoutes (WEB), môže použiť API pre svoje podpísané POD: vytvorte kľúč s oprávnením pod:read a použite /api/v1/pod, /api/v1/pod/archive a /api/v1/files/download?path=pod/…. Jej ostatné súbory sa naďalej presúvajú ako dnes, kým spoločnosť neprejde na nový server.

Chyby

Chyba vráti {"ok": false, "error": "<code>", "message": "<explanation>"}.

HTTPerrorČo robiť
401missing_key / invalid_keyPošlite kľúč; skontrolujte, či nebol zrušený alebo či nevypršal.
403scope_missingKľúču chýba oprávnenie – vytvorte kľúč s ním.
403ip_not_allowedVolajte z povolenej adresy alebo aktualizujte adresy kľúča.
403folder_read_onlyNahrávajte len do orders_files/, inbox/, podBaseFile/ alebo pod/<file>.pdf.
400invalid_path / invalid_dateCesty sú relatívne (orders_files/a.csv), dátumy sú YYYY-MM-DD.
404not_found / no_pod_filesTaký súbor neexistuje / v ten deň nie je žiadny POD.
413file_too_largeNajviac 50 MB na súbor.
429rate_limitedPočkajte minútu a skúste to znova.
502 / 503storage_unavailable / files_api_unavailableDočasné – skúste to znova o minútu.

Limity

Pomoc

Manažér spoločnosti vidí každý kľúč, jeho posledné použitie a posledné volania v Nastavenia → API a súbory. Pri čomkoľvek inom kontaktujte podporu OptiRoutes s číslom spoločnosti a časom volania – nikdy neposielajte samotný kľúč.