Ce este
Fiecare companie din OptiRoutes are propriul dosar privat de fișiere: comenzile pe care le încarcă, avizele de livrare semnate (POD) cu fotografiile și semnăturile lor, exporturile de rute și rapoartele de la sfârșitul zilei. API-ul de fișiere permite sistemelor tale să citească și să scrie direct în acest dosar, fără un server FTP la mijloc.
- Adresa:
https://srv2.optiroutes.com/api/v1— numai HTTPS. - Accesul: o cheie API pe care managerul companiei o creează în OptiRoutes, în Setări → API și fișiere. Nu este nevoie de nicio solicitare către suportul OptiRoutes.
- Toate tipurile de fișiere cu care lucrează sistemul astăzi: CSV, JSON, TXT, XLSX/XLS, PDF și imagini.
- Răspunsurile sunt în format JSON, cu excepția descărcărilor de fișiere, care returnează chiar fișierul.
Începe în 3 pași
- Creează o cheie. În OptiRoutes, managerul deschide Setări → API și fișiere, face clic pe Cheie nouă, îi dă un nume (de exemplu „serverul ERP”), alege permisiunile și copiază cheia. Cheia este afișată o singură dată.
- Verifică conexiunea.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Descarcă POD-urile semnate de azi într-un singur fișier ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Securitate — te rugăm să citești
- Tratează cheia ca pe o parolă. Păstreaz-o într-un seif de secrete sau într-o variabilă de mediu pe serverul tău. Nu o pune niciodată într-o pagină web, într-o aplicație mobilă, într-un e-mail, într-un tichet sau în controlul versiunilor.
- Privilegii minime. Dă fiecărui sistem propria cheie, cu doar permisiunile de care are nevoie:
pod:read(numai POD-uri semnate),files:read(citirea tuturor fișierelor companiei),files:write(încărcarea comenzilor și a fișierelor din căsuța de intrare). - Limitează adresele. Când serverul tău are o adresă IP fixă, adaug-o la cheie („Adrese permise”). Un apel de la orice altă adresă este refuzat.
- Expirare și rotire. O cheie poate expira după un anumit număr de zile. Pentru rotire: creează o cheie nouă, treci sistemul tău pe ea, apoi revocă cheia veche — fără nicio întrerupere.
- Revocă imediat o cheie care ar putea fi compromisă: Setări → API și fișiere → Revocă cheia. Încetează să funcționeze în cel mult 30 de secunde.
- Audit. Fiecare apel este înregistrat (ora, adresa, fișierul, răspunsul) și afișat managerului în același ecran.
- OptiRoutes păstrează doar o amprentă (SHA-256) a fiecărei chei, niciodată cheia în sine. Conexiunile se fac numai prin HTTPS (TLS 1.2+).
- O cheie ajunge doar la dosarul propriei companii. Fișierele altor companii și dosarele interne ale sistemului nu pot fi accesate niciodată.
Autentificare
Trimite cheia în fiecare cerere, într-unul dintre aceste antete:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxO cheie arată astfel: opr_2813_… (numărul companiei, urmat de 32 de caractere aleatorii).
Dosarul companiei
| Dosar | Ce conține | Cine scrie |
|---|---|---|
orders_files/ | Fișierul zilnic de comenzi pe care îl încarcă OptiRoutes: orders_files/YYYY-MM-DD.csv (sau .json / .TXT, conform setării din Setări → Incarcare). Exporturi de rute: orders_files/routes_export_YYYY_MM_DD.csv. | Tu (comenzi) · OptiRoutes (exporturi) |
pod/YYYY/MM/DD/ | POD-urile semnate din ziua respectivă: <order>_sign_….pdf, semnătura și fotografiile (<order>_….png/jpg). | OptiRoutes |
pod/ | Avizele de livrare sursă care urmează să fie semnate în aplicația șoferului: pod/<order number>.pdf. | Tu |
reports/YYYY/MM/ | Rapoartele de sfârșit de zi și cele de retururi. | OptiRoutes |
podBaseFile/ | Formularul de bază al POD. | Tu |
inbox/ | Dosar liber pentru fișierele pe care vrei să le predai. | Tu |
Referință
| Apel | Permisiune | Ce face |
|---|---|---|
GET /api/v1/me | oricare | Verifică cheia. Răspunde cu numărul companiei, permisiunile cheii și adresa ta. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: numai pod/) | Listează un nivel de dosar: fișiere (nume, cale, dimensiune, data modificării) și subdosare. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: numai pod/) | Descarcă un fișier. |
PUT /api/v1/files?path=<file> | files:write | Încarcă un fișier (corpul cererii este fișierul, sau un formular multipart cu un câmp file). Un fișier existent este înlocuit. Cel mult 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Șterge un fișier încărcat de tine (acolo unde ai voie să încarci). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Fișierele POD dintr-o zi, fiecare cu numărul comenzii și tipul: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Toate fișierele POD ale zilei într-un singur fișier ZIP. |
Exemplu de răspuns pentru o listare:
{
"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" }
]
}Sarcini frecvente
Încărcarea fișierului de comenzi de azi
# 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 încarcă fișierul așa cum îl încarcă și astăzi (prin încărcarea automată din Setări → Incarcare sau prin „Încarcă fișier” al utilizatorului).
Descărcarea POD-urilor semnate ale unei comenzi
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"
Descărcarea raportului de sfârșit de zi
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()));
}Lucrează ca în FTP — un script de sincronizare a unui dosar
Echipele care lucrau cu FTP pot menține un dosar de pe propriul server sincronizat cu dosarul companiei: o sarcină programată descarcă fișierele noi (de exemplu POD-urile) și încarcă fișierele pe care le pui într-un dosar local. Scriptul PowerShell de mai jos le face pe amândouă; rulează-l la fiecare câteva minute din Windows Task Scheduler (pe Linux folosește liniile curl cu 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
}Trecerea unei companii de la FTP la API
Managerul face trecerea în Setări → API și fișiere → Cum circulă fișierele companiei: API (recomandat). Din acel moment nu se mai trimite nimic către FTP-ul companiei, iar fiecare fișier se află în schimb în dosarul companiei:
| Cu FTP | Cu API-ul |
|---|---|
| Pui fișierul de comenzi pe FTP | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
POD-urile semnate sunt trimise în /POD/ pe FTP-ul tău | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Exportul de rute este trimis în /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Rapoartele sunt trimise în /orders/YYYY/MM/ | reports/YYYY/MM/ |
Companiile noi lucrează cu API-ul de la început. Revenirea la FTP se face cu același comutator.
Companii pe vechiul server OptiRoutes
O companie care încă lucrează cu vechiul server OptiRoutes (WEB) poate folosi API-ul pentru POD-urile sale semnate: creează o cheie cu permisiunea pod:read și folosește /api/v1/pod, /api/v1/pod/archive și /api/v1/files/download?path=pod/…. Celelalte fișiere ale sale circulă în continuare ca astăzi, până când compania trece pe noul server.
Erori
O eroare răspunde cu {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Ce trebuie făcut |
|---|---|---|
| 401 | missing_key / invalid_key | Trimite cheia; verifică dacă nu a fost revocată sau nu a expirat. |
| 403 | scope_missing | Cheii îi lipsește permisiunea — creează o cheie care o are. |
| 403 | ip_not_allowed | Apelează de la o adresă permisă sau actualizează adresele cheii. |
| 403 | folder_read_only | Încarcă numai în orders_files/, inbox/, podBaseFile/ sau pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Căile sunt relative (orders_files/a.csv), iar datele au formatul YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Nu există un astfel de fișier / nu există POD în ziua respectivă. |
| 413 | file_too_large | Cel mult 50 MB pe fișier. |
| 429 | rate_limited | Așteaptă un minut și încearcă din nou. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Temporar — încearcă din nou peste un minut. |
Limite
- 300 de cereri pe minut pentru fiecare cheie.
- 50 MB pe fișier.
- 20 de chei active pe companie.
- Listarea unui dosar returnează cel mult 5.000 de intrări; pentru mai multe, listează subdosarele (de exemplu, o zi de POD-uri).
Ajutor
Managerul companiei vede fiecare cheie, ultima ei utilizare și ultimele apeluri în Setări → API și fișiere. Pentru orice altceva, contactează suportul OptiRoutes cu numărul companiei și ora apelului — nu trimite niciodată cheia în sine.