Vad det är
Varje företag i OptiRoutes har en egen privat mapp med filer: leveranserna som läses in, de signerade följesedlarna (POD) med foton och signaturer, ruttexporterna och dagsavslutsrapporterna. Med Files API kan era system läsa och skriva i mappen direkt, utan någon FTP-server emellan.
- Adress:
https://srv2.optiroutes.com/api/v1– endast HTTPS. - Åtkomst: en API-nyckel som företagets chef skapar i OptiRoutes, under Inställningar → API och filer. Ingen begäran till OptiRoutes support behövs.
- Alla filtyper som systemet hanterar i dag: CSV, JSON, TXT, XLSX/XLS, PDF och bilder.
- Svaren är JSON, utom vid filnedladdning, som returnerar själva filen.
Kom igång i 3 steg
- Skapa en nyckel. I OptiRoutes öppnar chefen Inställningar → API och filer, klickar på Ny nyckel, ger den ett namn (till exempel ”ERP-server”), väljer behörigheter och kopierar nyckeln. Nyckeln visas en gång.
- Kontrollera anslutningen.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Ladda ned dagens signerade POD som en ZIP-fil:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Säkerhet – läs detta
- Behandla nyckeln som ett lösenord. Förvara den i ett hemlighetsvalv eller en miljövariabel på er server. Lägg den aldrig på en webbsida, i en mobilapp, ett e-postmeddelande, ett ärende eller i versionshantering.
- Minsta möjliga behörighet. Ge varje system en egen nyckel med endast de behörigheter det behöver:
pod:read(endast signerade POD),files:read(läsa alla företagets filer),files:write(ladda upp leveranser och filer till inkorgen). - Begränsa adresserna. Om er server har en fast IP-adress, lägg till den på nyckeln (”Tillåtna adresser”). Anrop från alla andra adresser nekas.
- Utgång och byte. En nyckel kan sluta gälla efter ett antal dagar. Så byter du: skapa en ny nyckel, låt systemet använda den och återkalla sedan den gamla – utan avbrott.
- Återkalla genast en nyckel som kan ha läckt: Inställningar → API och filer → Återkalla. Den slutar fungera inom 30 sekunder.
- Granskning. Varje anrop loggas (tid, adress, fil, svar) och visas för chefen på samma skärm.
- OptiRoutes sparar endast ett fingeravtryck (SHA-256) av varje nyckel, aldrig själva nyckeln. Anslutningar sker endast över HTTPS (TLS 1.2+).
- En nyckel når endast det egna företagets mapp. Andra företags filer och systemets interna mappar kan aldrig nås.
Autentisering
Skicka nyckeln i varje begäran, i en av dessa headers:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEn nyckel ser ut så här: opr_2813_… (företagsnumret, sedan 32 slumpmässiga tecken).
Företagets mapp
| Mapp | Innehåll | Vem skriver |
|---|---|---|
orders_files/ | Den dagliga leveransfilen som OptiRoutes läser in: orders_files/YYYY-MM-DD.csv (eller .json / .TXT, enligt Inställningar → Inläsning av leveranser). Ruttexporter: orders_files/routes_export_YYYY_MM_DD.csv. | Ni (leveranser) · OptiRoutes (exporter) |
pod/YYYY/MM/DD/ | Dagens signerade POD: <order>_sign_….pdf, signaturen och fotona (<order>_….png/jpg). | OptiRoutes |
pod/ | Ursprungliga följesedlar som ska signeras i förarappen: pod/<order number>.pdf. | Ni |
reports/YYYY/MM/ | Rapporter för dagsavslut och returer. | OptiRoutes |
podBaseFile/ | POD-grundformuläret. | Ni |
inbox/ | Fri mapp för filer som ni vill lämna över. | Ni |
Referens
| Anrop | Behörighet | Vad det gör |
|---|---|---|
GET /api/v1/me | valfri | Kontrollerar nyckeln. Svarar med företagsnumret, nyckelns behörigheter och er adress. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: endast pod/) | Listar en mappnivå: filer (namn, sökväg, storlek, ändrad) och undermappar. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: endast pod/) | Laddar ned en fil. |
PUT /api/v1/files?path=<file> | files:write | Laddar upp en fil (begärans innehåll är filen, eller ett multipart-formulär med fältet file). En befintlig fil ersätts. Högst 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Tar bort en fil som ni har laddat upp (där ni får ladda upp). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Dagens POD-filer, var och en med leveransnummer och typ: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Alla dagens POD-filer som en ZIP-fil. |
Exempel på svar från en listning:
{
"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" }
]
}Vanliga uppgifter
Ladda upp dagens leveransfil
# 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 läser in filen på samma sätt som i dag (den automatiska inläsningen i Inställningar → Inläsning av leveranser, eller användarens ”Läs in fil”).
Ladda ned de signerade POD för en leverans
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"
Ladda ned dagsavslutsrapporten
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()));
}Arbeta som med FTP – ett skript för mappsynkronisering
Team som har arbetat med FTP kan hålla en mapp på sin egen server synkroniserad med företagets mapp: en schemalagd uppgift laddar ned nya filer (till exempel POD) och laddar upp de filer ni lägger i en lokal mapp. PowerShell-skriptet nedan gör båda delarna; kör det med några minuters mellanrum från Windows Schemaläggaren (på Linux använder du curl-raderna med 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
}Flytta ett företag från FTP till API:t
Chefen byter i Inställningar → API och filer → Filer flyttas via: API. Från och med då skickas inget till företagets FTP, och alla filer finns i stället i företagets mapp:
| Med FTP | Med API:t |
|---|---|
| Ni lägger leveransfilen på FTP-servern | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Signerade POD skickas till /POD/ på er FTP | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Ruttexporten skickas till /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Rapporter skickas till /orders/YYYY/MM/ | reports/YYYY/MM/ |
Nya företag arbetar med API:t från början. Att gå tillbaka till FTP görs med samma omkopplare.
Företag på den gamla OptiRoutes-servern
Ett företag som fortfarande arbetar med den gamla OptiRoutes-servern (WEB) kan använda API:t för sina signerade POD: skapa en nyckel med behörigheten pod:read och använd /api/v1/pod, /api/v1/pod/archive och /api/v1/files/download?path=pod/…. Övriga filer fortsätter att flyttas som i dag, tills företaget går över till den nya servern.
Fel
Ett fel ger svaret {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Vad du gör |
|---|---|---|
| 401 | missing_key / invalid_key | Skicka nyckeln; kontrollera att den inte har återkallats eller gått ut. |
| 403 | scope_missing | Nyckeln saknar behörigheten – skapa en nyckel som har den. |
| 403 | ip_not_allowed | Anropa från en tillåten adress, eller uppdatera nyckelns adresser. |
| 403 | folder_read_only | Ladda bara upp till orders_files/, inbox/, podBaseFile/ eller pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Sökvägar är relativa (orders_files/a.csv), datum anges som YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Filen finns inte / ingen POD den dagen. |
| 413 | file_too_large | Högst 50 MB per fil. |
| 429 | rate_limited | Vänta en minut och försök igen. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Tillfälligt – försök igen om en minut. |
Gränser
- 300 begäranden per minut och nyckel.
- 50 MB per fil.
- 20 aktiva nycklar per företag.
- En mapplistning returnerar upp till 5 000 poster; lista undermappar (till exempel en dags POD) för fler.
Hjälp
Företagets chef ser varje nyckel, när den senast användes och de senaste anropen under Inställningar → API och filer. För allt annat kontaktar du OptiRoutes support med företagsnumret och tiden för anropet – skicka aldrig själva nyckeln.