Nedir
OptiRoutes'taki her şirketin kendine ait özel bir dosya klasörü vardır: yüklediği siparişler, fotoğrafları ve imzalarıyla imzalı irsaliyeler (POD), rota dışa aktarımları ve gün sonu raporları. Dosya API'si, sistemlerinizin arada bir FTP sunucusu olmadan bu klasörü doğrudan okumasını ve yazmasını sağlar.
- Adres:
https://srv2.optiroutes.com/api/v1— yalnızca HTTPS. - Erişim: şirket yöneticisinin OptiRoutes'ta, Ayarlar → API ve dosyalar bölümünde oluşturduğu bir API anahtarı. OptiRoutes destek ekibine talep gerekmez.
- Sistemin bugün çalıştığı her dosya türü: CSV, JSON, TXT, XLSX/XLS, PDF ve görseller.
- Yanıtlar JSON'dur; dosyanın kendisini döndüren dosya indirmeleri hariç.
3 adımda başlayın
- Bir anahtar oluşturun. OptiRoutes'ta yönetici Ayarlar → API ve dosyalar'ı açar, Yeni anahtar'a tıklar, ona bir ad verir (örneğin "ERP sunucusu"), yetkileri seçer ve anahtarı kopyalar. Anahtar bir kez gösterilir.
- Bağlantıyı kontrol edin.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Bugünün imzalı POD'larını tek bir ZIP olarak indirin:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Güvenlik — lütfen okuyun
- Anahtara bir şifre gibi davranın. Onu sunucunuzda gizli bir depoda veya bir ortam değişkeninde tutun. Hiçbir zaman bir web sayfasına, bir mobil uygulamaya, bir e-postaya, bir destek talebine veya kaynak kod deposuna koymayın.
- En az yetki. Her sisteme yalnızca ihtiyaç duyduğu yetkilerle kendi anahtarını verin:
pod:read(yalnızca imzalı POD'lar),files:read(şirketin her dosyasını okuma),files:write(siparişleri ve gelen kutusu dosyalarını yükleme). - Adresleri sınırlayın. Sunucunuzun sabit bir IP adresi olduğunda onu anahtara ekleyin ("İzin verilen adresler"). Başka herhangi bir adresten gelen çağrı reddedilir.
- Sona erme ve yenileme. Bir anahtar belirli sayıda günden sonra sona erebilir. Yenilemek için: yeni bir anahtar oluşturun, sisteminizi ona geçirin, sonra eskisini iptal edin — kesinti olmaz.
- Sızmış olabilecek bir anahtarı hemen iptal edin: Ayarlar → API ve dosyalar → İptal et. 30 saniye içinde çalışmayı durdurur.
- Denetim. Her çağrı kaydedilir (zaman, adres, dosya, yanıt) ve aynı ekranda yöneticiye gösterilir.
- OptiRoutes her anahtarın yalnızca bir parmak izini (SHA-256) tutar, hiçbir zaman anahtarın kendisini değil. Bağlantılar yalnızca HTTPS (TLS 1.2+) üzerindendir.
- Bir anahtar yalnızca kendi şirketinin klasörüne ulaşır. Diğer şirketlerin dosyalarına ve sistemin dahili klasörlerine hiçbir zaman ulaşılamaz.
Kimlik doğrulama
Anahtarı her istekte şu başlıklardan birinde gönderin:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBir anahtar opr_2813_… gibi görünür (şirket numarası, ardından 32 rastgele karakter).
Şirket klasörü
| Klasör | İçinde ne var | Kim yazar |
|---|---|---|
orders_files/ | OptiRoutes'un yüklediği günlük sipariş dosyası: orders_files/YYYY-MM-DD.csv (veya Ayarlar → Yükleme bölümünde belirlendiği gibi .json / .TXT). Rota dışa aktarımları: orders_files/routes_export_YYYY_MM_DD.csv. | Siz (siparişler) · OptiRoutes (dışa aktarımlar) |
pod/YYYY/MM/DD/ | O günün imzalı POD'ları: <order>_sign_….pdf, imza ve fotoğraflar (<order>_….png/jpg). | OptiRoutes |
pod/ | Sürücü uygulamasında imzalanacak kaynak irsaliyeler: pod/<order number>.pdf. | Siz |
reports/YYYY/MM/ | Gün sonu ve iade raporları. | OptiRoutes |
podBaseFile/ | POD temel formu. | Siz |
inbox/ | Teslim etmek istediğiniz dosyalar için serbest klasör. | Siz |
Başvuru
| Çağrı | Yetki | Ne yapar |
|---|---|---|
GET /api/v1/me | herhangi | Anahtarı kontrol eder. Şirket numarasını, anahtarın yetkilerini ve adresinizi döndürür. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: yalnızca pod/) | Tek bir klasör düzeyini listeler: dosyalar (ad, yol, boyut, değiştirilme) ve alt klasörler. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: yalnızca pod/) | Tek bir dosya indirir. |
PUT /api/v1/files?path=<file> | files:write | Bir dosya yükler (istek gövdesi dosyadır veya file alanlı bir multipart formdur). Mevcut bir dosyanın yerini alır. En fazla 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Yüklediğiniz bir dosyayı siler (yükleme yapabildiğiniz yerde). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Bir günün POD dosyaları, her biri sipariş numarası ve türüyle: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Günün her POD dosyası tek bir ZIP olarak. |
Bir listelemenin örnek yanıtı:
{
"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" }
]
}Sık yapılan işler
Bugünün sipariş dosyasını yükleyin
# 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 dosyayı bugün yüklediği şekilde yükler (Ayarlar → Yükleme bölümündeki otomatik yükleme veya kullanıcının "Dosya yükle" işlemi).
Bir siparişin imzalı POD'larını indirin
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"
Gün sonu raporunu indirin
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 gibi çalışın — bir klasör eşitleme betiği
FTP ile çalışmış ekipler kendi sunucularındaki bir klasörü şirket klasörüyle eşit tutabilir: zamanlanmış bir görev yeni dosyaları (örneğin POD'ları) indirir ve yerel bir klasöre bıraktığınız dosyaları yükler. Aşağıdaki PowerShell betiği ikisini de yapar; onu birkaç dakikada bir Windows Görev Zamanlayıcısı'ndan çalıştırın (Linux'ta curl satırlarını cron ile kullanın).
# 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
}Bir şirketi FTP'den API'ye taşıma
Yönetici Ayarlar → API ve dosyalar → Dosyalar nasıl taşınır: API bölümünden geçiş yapar. O andan itibaren şirketin FTP'sine hiçbir şey gönderilmez ve bunun yerine her dosya şirket klasöründe olur:
| FTP ile | API ile |
|---|---|
| Sipariş dosyasını FTP'ye koyarsınız | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
İmzalı POD'lar FTP'nizde /POD/ klasörüne gönderilir | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
Rota dışa aktarımı /orders/ klasörüne gönderilir | orders_files/routes_export_YYYY_MM_DD.csv |
Raporlar /orders/YYYY/MM/ klasörüne gönderilir | reports/YYYY/MM/ |
Yeni şirketler baştan API ile çalışır. FTP'ye geri dönmek aynı anahtarla yapılır.
Eski OptiRoutes sunucusundaki şirketler
Hâlâ eski OptiRoutes sunucusuyla (WEB) çalışan bir şirket, imzalı POD'ları için API'yi kullanabilir: pod:read yetkisiyle bir anahtar oluşturun ve /api/v1/pod, /api/v1/pod/archive ve /api/v1/files/download?path=pod/… kullanın. Diğer dosyaları, şirket yeni sunucuya geçene kadar bugünkü gibi taşınmaya devam eder.
Hatalar
Bir hata şu yanıtı verir: {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | Ne yapılmalı |
|---|---|---|
| 401 | missing_key / invalid_key | Anahtarı gönderin; iptal edilmediğini veya süresinin dolmadığını kontrol edin. |
| 403 | scope_missing | Anahtarda yetki eksik — o yetkiyle bir anahtar oluşturun. |
| 403 | ip_not_allowed | İzin verilen bir adresten çağırın veya anahtarın adreslerini güncelleyin. |
| 403 | folder_read_only | Yalnızca orders_files/, inbox/, podBaseFile/ veya pod/<file>.pdf konumlarına yükleyin. |
| 400 | invalid_path / invalid_date | Yollar görecelidir (orders_files/a.csv), tarihler YYYY-MM-DD biçimindedir. |
| 404 | not_found / no_pod_files | Böyle bir dosya yok / o gün POD yok. |
| 413 | file_too_large | Dosya başına en fazla 50 MB. |
| 429 | rate_limited | Bir dakika bekleyip yeniden deneyin. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Geçici — bir dakika sonra yeniden deneyin. |
Sınırlar
- Anahtar başına dakikada 300 istek.
- Dosya başına 50 MB.
- Şirket başına 20 etkin anahtar.
- Bir klasör listelemesi en fazla 5.000 kayıt döndürür; daha fazlası için alt klasörleri listeleyin (örneğin bir günün POD'ları).
Yardım
Şirketin yöneticisi her anahtarı, son kullanımını ve son çağrıları Ayarlar → API ve dosyalar bölümünde görür. Diğer her şey için şirket numarası ve çağrının zamanıyla OptiRoutes destek ekibiyle iletişime geçin — anahtarın kendisini hiçbir zaman göndermeyin.