API αρχείων OptiRoutes

Οδηγός για τις ομάδες λογισμικού που συνδέουν μια εταιρεία με το OptiRoutes: φόρτωση παραδόσεων, συλλογή POD, εξαγωγών και αναφορών — με ασφάλεια, μέσω HTTPS.

EN · HE · AR · RU · ES · IT · CS · RO · EL · DE · FR · PT · JA · KO · ZH · NL · PL · TR · SV · DA · NB · FI · HU · SK · HR · BG · UK · ID · MS · TH · VI · HI · LT · SL

Τι είναι

Κάθε εταιρεία στο OptiRoutes έχει τον δικό της ιδιωτικό φάκελο αρχείων: τις παραδόσεις που φορτώνει, τα υπογεγραμμένα δελτία παράδοσης (POD) με τις φωτογραφίες και τις υπογραφές τους, τις εξαγωγές διαδρομών και τις αναφορές τέλους ημέρας. Το API αρχείων επιτρέπει στα συστήματά σας να διαβάζουν και να γράφουν απευθείας σε αυτόν τον φάκελο, χωρίς ενδιάμεσο διακομιστή FTP.

Ξεκινήστε με 3 βήματα

  1. Δημιουργήστε ένα κλειδί. Στο OptiRoutes, ο διευθυντής ανοίγει τις Ρυθμίσεις → API και αρχεία, επιλέγει Νέο κλειδί, του δίνει ένα όνομα (για παράδειγμα «διακομιστής ERP»), επιλέγει τα δικαιώματα και αντιγράφει το κλειδί. Το κλειδί εμφανίζεται μόνο μία φορά.
  2. Ελέγξτε τη σύνδεση.
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me
  3. Κατεβάστε τα υπογεγραμμένα POD της ημέρας σε ένα ενιαίο ZIP:
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"

Ασφάλεια — παρακαλούμε διαβάστε

Ταυτοποίηση

Στείλτε το κλειδί σε κάθε αίτημα, σε μία από αυτές τις κεφαλίδες:

Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ένα κλειδί μοιάζει με opr_2813_… (ο αριθμός της εταιρείας, και μετά 32 τυχαίοι χαρακτήρες).

Ο φάκελος της εταιρείας

ΦάκελοςΤι περιέχειΠοιος γράφει
orders_files/Το ημερήσιο αρχείο παραδόσεων που φορτώνει το OptiRoutes: orders_files/YYYY-MM-DD.csv (ή .json / .TXT, όπως έχει οριστεί στις Ρυθμίσεις → Φόρτωση παραδόσεων). Εξαγωγές διαδρομών: orders_files/routes_export_YYYY_MM_DD.csv.Εσείς (παραδόσεις) · OptiRoutes (εξαγωγές)
pod/YYYY/MM/DD/Τα υπογεγραμμένα POD της συγκεκριμένης ημέρας: <order>_sign_….pdf, η υπογραφή και οι φωτογραφίες (<order>_….png/jpg).OptiRoutes
pod/Τα αρχικά δελτία παράδοσης που θα υπογραφούν στην εφαρμογή του οδηγού: pod/<order number>.pdf.Εσείς
reports/YYYY/MM/Αναφορές τέλους ημέρας και επιστροφών.OptiRoutes
podBaseFile/Η βασική φόρμα του POD.Εσείς
inbox/Ελεύθερος φάκελος για αρχεία που θέλετε να παραδώσετε.Εσείς

Αναφορά

ΚλήσηΔικαίωμαΤι κάνει
GET /api/v1/meοποιοδήποτεΕλέγχει το κλειδί. Απαντά με τον αριθμό της εταιρείας, τα δικαιώματα του κλειδιού και τη διεύθυνσή σας.
GET /api/v1/files?folder=<folder>files:read (pod:read: μόνο pod/)Εμφανίζει ένα επίπεδο φακέλου: αρχεία (όνομα, διαδρομή, μέγεθος, ημερομηνία τροποποίησης) και υποφακέλους.
GET /api/v1/files/download?path=<file>files:read (pod:read: μόνο pod/)Κατεβάζει ένα αρχείο.
PUT /api/v1/files?path=<file>files:writeΑνεβάζει ένα αρχείο (το σώμα του αιτήματος είναι το αρχείο, ή μια φόρμα multipart με πεδίο file). Ένα υπάρχον αρχείο αντικαθίσταται. Έως 50 MB.
DELETE /api/v1/files?path=<file>files:writeΔιαγράφει ένα αρχείο που ανεβάσατε (εκεί όπου επιτρέπεται η μεταφόρτωση).
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>]pod:readΤα αρχεία POD μιας ημέρας, το καθένα με τον αριθμό παράδοσης και τον τύπο του: signed_pdf, signature, photo.
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf]pod:readΌλα τα αρχεία POD της ημέρας σε ένα ενιαίο ZIP.

Παράδειγμα απάντησης για μια λίστα:

{
  "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" }
  ]
}

