Kaj je to
Vsako podjetje v OptiRoutes ima svojo zasebno mapo datotek: naročila, ki jih naloži, podpisane dobavnice (POD) z njihovimi fotografijami in podpisi, izvoze poti in poročila ob koncu dneva. Files API vašim sistemom omogoča neposredno branje in pisanje v to mapo, brez vmesnega strežnika FTP.
- Naslov:
https://srv2.optiroutes.com/api/v1— samo HTTPS. - Dostop: ključ API, ki ga vodja podjetja ustvari v OptiRoutes, v Nastavitve → API in datoteke. Zahteva podpori OptiRoutes ni potrebna.
- Vse vrste datotek, s katerimi sistem dela danes: CSV, JSON, TXT, XLSX/XLS, PDF in slike.
- Odgovori so v obliki JSON, razen pri prenosu datotek, ki vrne samo datoteko.
Začetek v 3 korakih
- Ustvarite ključ. Vodja v OptiRoutes odpre Nastavitve → API in datoteke, klikne Nov ključ, mu da ime (na primer „strežnik ERP“), izbere dovoljenja in kopira ključ. Ključ je prikazan samo enkrat.
- Preverite povezavo.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Prenesite današnje podpisane POD kot en ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Varnost — preberite
- S ključem ravnajte kot z geslom. Hranite ga v shrambi skrivnosti ali v spremenljivki okolja na svojem strežniku. Nikoli ga ne vstavljajte v spletno stran, mobilno aplikacijo, e-poštno sporočilo, zahtevek ali sistem za upravljanje izvorne kode.
- Najmanjša potrebna dovoljenja. Vsakemu sistemu dajte svoj ključ samo z dovoljenji, ki jih potrebuje:
pod:read(samo podpisani POD),files:read(branje vseh datotek podjetja),files:write(nalaganje naročil in datotek v inbox). - Omejite naslove. Če ima vaš strežnik fiksen naslov IP, ga dodajte ključu („Dovoljeni naslovi“). Klic s katerega koli drugega naslova je zavrnjen.
- Potek in menjava. Ključ lahko poteče po določenem številu dni. Za menjavo: ustvarite nov ključ, preklopite svoj sistem nanj, nato prekličite starega — brez prekinitve delovanja.
- Takoj prekličite ključ, ki je morda ušel: Nastavitve → API in datoteke → Prekliči. Nehal bo delovati v 30 sekundah.
- Revizija. Vsak klic se zabeleži (čas, naslov, datoteka, odgovor) in je prikazan vodji na istem zaslonu.
- OptiRoutes hrani samo prstni odtis (SHA-256) vsakega ključa, nikoli samega ključa. Povezave so samo prek HTTPS (TLS 1.2+).
- Ključ ima dostop samo do mape svojega podjetja. Do datotek drugih podjetij in notranjih map sistema ni mogoče priti nikoli.
Preverjanje pristnosti
Ključ pošljite v vsaki zahtevi, v eni od teh glav:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKljuč je videti kot opr_2813_… (številka podjetja, nato 32 naključnih znakov).
Mapa podjetja
| Mapa | Kaj je v njej | Kdo piše |
|---|---|---|
orders_files/ | Dnevna datoteka naročil, ki jo naloži OptiRoutes: orders_files/YYYY-MM-DD.csv (ali .json / .TXT, kot je nastavljeno v Nastavitve → Nalaganje). Izvozi poti: orders_files/routes_export_YYYY_MM_DD.csv. | Vi (naročila) · OptiRoutes (izvozi) |
pod/YYYY/MM/DD/ | Podpisani POD tega dne: <order>_sign_….pdf, podpis in fotografije (<order>_….png/jpg). | OptiRoutes |
pod/ | Izvirne dobavnice za podpis v aplikaciji za voznike: pod/<order number>.pdf. | Vi |
reports/YYYY/MM/ | Poročila ob koncu dneva in poročila o vračilih. | OptiRoutes |
podBaseFile/ | Osnovni obrazec POD. | Vi |
inbox/ | Prosta mapa za datoteke, ki jih želite predati. | Vi |
Referenca
| Klic | Dovoljenje | Kaj naredi |
|---|---|---|
GET /api/v1/me | katero koli | Preveri ključ. Vrne številko podjetja, dovoljenja ključa in vaš naslov. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: samo pod/) | Navede eno raven mape: datoteke (ime, pot, velikost, spremenjeno) in podmape. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: samo pod/) | Prenese eno datoteko. |
PUT /api/v1/files?path=<file> | files:write | Naloži datoteko (telo zahteve je datoteka ali obrazec multipart s poljem file). Obstoječa datoteka se nadomesti. Največ 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Izbriše datoteko, ki ste jo naložili (tam, kamor smete nalagati). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Datoteke POD določenega dne, vsaka s številko naročila in vrsto: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Vse datoteke POD dneva kot en ZIP. |
Primer odgovora seznama:
{
"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" }
]
}Pogosta opravila
Naložite današnjo datoteko naročil
# 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 naloži datoteko tako, kot jo nalaga danes (samodejno nalaganje v Nastavitve → Nalaganje ali uporabnikovo „Naloži datoteko“).
Prenesite podpisane POD enega naročila
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"
Prenesite poročilo ob koncu dneva
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()));
}Delo kot s FTP — skript za sinhronizacijo mape
Ekipe, ki so delale s FTP, lahko mapo na lastnem strežniku sinhronizirajo z mapo podjetja: načrtovano opravilo prenese nove datoteke (na primer POD) in naloži datoteke, ki jih odložite v lokalno mapo. Spodnji skript PowerShell naredi oboje; zaženite ga vsakih nekaj minut iz Windows Task Scheduler (v Linuxu uporabite vrstice 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
}Prehod podjetja s FTP na API
Vodja preklopi v Nastavitve → API in datoteke → Datoteke se premikajo prek: API. Od tega trenutka se na FTP podjetja ne pošilja nič več, vsaka datoteka pa je namesto tega v mapi podjetja:
| S FTP | Z API |
|---|---|
| Datoteko naročil postavite na FTP | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Podpisani POD, poslani v /POD/ na vašem FTP | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Izvoz poti, poslan v /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Poročila, poslana v /orders/YYYY/MM/ | reports/YYYY/MM/ |
Nova podjetja delajo z API od začetka. Vrnitev na FTP je isto stikalo.
Podjetja na starem strežniku OptiRoutes
Podjetje, ki še dela s starim strežnikom OptiRoutes (WEB), lahko API uporablja za svoje podpisane POD: ustvarite ključ z dovoljenjem pod:read in uporabite /api/v1/pod, /api/v1/pod/archive in /api/v1/files/download?path=pod/…. Njegove druge datoteke se še naprej premikajo kot danes, dokler podjetje ne preide na novi strežnik.
Napake
Napaka vrne {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Kaj storiti |
|---|---|---|
| 401 | missing_key / invalid_key | Pošljite ključ; preverite, da ni bil preklican ali da ni potekel. |
| 403 | scope_missing | Ključ nima dovoljenja — ustvarite ključ z njim. |
| 403 | ip_not_allowed | Kličite z dovoljenega naslova ali posodobite naslove ključa. |
| 403 | folder_read_only | Nalagajte samo v orders_files/, inbox/, podBaseFile/ ali pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Poti so relativne (orders_files/a.csv), datumi so v obliki YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Takšne datoteke ni / tega dne ni POD. |
| 413 | file_too_large | Največ 50 MB na datoteko. |
| 429 | rate_limited | Počakajte minuto in poskusite znova. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Začasno — poskusite znova čez minuto. |
Omejitve
- 300 zahtev na minuto na ključ.
- 50 MB na datoteko.
- 20 aktivnih ključev na podjetje.
- Seznam mape vrne do 5.000 vnosov; za več navedite podmape (na primer en dan POD).
Pomoč
Vodja podjetja v Nastavitve → API in datoteke vidi vsak ključ, njegovo zadnjo uporabo in zadnje klice. Za vse drugo se obrnite na podporo OptiRoutes s številko podjetja in časom klica — nikoli ne pošiljajte samega ključa.