Що це
Кожна компанія в OptiRoutes має власну приватну папку файлів: замовлення, які вона завантажує, підписані накладні (POD) з фото та підписами, експорти маршрутів і звіти на кінець дня. Files API дає змогу вашим системам читати й записувати цю папку напряму, без проміжного FTP-сервера.
- Адреса:
https://srv2.optiroutes.com/api/v1— лише HTTPS. - Доступ: ключ API, який менеджер компанії створює в OptiRoutes, у Налаштування → API та файли. Звертатися до підтримки OptiRoutes не потрібно.
- Усі типи файлів, з якими система працює сьогодні: CSV, JSON, TXT, XLSX/XLS, PDF і зображення.
- Відповіді надходять у форматі JSON, крім завантаження файлів, яке повертає сам файл.
Початок за 3 кроки
- Створіть ключ. В OptiRoutes менеджер відкриває Налаштування → API та файли, клацає Новий ключ, дає йому назву (наприклад, "сервер ERP"), вибирає дозволи та копіює ключ. Ключ показується один раз.
- Перевірте з'єднання.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Завантажте сьогоднішні підписані POD одним ZIP-файлом:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Безпека — прочитайте, будь ласка
- Поводьтеся з ключем як із паролем. Зберігайте його в сховищі секретів або в змінній середовища на вашому сервері. Ніколи не розміщуйте його на вебсторінці, у мобільному застосунку, в електронному листі, у заявці чи в системі контролю версій.
- Мінімальні привілеї. Дайте кожній системі власний ключ лише з потрібними їй дозволами:
pod:read(лише підписані POD),files:read(читання всіх файлів компанії),files:write(завантаження замовлень і файлів у папку inbox). - Обмежте адреси. Коли ваш сервер має фіксовану IP-адресу, додайте її до ключа («Дозволені адреси»). Виклик із будь-якої іншої адреси відхиляється.
- Термін дії та ротація. Ключ може спливати через певну кількість днів. Щоб замінити ключ: створіть новий, перемкніть на нього свою систему, потім відкличте старий — без простою.
- Негайно відкличте ключ, який міг потрапити в чужі руки: Налаштування → API та файли → Відкликати. Він перестає працювати протягом 30 секунд.
- Аудит. Кожен виклик записується в журнал (час, адреса, файл, відповідь) і показується менеджерові на тому самому екрані.
- OptiRoutes зберігає лише відбиток (SHA-256) кожного ключа, ніколи сам ключ. З'єднання — лише HTTPS (TLS 1.2+).
- Ключ має доступ лише до папки своєї компанії. Файли інших компаній і внутрішні папки системи недоступні за жодних умов.
Автентифікація
Надсилайте ключ у кожному запиті в одному з цих заголовків:
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 МБ. |
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 |
|---|---|
| Ви кладете файл замовлень на FTP | PUT /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>"}.
| HTTP | error | Що робити |
|---|---|---|
| 401 | missing_key / invalid_key | Надішліть ключ; перевірте, що його не відкликано і термін його дії не сплив. |
| 403 | scope_missing | Ключ не має потрібного дозволу — створіть ключ із ним. |
| 403 | ip_not_allowed | Викликайте з дозволеної адреси або оновіть адреси ключа. |
| 403 | folder_read_only | Завантажуйте лише в orders_files/, inbox/, podBaseFile/ або pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Шляхи відносні (orders_files/a.csv), дати у форматі YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Такого файлу немає / за цей день немає POD. |
| 413 | file_too_large | Щонайбільше 50 МБ на файл. |
| 429 | rate_limited | Зачекайте хвилину й повторіть. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Тимчасово — повторіть за хвилину. |
Обмеження
- 300 запитів на хвилину на ключ.
- 50 МБ на файл.
- 20 активних ключів на компанію.
- Список папки повертає до 5 000 записів; щоб отримати більше, перелічуйте вкладені папки (наприклад, один день POD).
Допомога
Менеджер компанії бачить кожен ключ, його останнє використання та останні виклики в Налаштування → API та файли. З усіх інших питань звертайтеся до підтримки OptiRoutes, указавши номер компанії та час виклику, — ніколи не надсилайте сам ключ.