OptiRoutes Files API

Panduan untuk tim perangkat lunak yang menghubungkan perusahaan ke OptiRoutes: memuat pesanan, mengambil POD, ekspor, dan laporan — dengan aman, melalui 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

Apa itu

Setiap perusahaan di OptiRoutes memiliki folder file pribadinya sendiri: pesanan yang dimuatnya, surat jalan yang ditandatangani (POD) beserta foto dan tanda tangannya, ekspor rute, dan laporan akhir hari. Files API memungkinkan sistem Anda membaca dan menulis folder tersebut secara langsung, tanpa server FTP di antaranya.

Mulai dalam 3 langkah

  1. Buat kunci. Di OptiRoutes, manajer membuka Pengaturan → API & file, mengklik Kunci baru, memberinya nama (misalnya "server ERP"), memilih izin, dan menyalin kunci. Kunci hanya ditampilkan sekali.
  2. Periksa koneksi.
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me
  3. Unduh POD yang ditandatangani hari ini sebagai satu ZIP:
    curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"

Keamanan — harap dibaca

Autentikasi

Kirim kunci di setiap permintaan, di salah satu header berikut:

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

Kunci terlihat seperti opr_2813_… (nomor perusahaan, lalu 32 karakter acak).

Folder perusahaan

FolderIsinyaSiapa yang menulis
orders_files/File pesanan harian yang dimuat OptiRoutes: orders_files/YYYY-MM-DD.csv (atau .json / .TXT, sesuai pengaturan di Pengaturan → Pemuatan). Ekspor rute: orders_files/routes_export_YYYY_MM_DD.csv.Anda (pesanan) · OptiRoutes (ekspor)
pod/YYYY/MM/DD/POD yang ditandatangani pada hari tersebut: <order>_sign_….pdf, tanda tangan, dan foto (<order>_….png/jpg).OptiRoutes
pod/Surat jalan sumber yang akan ditandatangani di aplikasi pengemudi: pod/<order number>.pdf.Anda
reports/YYYY/MM/Laporan akhir hari dan pengembalian.OptiRoutes
podBaseFile/Formulir dasar POD.Anda
inbox/Folder bebas untuk file yang ingin Anda serahkan.Anda

Referensi

PanggilanIzinFungsinya
GET /api/v1/meapa punMemeriksa kunci. Menjawab dengan nomor perusahaan, izin kunci, dan alamat Anda.
GET /api/v1/files?folder=<folder>files:read (pod:read: hanya pod/)Mencantumkan satu tingkat folder: file (nama, path, ukuran, waktu diubah) dan subfolder.
GET /api/v1/files/download?path=<file>files:read (pod:read: hanya pod/)Mengunduh satu file.
PUT /api/v1/files?path=<file>files:writeMengunggah file (isi permintaan adalah file tersebut, atau formulir multipart dengan bidang file). File yang sudah ada akan diganti. Maksimal 50 MB.
DELETE /api/v1/files?path=<file>files:writeMenghapus file yang Anda unggah (di tempat Anda boleh mengunggah).
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>]pod:readFile POD pada suatu hari, masing-masing dengan nomor pesanan dan jenisnya: signed_pdf, signature, photo.
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf]pod:readSetiap file POD pada hari tersebut sebagai satu ZIP.

Contoh jawaban daftar:

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

Tugas umum

Unggah file pesanan hari ini

# 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 memuat file seperti cara memuatnya saat ini (pemuatan otomatis di Pengaturan → Pemuatan, atau "Muat file" oleh pengguna).

Unduh POD yang ditandatangani untuk satu pesanan

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"

Unduh laporan akhir hari

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

Bekerja seperti FTP — skrip sinkronisasi folder

Tim yang biasa bekerja dengan FTP dapat menjaga folder di server mereka sendiri tetap sinkron dengan folder perusahaan: tugas terjadwal mengunduh file baru (misalnya POD) dan mengunggah file yang Anda letakkan di folder lokal. Skrip PowerShell di bawah melakukan keduanya; jalankan setiap beberapa menit dari Windows Task Scheduler (di Linux gunakan baris curl dengan 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
}

Memindahkan perusahaan dari FTP ke API

Manajer beralih di Pengaturan → API & file → File berpindah melalui: API. Sejak saat itu tidak ada yang dikirim ke FTP perusahaan, dan setiap file berada di folder perusahaan sebagai gantinya:

Dengan FTPDengan API
Anda menaruh file pesanan di FTPPUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv
POD yang ditandatangani dikirim ke /POD/ di FTP AndaGET /api/v1/pod?date=… / /api/v1/pod/archive?date=…
Ekspor rute dikirim ke /orders/orders_files/routes_export_YYYY_MM_DD.csv
Laporan dikirim ke /orders/YYYY/MM/reports/YYYY/MM/

Perusahaan baru bekerja dengan API sejak awal. Kembali ke FTP menggunakan sakelar yang sama.

Perusahaan di server OptiRoutes lama

Perusahaan yang masih bekerja dengan server OptiRoutes lama (WEB) dapat menggunakan API untuk POD yang ditandatangani: buat kunci dengan izin pod:read dan gunakan /api/v1/pod, /api/v1/pod/archive, serta /api/v1/files/download?path=pod/…. File lainnya tetap berpindah seperti saat ini, sampai perusahaan pindah ke server baru.

Kesalahan

Kesalahan dijawab dengan {"ok": false, "error": "<code>", "message": "<explanation>"}.

HTTPerrorYang harus dilakukan
401missing_key / invalid_keyKirim kunci; pastikan kunci tidak dicabut atau kedaluwarsa.
403scope_missingKunci tidak memiliki izin tersebut — buat kunci yang memilikinya.
403ip_not_allowedLakukan panggilan dari alamat yang diizinkan, atau perbarui alamat kunci.
403folder_read_onlyUnggah hanya ke orders_files/, inbox/, podBaseFile/, atau pod/<file>.pdf.
400invalid_path / invalid_datePath bersifat relatif (orders_files/a.csv), tanggal berformat YYYY-MM-DD.
404not_found / no_pod_filesFile tidak ada / tidak ada POD pada hari tersebut.
413file_too_largeMaksimal 50 MB per file.
429rate_limitedTunggu satu menit lalu coba lagi.
502 / 503storage_unavailable / files_api_unavailableSementara — coba lagi dalam satu menit.

Batasan

Bantuan

Manajer perusahaan melihat setiap kunci, penggunaan terakhirnya, dan panggilan terakhir di Pengaturan → API & file. Untuk hal lainnya, hubungi dukungan OptiRoutes dengan menyebutkan nomor perusahaan dan waktu panggilan — jangan pernah mengirimkan kunci itu sendiri.