Mikä se on
Jokaisella OptiRoutesin yrityksellä on oma yksityinen tiedostokansionsa: sen lataamat tilaukset, allekirjoitetut lähetteet (POD) kuvineen ja allekirjoituksineen, reittiviennit ja päivän päätteen raportit. Files API antaa järjestelmiesi lukea kansiota ja kirjoittaa siihen suoraan ilman välissä olevaa FTP-palvelinta.
- Osoite:
https://srv2.optiroutes.com/api/v1– vain HTTPS. - Pääsy: API-avain, jonka yrityksen esihenkilö luo OptiRoutesissa kohdassa Asetukset → API ja tiedostot. Pyyntöä OptiRoutesin tuelle ei tarvita.
- Kaikki tiedostotyypit, joita järjestelmä nykyään käsittelee: CSV, JSON, TXT, XLSX/XLS, PDF ja kuvat.
- Vastaukset ovat JSONia, paitsi tiedostolataukset, jotka palauttavat itse tiedoston.
Aloita kolmessa vaiheessa
- Luo avain. Esihenkilö avaa OptiRoutesissa kohdan Asetukset → API ja tiedostot, napsauttaa Uusi avain, antaa sille nimen (esimerkiksi "ERP-palvelin"), valitsee oikeudet ja kopioi avaimen. Avain näytetään kerran.
- Tarkista yhteys.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Lataa tämän päivän allekirjoitetut POD:t yhtenä ZIP-tiedostona:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Tietoturva – lue tämä
- Käsittele avainta kuin salasanaa. Säilytä se salaisuusvarastossa tai palvelimesi ympäristömuuttujassa. Älä koskaan laita sitä verkkosivulle, mobiilisovellukseen, sähköpostiin, tukipyyntöön tai versionhallintaan.
- Vähimmät oikeudet. Anna kullekin järjestelmälle oma avaimensa vain tarvittavin oikeuksin:
pod:read(vain allekirjoitetut POD:t),files:read(yrityksen kaikkien tiedostojen luku),files:write(tilausten ja inbox-tiedostojen lataus). - Rajaa osoitteet. Kun palvelimellasi on kiinteä IP-osoite, lisää se avaimeen ("Sallitut osoitteet"). Kutsu mistä tahansa muusta osoitteesta hylätään.
- Vanheneminen ja vaihto. Avain voi vanhentua tietyn päivämäärän jälkeen. Vaihto: luo uusi avain, siirrä järjestelmäsi käyttämään sitä ja mitätöi sitten vanha – katkosta ei tule.
- Mitätöi heti avain, joka on voinut vuotaa: Asetukset → API ja tiedostot → Mitätöi. Se lakkaa toimimasta 30 sekunnin kuluessa.
- Valvonta. Jokainen kutsu kirjataan (aika, osoite, tiedosto, vastaus) ja näytetään esihenkilölle samassa näkymässä.
- OptiRoutes säilyttää kustakin avaimesta vain tiivisteen (SHA-256), ei koskaan itse avainta. Yhteydet ovat vain HTTPS (TLS 1.2+).
- Avain ulottuu vain oman yrityksensä kansioon. Muiden yritysten tiedostoihin ja järjestelmän sisäisiin kansioihin ei voi koskaan päästä.
Todennus
Lähetä avain jokaisessa pyynnössä jossakin näistä otsakkeista:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAvain näyttää tältä: opr_2813_… (yritysnumero ja sen jälkeen 32 satunnaista merkkiä).
Yrityksen kansio
| Kansio | Mitä siinä on | Kuka kirjoittaa |
|---|---|---|
orders_files/ | Päivittäinen tilaustiedosto, jonka OptiRoutes lataa: orders_files/YYYY-MM-DD.csv (tai .json / .TXT sen mukaan, mitä on asetettu kohdassa Asetukset → Lataus). Reittiviennit: orders_files/routes_export_YYYY_MM_DD.csv. | Sinä (tilaukset) · OptiRoutes (viennit) |
pod/YYYY/MM/DD/ | Kyseisen päivän allekirjoitetut POD:t: <order>_sign_….pdf, allekirjoitus ja kuvat (<order>_….png/jpg). | OptiRoutes |
pod/ | Lähdelähetteet, jotka allekirjoitetaan kuljettajasovelluksessa: pod/<order number>.pdf. | Sinä |
reports/YYYY/MM/ | Päivän päätteen ja palautusten raportit. | OptiRoutes |
podBaseFile/ | POD-pohjalomake. | Sinä |
inbox/ | Vapaa kansio tiedostoille, jotka haluat luovuttaa. | Sinä |
Viite
| Kutsu | Oikeus | Mitä se tekee |
|---|---|---|
GET /api/v1/me | mikä tahansa | Tarkistaa avaimen. Palauttaa yritysnumeron, avaimen oikeudet ja osoitteesi. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: vain pod/) | Luettelee yhden kansiotason: tiedostot (nimi, polku, koko, muokattu) ja alikansiot. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: vain pod/) | Lataa yhden tiedoston. |
PUT /api/v1/files?path=<file> | files:write | Lataa tiedoston palvelimelle (pyynnön runko on tiedosto tai multipart-lomake, jossa on file-kenttä). Olemassa oleva tiedosto korvataan. Enintään 50 Mt. |
DELETE /api/v1/files?path=<file> | files:write | Poistaa lataamasi tiedoston (siellä, minne saat ladata). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Päivän POD-tiedostot, kullakin tilausnumero ja laji: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Päivän jokainen POD-tiedosto yhtenä ZIP-tiedostona. |
Esimerkki luettelon vastauksesta:
{
"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" }
]
}Yleiset tehtävät
Lataa tämän päivän tilaustiedosto
# 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 lataa tiedoston kuten nykyäänkin (kohdan Asetukset → Lataus automaattinen lataus tai käyttäjän "Lataa tiedosto").
Lataa yhden tilauksen allekirjoitetut POD:t
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"
Lataa päivän päätteen raportti
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()));
}Työskentele kuten FTP:llä – kansion synkronointiskripti
FTP:tä käyttäneet tiimit voivat pitää oman palvelimensa kansion synkronoituna yrityksen kansion kanssa: ajastettu tehtävä lataa uudet tiedostot (esimerkiksi POD:t) ja lataa palvelimelle tiedostot, jotka pudotat paikalliseen kansioon. Alla oleva PowerShell-skripti tekee molemmat; aja se muutaman minuutin välein Windowsin Tehtävien ajoituksesta (Linuxissa käytä curl-rivejä cronin kanssa).
# 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
}Yrityksen siirto FTP:stä API:in
Esihenkilö vaihtaa kohdassa Asetukset → API ja tiedostot → Tiedostot liikkuvat: API. Siitä hetkestä lähtien yrityksen FTP:hen ei lähetetä mitään, ja jokainen tiedosto on sen sijaan yrityksen kansiossa:
| FTP:llä | API:lla |
|---|---|
| Laitat tilaustiedoston FTP:hen | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Allekirjoitetut POD:t työnnetään FTP:si kansioon /POD/ | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Reittivienti työnnetään kansioon /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Raportit työnnetään kansioon /orders/YYYY/MM/ | reports/YYYY/MM/ |
Uudet yritykset käyttävät API:a alusta alkaen. Paluu FTP:hen tehdään samalla kytkimellä.
Yritykset OptiRoutesin vanhalla palvelimella
Yritys, joka käyttää vielä OptiRoutesin vanhaa palvelinta (WEB), voi käyttää API:a allekirjoitettuihin POD:eihinsa: luo avain pod:read-oikeudella ja käytä osoitteita /api/v1/pod, /api/v1/pod/archive ja /api/v1/files/download?path=pod/…. Sen muut tiedostot liikkuvat edelleen kuten nykyään, kunnes yritys siirtyy uudelle palvelimelle.
Virheet
Virhe palauttaa {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Mitä tehdä |
|---|---|---|
| 401 | missing_key / invalid_key | Lähetä avain; tarkista, ettei sitä ole mitätöity tai ettei se ole vanhentunut. |
| 403 | scope_missing | Avaimelta puuttuu oikeus – luo avain, jolla se on. |
| 403 | ip_not_allowed | Kutsu sallitusta osoitteesta tai päivitä avaimen osoitteet. |
| 403 | folder_read_only | Lataa vain kansioihin orders_files/, inbox/, podBaseFile/ tai pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Polut ovat suhteellisia (orders_files/a.csv), päivämäärät muotoa YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Tiedostoa ei ole / ei POD:ia kyseisenä päivänä. |
| 413 | file_too_large | Enintään 50 Mt tiedostoa kohden. |
| 429 | rate_limited | Odota minuutti ja yritä uudelleen. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Tilapäinen – yritä uudelleen minuutin kuluttua. |
Rajat
- 300 pyyntöä minuutissa avainta kohden.
- 50 Mt tiedostoa kohden.
- 20 aktiivista avainta yritystä kohden.
- Kansioluettelo palauttaa enintään 5 000 kohdetta; luettele alikansiot (esimerkiksi yhden päivän POD:t) saadaksesi lisää.
Ohje
Yrityksen esihenkilö näkee jokaisen avaimen, sen viimeisimmän käytön ja viimeisimmät kutsut kohdassa Asetukset → API ja tiedostot. Kaikissa muissa asioissa ota yhteyttä OptiRoutesin tukeen ja kerro yritysnumero ja kutsun aika – älä koskaan lähetä itse avainta.