Συνηθισμένες εργασίες

Μεταφόρτωση του αρχείου παραδόσεων της ημέρας

# 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 φορτώνει το αρχείο όπως το φορτώνει σήμερα (με την αυτόματη φόρτωση των Ρυθμίσεων → Φόρτωση παραδόσεων, ή με τη «Φόρτωση αρχείου» του χρήστη).

Λήψη των υπογεγραμμένων POD μιας παράδοσης

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"

Λήψη της αναφοράς τέλους ημέρας

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()));
}

Εργασία όπως με το FTP — ένα σενάριο συγχρονισμού φακέλου

Οι ομάδες που δούλευαν με FTP μπορούν να διατηρούν έναν φάκελο στον δικό τους διακομιστή συγχρονισμένο με τον φάκελο της εταιρείας: μια προγραμματισμένη εργασία κατεβάζει τα νέα αρχεία (για παράδειγμα τα POD) και ανεβάζει τα αρχεία που τοποθετείτε σε έναν τοπικό φάκελο. Το σενάριο PowerShell παρακάτω κάνει και τα δύο· εκτελέστε το κάθε λίγα λεπτά από τον Προγραμματιστή εργασιών των Windows (στο Linux χρησιμοποιήστε τις γραμμές curl με 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
}

Μετάβαση μιας εταιρείας από το FTP στο API

Ο διευθυντής κάνει την αλλαγή στις Ρυθμίσεις → API και αρχεία → Πώς μετακινούνται τα αρχεία της εταιρείας: API (συνιστάται). Από εκείνη τη στιγμή δεν αποστέλλεται τίποτα στο FTP της εταιρείας και κάθε αρχείο βρίσκεται αντίθετα στον φάκελο της εταιρείας:

Με FTPΜε το API
Τοποθετείτε το αρχείο παραδόσεων στο FTPPUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv
Τα υπογεγραμμένα POD αποστέλλονται στο /POD/ του FTP σαςGET /api/v1/pod?date=… / /api/v1/pod/archive?date=…
Η εξαγωγή διαδρομών αποστέλλεται στο /orders/orders_files/routes_export_YYYY_MM_DD.csv
Οι αναφορές αποστέλλονται στο /orders/YYYY/MM/reports/YYYY/MM/

Οι νέες εταιρείες δουλεύουν με το API από την αρχή. Η επιστροφή στο FTP γίνεται με τον ίδιο διακόπτη.

Εταιρείες στον παλιό διακομιστή του OptiRoutes

Μια εταιρεία που εξακολουθεί να εργάζεται με τον παλιό διακομιστή του OptiRoutes (WEB) μπορεί να χρησιμοποιεί το API για τα υπογεγραμμένα POD της: δημιουργήστε ένα κλειδί με το δικαίωμα pod:read και χρησιμοποιήστε τα /api/v1/pod, /api/v1/pod/archive και /api/v1/files/download?path=pod/…. Τα υπόλοιπα αρχεία της συνεχίζουν να μετακινούνται όπως σήμερα, μέχρι η εταιρεία να μεταβεί στον νέο διακομιστή.

Σφάλματα

Ένα σφάλμα απαντά με {"ok": false, "error": "<code>", "message": "<explanation>"}.

HTTPerrorΤι να κάνετε
401missing_key / invalid_keyΣτείλτε το κλειδί· ελέγξτε ότι δεν έχει ανακληθεί ούτε έχει λήξει.
403scope_missingΤο κλειδί δεν έχει το δικαίωμα — δημιουργήστε ένα κλειδί που το έχει.
403ip_not_allowedΚαλέστε από επιτρεπόμενη διεύθυνση ή ενημερώστε τις διευθύνσεις του κλειδιού.
403folder_read_onlyΑνεβάζετε αρχεία μόνο στα orders_files/, inbox/, podBaseFile/ ή pod/<file>.pdf.
400invalid_path / invalid_dateΟι διαδρομές είναι σχετικές (orders_files/a.csv) και οι ημερομηνίες έχουν τη μορφή YYYY-MM-DD.
404not_found / no_pod_filesΔεν υπάρχει τέτοιο αρχείο / δεν υπάρχει POD εκείνη την ημέρα.
413file_too_largeΈως 50 MB ανά αρχείο.
429rate_limitedΠεριμένετε ένα λεπτό και δοκιμάστε ξανά.
502 / 503storage_unavailable / files_api_unavailableΠροσωρινό — δοκιμάστε ξανά σε ένα λεπτό.

Όρια

Βοήθεια

Ο διευθυντής της εταιρείας βλέπει κάθε κλειδί, την τελευταία χρήση του και τις τελευταίες κλήσεις στις Ρυθμίσεις → API και αρχεία. Για οτιδήποτε άλλο, επικοινωνήστε με την υποστήριξη του OptiRoutes αναφέροντας τον αριθμό της εταιρείας και την ώρα της κλήσης — μην στέλνετε ποτέ το ίδιο το κλειδί.