Što je to
Svaka tvrtka u OptiRoutesu ima vlastitu privatnu mapu datoteka: narudžbe koje učitava, potpisane otpremnice (POD) s fotografijama i potpisima, izvoze ruta i izvješća na kraju dana. Files API omogućuje vašim sustavima da izravno čitaju i pišu u tu mapu, bez FTP poslužitelja između.
- Adresa:
https://srv2.optiroutes.com/api/v1– samo HTTPS. - Pristup: API ključ koji voditelj tvrtke izrađuje u OptiRoutesu, u Postavke → API i datoteke. Nije potreban nikakav zahtjev podršci OptiRoutesa.
- Sve vrste datoteka s kojima sustav danas radi: CSV, JSON, TXT, XLSX/XLS, PDF i slike.
- Odgovori su u formatu JSON, osim preuzimanja datoteka, koja vraćaju samu datoteku.
Početak u 3 koraka
- Izradite ključ. U OptiRoutesu voditelj otvara Postavke → API i datoteke, klikne Novi ključ, daje mu naziv (na primjer "ERP poslužitelj"), odabire ovlasti i kopira ključ. Ključ se prikazuje samo jednom.
- Provjerite vezu.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Preuzmite današnje potpisane POD-ove kao jedan ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Sigurnost – pročitajte
- Postupajte s ključem kao s lozinkom. Čuvajte ga u spremištu tajni ili u varijabli okruženja na svom poslužitelju. Nikada ga ne stavljajte na web-stranicu, u mobilnu aplikaciju, e-poruku, prijavu problema ili sustav za upravljanje izvornim kodom.
- Najmanje ovlasti. Dajte svakom sustavu vlastiti ključ sa samo onim ovlastima koje su mu potrebne:
pod:read(samo potpisani POD-ovi),files:read(čitanje svih datoteka tvrtke),files:write(učitavanje narudžbi i datoteka u ulaznu mapu). - Ograničite adrese. Kada vaš poslužitelj ima fiksnu IP adresu, dodajte je ključu ("Dopuštene adrese"). Poziv s bilo koje druge adrese odbija se.
- Istek i rotacija. Ključ može isteći nakon određenog broja dana. Za rotaciju: izradite novi ključ, prebacite svoj sustav na njega, a zatim opozovite stari – nema prekida rada.
- Odmah opozovite ključ koji je možda procurio: Postavke → API i datoteke → Opozovi. Prestaje raditi u roku od 30 sekundi.
- Revizija. Svaki se poziv bilježi (vrijeme, adresa, datoteka, odgovor) i prikazuje voditelju na istom zaslonu.
- OptiRoutes čuva samo otisak (SHA-256) svakog ključa, nikada sam ključ. Veze su isključivo HTTPS (TLS 1.2+).
- Ključ pristupa samo mapi vlastite tvrtke. Datotekama drugih tvrtki i internim mapama sustava nikada se ne može pristupiti.
Autentifikacija
Pošaljite ključ u svakom zahtjevu, u jednom od ovih zaglavlja:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKljuč izgleda kao opr_2813_… (broj tvrtke, a zatim 32 nasumična znaka).
Mapa tvrtke
| Mapa | Što sadrži | Tko piše |
|---|---|---|
orders_files/ | Dnevna datoteka narudžbi koju OptiRoutes učitava: orders_files/YYYY-MM-DD.csv (ili .json / .TXT, kako je postavljeno u Postavke → Učitavanje narudžbi). Izvozi ruta: orders_files/routes_export_YYYY_MM_DD.csv. | Vi (narudžbe) · OptiRoutes (izvozi) |
pod/YYYY/MM/DD/ | Potpisani POD-ovi tog dana: <order>_sign_….pdf, potpis i fotografije (<order>_….png/jpg). | OptiRoutes |
pod/ | Izvorne otpremnice za potpisivanje u aplikaciji za vozače: pod/<order number>.pdf. | Vi |
reports/YYYY/MM/ | Izvješća na kraju dana i izvješća o povratima. | OptiRoutes |
podBaseFile/ | Osnovni obrazac POD-a. | Vi |
inbox/ | Slobodna mapa za datoteke koje želite predati. | Vi |
Referenca
| Poziv | Ovlast | Što radi |
|---|---|---|
GET /api/v1/me | bilo koja | Provjerava ključ. Vraća broj tvrtke, ovlasti ključa i vašu adresu. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: samo pod/) | Ispisuje jednu razinu mape: datoteke (naziv, putanja, veličina, izmjena) i podmape. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: samo pod/) | Preuzima jednu datoteku. |
PUT /api/v1/files?path=<file> | files:write | Učitava datoteku (tijelo zahtjeva je datoteka ili višedijelni obrazac s poljem file). Postojeća datoteka se zamjenjuje. Najviše 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Briše datoteku koju ste učitali (tamo gdje smijete učitavati). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | POD datoteke jednog dana, svaka s brojem narudžbe i vrstom: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Sve POD datoteke dana kao jedan ZIP. |
Primjer odgovora na ispis mape:
{
"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" }
]
}Uobičajeni zadaci
Učitavanje današnje datoteke narudžbi
# 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 učitava datoteku onako kako je učitava i danas (automatsko učitavanje iz Postavke → Učitavanje narudžbi ili korisnikovo "Učitaj datoteku").
Preuzimanje potpisanih POD-ova jedne narudžbe
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"
Preuzimanje izvješća na kraju dana
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()));
}Rad kao s FTP-om – skripta za sinkronizaciju mape
Timovi koji su radili s FTP-om mogu mapu na vlastitom poslužitelju održavati sinkroniziranom s mapom tvrtke: zakazani zadatak preuzima nove datoteke (na primjer POD-ove) i učitava datoteke koje stavite u lokalnu mapu. PowerShell skripta u nastavku radi oboje; pokrećite je svakih nekoliko minuta iz Windows Task Schedulera (na Linuxu upotrijebite curl retke s cronom).
# 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
}Prelazak tvrtke s FTP-a na API
Voditelj prebacuje u Postavke → API i datoteke → Datoteke se prenose putem: API. Od tog trenutka ništa se ne šalje na FTP tvrtke, a sve su datoteke umjesto toga u mapi tvrtke:
| S FTP-om | S API-jem |
|---|---|
| Datoteku narudžbi stavljate na FTP | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Potpisani POD-ovi šalju se u /POD/ na vašem FTP-u | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Izvoz ruta šalje se u /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Izvješća se šalju u /orders/YYYY/MM/ | reports/YYYY/MM/ |
Nove tvrtke od početka rade s API-jem. Povratak na FTP izvodi se istim prekidačem.
Tvrtke na starom poslužitelju OptiRoutesa
Tvrtka koja još radi sa starim poslužiteljem OptiRoutesa (WEB) može API koristiti za svoje potpisane POD-ove: izradite ključ s ovlašću pod:read i koristite /api/v1/pod, /api/v1/pod/archive i /api/v1/files/download?path=pod/…. Ostale se njezine datoteke i dalje prenose kao i danas, dok tvrtka ne prijeđe na novi poslužitelj.
Pogreške
Pogreška vraća {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Što učiniti |
|---|---|---|
| 401 | missing_key / invalid_key | Pošaljite ključ; provjerite nije li opozvan ili istekao. |
| 403 | scope_missing | Ključu nedostaje ovlast – izradite ključ s njom. |
| 403 | ip_not_allowed | Pozovite s dopuštene adrese ili ažurirajte adrese ključa. |
| 403 | folder_read_only | Učitavajte samo u orders_files/, inbox/, podBaseFile/ ili pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Putanje su relativne (orders_files/a.csv), datumi su u formatu YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Nema takve datoteke / nema POD-a tog dana. |
| 413 | file_too_large | Najviše 50 MB po datoteci. |
| 429 | rate_limited | Pričekajte minutu i pokušajte ponovno. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Privremeno – pokušajte ponovno za minutu. |
Ograničenja
- 300 zahtjeva u minuti po ključu.
- 50 MB po datoteci.
- 20 aktivnih ključeva po tvrtki.
- Ispis mape vraća do 5.000 stavki; za više ispišite podmape (na primjer jedan dan POD-ova).
Pomoć
Voditelj tvrtke vidi svaki ključ, njegovu zadnju upotrebu i zadnje pozive u Postavke → API i datoteke. Za sve ostalo obratite se podršci OptiRoutesa s brojem tvrtke i vremenom poziva – nikada ne šaljite sam ključ.