Hvad det er
Hver virksomhed i OptiRoutes har sin egen private mappe med filer: de ordrer, den indlæser, de underskrevne følgesedler (POD) med fotos og underskrifter, ruteeksporterne og rapporterne ved dagens slutning. Files API lader dine systemer læse og skrive direkte i den mappe uden en FTP-server imellem.
- Adresse:
https://srv2.optiroutes.com/api/v1— kun HTTPS. - Adgang: en API-nøgle, som virksomhedens leder opretter i OptiRoutes under Indstillinger → API og filer. Der kræves ingen henvendelse til OptiRoutes-support.
- Alle filtyper, systemet arbejder med i dag: CSV, JSON, TXT, XLSX/XLS, PDF og billeder.
- Svar er JSON, undtagen fildownloads, som returnerer selve filen.
Kom i gang i 3 trin
- Opret en nøgle. I OptiRoutes åbner lederen Indstillinger → API og filer, klikker på Ny nøgle, giver den et navn (for eksempel "ERP-server"), vælger tilladelserne og kopierer nøglen. Nøglen vises én gang.
- Tjek forbindelsen.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Download dagens underskrevne POD'er som én ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Sikkerhed — læs venligst
- Behandl nøglen som en adgangskode. Opbevar den i et hemmeligt lager eller en miljøvariabel på din server. Læg den aldrig på en webside, i en mobilapp, en e-mail, en sag eller i versionsstyring.
- Mindst mulige rettigheder. Giv hvert system sin egen nøgle med kun de tilladelser, det har brug for:
pod:read(kun underskrevne POD'er),files:read(læs alle virksomhedens filer),files:write(upload ordrer og filer til indbakken). - Begræns adresserne. Når din server har en fast IP-adresse, så tilføj den til nøglen ("Tilladte adresser"). Et kald fra enhver anden adresse afvises.
- Udløb og rotation. En nøgle kan udløbe efter et antal dage. Sådan roterer du: opret en ny nøgle, skift dit system over til den, og tilbagekald derefter den gamle — der er ingen nedetid.
- Tilbagekald straks en nøgle, der kan være lækket: Indstillinger → API og filer → Tilbagekald. Den holder op med at virke inden for 30 sekunder.
- Revision. Hvert kald logges (tidspunkt, adresse, fil, svar) og vises for lederen på samme skærm.
- OptiRoutes gemmer kun et fingeraftryk (SHA-256) af hver nøgle, aldrig selve nøglen. Forbindelser er kun HTTPS (TLS 1.2+).
- En nøgle når kun sin egen virksomheds mappe. Andre virksomheders filer og systemets interne mapper kan aldrig nås.
Godkendelse
Send nøglen i hver anmodning i en af disse headere:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEn nøgle ser ud som opr_2813_… (virksomhedsnummeret efterfulgt af 32 tilfældige tegn).
Virksomhedens mappe
| Mappe | Hvad den indeholder | Hvem der skriver |
|---|---|---|
orders_files/ | Den daglige ordrefil, som OptiRoutes indlæser: orders_files/YYYY-MM-DD.csv (eller .json / .TXT, som angivet under Indstillinger → Indlæsning). Ruteeksporter: orders_files/routes_export_YYYY_MM_DD.csv. | Dig (ordrer) · OptiRoutes (eksporter) |
pod/YYYY/MM/DD/ | Den dags underskrevne POD'er: <order>_sign_….pdf, underskriften og fotoene (<order>_….png/jpg). | OptiRoutes |
pod/ | Oprindelige følgesedler, der skal underskrives i chaufførappen: pod/<order number>.pdf. | Dig |
reports/YYYY/MM/ | Rapporter ved dagens slutning og over returvarer. | OptiRoutes |
podBaseFile/ | POD-grundformularen. | Dig |
inbox/ | Fri mappe til filer, du vil aflevere. | Dig |
Reference
| Kald | Tilladelse | Hvad det gør |
|---|---|---|
GET /api/v1/me | enhver | Tjekker nøglen. Svarer med virksomhedsnummeret, nøglens tilladelser og din adresse. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: kun pod/) | Viser ét mappeniveau: filer (navn, sti, størrelse, ændret) og undermapper. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: kun pod/) | Downloader én fil. |
PUT /api/v1/files?path=<file> | files:write | Uploader en fil (anmodningens indhold er filen eller en multipart-formular med feltet file). En eksisterende fil erstattes. Højst 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Sletter en fil, du har uploadet (hvor du må uploade). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | En dags POD-filer, hver med sit ordrenummer og sin type: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Alle dagens POD-filer som én ZIP. |
Eksempel på svar fra en visning af en mappe:
{
"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" }
]
}Almindelige opgaver
Upload dagens ordrefil
# 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 indlæser filen, som den gør i dag (den automatiske indlæsning under Indstillinger → Indlæsning eller brugerens "Indlæs fil").
Download de underskrevne POD'er for én ordre
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"
Download rapporten ved dagens slutning
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()));
}Arbejd som med FTP — et script til mappesynkronisering
Teams, der har arbejdet med FTP, kan holde en mappe på deres egen server synkroniseret med virksomhedens mappe: en planlagt opgave downloader nye filer (for eksempel POD'erne) og uploader de filer, du lægger i en lokal mappe. PowerShell-scriptet nedenfor gør begge dele; kør det med få minutters mellemrum fra Windows Opgavestyring (på Linux bruger du curl-linjerne 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
}Flytning af en virksomhed fra FTP til API'et
Lederen skifter under Indstillinger → API og filer → Filer flyttes via: API. Fra det øjeblik sendes intet til virksomhedens FTP, og alle filer ligger i stedet i virksomhedens mappe:
| Med FTP | Med API'et |
|---|---|
| Du lægger ordrefilen på FTP'en | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Underskrevne POD'er sendt til /POD/ på din FTP | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Ruteeksport sendt til /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Rapporter sendt til /orders/YYYY/MM/ | reports/YYYY/MM/ |
Nye virksomheder arbejder med API'et fra starten. Skift tilbage til FTP sker med samme kontakt.
Virksomheder på den gamle OptiRoutes-server
En virksomhed, der stadig arbejder med den gamle OptiRoutes-server (WEB), kan bruge API'et til sine underskrevne POD'er: opret en nøgle med tilladelsen pod:read, og brug /api/v1/pod, /api/v1/pod/archive og /api/v1/files/download?path=pod/…. Dens øvrige filer flyttes fortsat som i dag, indtil virksomheden flytter til den nye server.
Fejl
En fejl svarer med {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Hvad du skal gøre |
|---|---|---|
| 401 | missing_key / invalid_key | Send nøglen; tjek, at den ikke er tilbagekaldt eller udløbet. |
| 403 | scope_missing | Nøglen mangler tilladelsen — opret en nøgle med den. |
| 403 | ip_not_allowed | Kald fra en tilladt adresse, eller opdater nøglens adresser. |
| 403 | folder_read_only | Upload kun til orders_files/, inbox/, podBaseFile/ eller pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Stier er relative (orders_files/a.csv), datoer er YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Ingen sådan fil / ingen POD den dag. |
| 413 | file_too_large | Højst 50 MB pr. fil. |
| 429 | rate_limited | Vent et minut, og prøv igen. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Midlertidigt — prøv igen om et minut. |
Grænser
- 300 anmodninger pr. minut pr. nøgle.
- 50 MB pr. fil.
- 20 aktive nøgler pr. virksomhed.
- En visning af en mappe returnerer op til 5.000 poster; vis undermapper (for eksempel én dags POD'er) for at få flere.
Hjælp
Virksomhedens leder ser alle nøgler, deres seneste brug og de seneste kald under Indstillinger → API og filer. Kontakt i alle andre tilfælde OptiRoutes-support med virksomhedsnummeret og tidspunktet for kaldet — send aldrig selve nøglen.