Czym jest
Każda firma w OptiRoutes ma własny prywatny folder plików: wczytywane zamówienia, podpisane dowody dostawy (POD) ze zdjęciami i podpisami, eksporty tras oraz raporty na koniec dnia. Files API pozwala Twoim systemom bezpośrednio odczytywać i zapisywać ten folder, bez serwera FTP pośrodku.
- Adres:
https://srv2.optiroutes.com/api/v1– tylko HTTPS. - Dostęp: klucz API, który kierownik firmy tworzy w OptiRoutes, w Ustawienia → API i pliki. Nie trzeba zgłaszać się do pomocy technicznej OptiRoutes.
- Każdy typ pliku, z którym system obecnie pracuje: CSV, JSON, TXT, XLSX/XLS, PDF i obrazy.
- Odpowiedzi są w formacie JSON, z wyjątkiem pobierania plików, które zwraca sam plik.
Start w 3 krokach
- Utwórz klucz. W OptiRoutes kierownik otwiera Ustawienia → API i pliki, klika Nowy klucz, nadaje mu nazwę (na przykład „serwer ERP”), wybiera uprawnienia i kopiuje klucz. Klucz jest wyświetlany tylko raz.
- Sprawdź połączenie.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Pobierz dzisiejsze podpisane POD jako jeden plik ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Bezpieczeństwo – przeczytaj
- Traktuj klucz jak hasło. Przechowuj go w magazynie sekretów lub w zmiennej środowiskowej na swoim serwerze. Nigdy nie umieszczaj go na stronie internetowej, w aplikacji mobilnej, e-mailu, zgłoszeniu ani w repozytorium kodu.
- Minimalne uprawnienia. Daj każdemu systemowi własny klucz tylko z potrzebnymi uprawnieniami:
pod:read(tylko podpisane POD),files:read(odczyt wszystkich plików firmy),files:write(przesyłanie zamówień i plików do inbox). - Ogranicz adresy. Gdy Twój serwer ma stały adres IP, dodaj go do klucza („Dozwolone adresy”). Wywołanie z każdego innego adresu jest odrzucane.
- Wygaśnięcie i rotacja. Klucz może wygasać po określonej liczbie dni. Aby go wymienić: utwórz nowy klucz, przełącz na niego swój system, a następnie unieważnij stary – bez przestojów.
- Natychmiast unieważnij klucz, który mógł wyciec: Ustawienia → API i pliki → Unieważnij. Przestaje działać w ciągu 30 sekund.
- Audyt. Każde wywołanie jest rejestrowane (czas, adres, plik, odpowiedź) i wyświetlane kierownikowi na tym samym ekranie.
- OptiRoutes przechowuje tylko odcisk (SHA-256) każdego klucza, nigdy sam klucz. Połączenia odbywają się wyłącznie przez HTTPS (TLS 1.2+).
- Klucz ma dostęp tylko do folderu własnej firmy. Plików innych firm i wewnętrznych folderów systemu nigdy nie można osiągnąć.
Uwierzytelnianie
Wysyłaj klucz w każdym żądaniu, w jednym z tych nagłówków:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKlucz wygląda jak opr_2813_… (numer firmy, a następnie 32 losowe znaki).
Folder firmy
| Folder | Co zawiera | Kto zapisuje |
|---|---|---|
orders_files/ | Dzienny plik zamówień wczytywany przez OptiRoutes: orders_files/YYYY-MM-DD.csv (lub .json / .TXT, zgodnie z Ustawienia → Wczytywanie). Eksporty tras: orders_files/routes_export_YYYY_MM_DD.csv. | Ty (zamówienia) · OptiRoutes (eksporty) |
pod/YYYY/MM/DD/ | Podpisane POD z danego dnia: <order>_sign_….pdf, podpis i zdjęcia (<order>_….png/jpg). | OptiRoutes |
pod/ | Źródłowe dowody dostawy do podpisania w aplikacji kierowcy: pod/<order number>.pdf. | Ty |
reports/YYYY/MM/ | Raporty na koniec dnia i raporty zwrotów. | OptiRoutes |
podBaseFile/ | Formularz bazowy POD. | Ty |
inbox/ | Dowolny folder na pliki, które chcesz przekazać. | Ty |
Dokumentacja
| Wywołanie | Uprawnienie | Co robi |
|---|---|---|
GET /api/v1/me | dowolne | Sprawdza klucz. Zwraca numer firmy, uprawnienia klucza i Twój adres. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: tylko pod/) | Wyświetla jeden poziom folderu: pliki (nazwa, ścieżka, rozmiar, data modyfikacji) i podfoldery. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: tylko pod/) | Pobiera jeden plik. |
PUT /api/v1/files?path=<file> | files:write | Przesyła plik (treścią żądania jest plik lub formularz multipart z polem file). Istniejący plik jest zastępowany. Maksymalnie 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Usuwa przesłany przez Ciebie plik (tam, gdzie możesz przesyłać). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Pliki POD z danego dnia, każdy z numerem zamówienia i rodzajem: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Wszystkie pliki POD z danego dnia jako jeden plik ZIP. |
Przykładowa odpowiedź listy:
{
"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" }
]
}Typowe zadania
Prześlij dzisiejszy plik zamówień
# 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 wczytuje plik tak jak obecnie (automatyczne wczytywanie z Ustawienia → Wczytywanie lub „Wczytaj plik” użytkownika).
Pobierz podpisane POD jednego zamówienia
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"
Pobierz raport na koniec dnia
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()));
}Praca jak z FTP – skrypt synchronizacji folderu
Zespoły, które pracowały z FTP, mogą utrzymywać folder na własnym serwerze zsynchronizowany z folderem firmy: zaplanowane zadanie pobiera nowe pliki (na przykład POD) i przesyła pliki umieszczone w folderze lokalnym. Poniższy skrypt PowerShell robi jedno i drugie; uruchamiaj go co kilka minut z Harmonogramu zadań Windows (w systemie Linux użyj wierszy curl z 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
}Przeniesienie firmy z FTP na API
Kierownik przełącza w Ustawienia → API i pliki → Pliki przemieszczają się przez: API. Od tej chwili nic nie jest wysyłane na FTP firmy, a każdy plik znajduje się zamiast tego w folderze firmy:
| Z FTP | Z API |
|---|---|
| Umieszczasz plik zamówień na FTP | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Podpisane POD wysyłane do /POD/ na Twoim FTP | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Eksport tras wysyłany do /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Raporty wysyłane do /orders/YYYY/MM/ | reports/YYYY/MM/ |
Nowe firmy od początku pracują z API. Powrót do FTP to ten sam przełącznik.
Firmy na starym serwerze OptiRoutes
Firma, która nadal pracuje ze starym serwerem OptiRoutes (WEB), może korzystać z API do pobierania podpisanych POD: utwórz klucz z uprawnieniem pod:read i używaj /api/v1/pod, /api/v1/pod/archive oraz /api/v1/files/download?path=pod/…. Pozostałe pliki firmy nadal przemieszczają się tak jak obecnie, dopóki firma nie przejdzie na nowy serwer.
Błędy
Błąd zwraca {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Co zrobić |
|---|---|---|
| 401 | missing_key / invalid_key | Wyślij klucz; sprawdź, czy nie został unieważniony ani nie wygasł. |
| 403 | scope_missing | Klucz nie ma uprawnienia – utwórz klucz, który je ma. |
| 403 | ip_not_allowed | Wywołuj z dozwolonego adresu lub zaktualizuj adresy klucza. |
| 403 | folder_read_only | Przesyłaj tylko do orders_files/, inbox/, podBaseFile/ lub pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Ścieżki są względne (orders_files/a.csv), daty mają format YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Nie ma takiego pliku / brak POD w tym dniu. |
| 413 | file_too_large | Maksymalnie 50 MB na plik. |
| 429 | rate_limited | Odczekaj minutę i spróbuj ponownie. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Tymczasowe – spróbuj ponownie za minutę. |
Limity
- 300 żądań na minutę na klucz.
- 50 MB na plik.
- 20 aktywnych kluczy na firmę.
- Lista folderu zwraca do 5000 pozycji; aby uzyskać więcej, wyświetlaj podfoldery (na przykład POD z jednego dnia).
Pomoc
Kierownik firmy widzi każdy klucz, jego ostatnie użycie i ostatnie wywołania w Ustawienia → API i pliki. W pozostałych sprawach skontaktuj się z pomocą techniczną OptiRoutes, podając numer firmy i czas wywołania – nigdy nie wysyłaj samego klucza.