O que é
Cada empresa no OptiRoutes tem a sua própria pasta privada de arquivos: os pedidos que ela carrega, as notas de entrega assinadas (POD) com suas fotos e assinaturas, as exportações de rotas e os relatórios de fim de dia. A API de arquivos permite que os seus sistemas leiam e gravem diretamente nessa pasta, sem um servidor FTP no meio.
- Endereço:
https://srv2.optiroutes.com/api/v1— somente HTTPS. - Acesso: uma chave de API que o gestor da empresa cria no OptiRoutes, em Configurações → API e arquivos. Não é preciso fazer nenhuma solicitação ao suporte do OptiRoutes.
- Todos os tipos de arquivo com os quais o sistema trabalha hoje: CSV, JSON, TXT, XLSX/XLS, PDF e imagens.
- As respostas são em JSON, exceto os downloads de arquivos, que retornam o próprio arquivo.
Comece em 3 passos
- Crie uma chave. No OptiRoutes, o gestor abre Configurações → API e arquivos, clica em Nova chave, dá um nome a ela (por exemplo, “servidor do ERP”), escolhe as permissões e copia a chave. A chave é exibida uma única vez.
- Verifique a conexão.
curl -H "Authorization: Bearer $OPTIROUTES_KEY" https://srv2.optiroutes.com/api/v1/me - Baixe os POD assinados de hoje em um único ZIP:
curl -H "Authorization: Bearer $OPTIROUTES_KEY" -o pod.zip "https://srv2.optiroutes.com/api/v1/pod/archive?date=$(date +%F)"
Segurança — leia com atenção
- Trate a chave como uma senha. Guarde-a em um cofre de segredos ou em uma variável de ambiente no seu servidor. Nunca a coloque em uma página da web, em um aplicativo móvel, em um e-mail, em um chamado ou no controle de versão.
- Privilégio mínimo. Dê a cada sistema a sua própria chave, apenas com as permissões de que ele precisa:
pod:read(somente POD assinados),files:read(leitura de todos os arquivos da empresa),files:write(envio de pedidos e de arquivos da caixa de entrada). - Limite os endereços. Quando o seu servidor tiver um endereço IP fixo, adicione-o à chave (“Endereços permitidos”). Uma chamada vinda de qualquer outro endereço é recusada.
- Validade e rotação. Uma chave pode expirar depois de um número de dias. Para fazer a rotação: crie uma nova chave, mude o seu sistema para ela e depois revogue a antiga — sem nenhuma indisponibilidade.
- Revogue imediatamente uma chave que possa ter vazado: Configurações → API e arquivos → Revogar chave. Ela deixa de funcionar em até 30 segundos.
- Auditoria. Cada chamada é registrada (hora, endereço, arquivo, resposta) e exibida ao gestor na mesma tela.
- O OptiRoutes guarda apenas uma impressão digital (SHA-256) de cada chave, nunca a chave em si. As conexões são somente por HTTPS (TLS 1.2+).
- Uma chave alcança apenas a pasta da própria empresa. Os arquivos de outras empresas e as pastas internas do sistema nunca podem ser acessados.
Autenticação
Envie a chave em todas as solicitações, em um destes cabeçalhos:
Authorization: Bearer opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: opr_2813_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUma chave tem este formato: opr_2813_… (o número da empresa, seguido de 32 caracteres aleatórios).
A pasta da empresa
| Pasta | O que contém | Quem grava |
|---|---|---|
orders_files/ | O arquivo diário de pedidos que o OptiRoutes carrega: orders_files/YYYY-MM-DD.csv (ou .json / .TXT, conforme definido em Configurações → Carregamento de pedidos). Exportações de rotas: orders_files/routes_export_YYYY_MM_DD.csv. | Você (pedidos) · OptiRoutes (exportações) |
pod/YYYY/MM/DD/ | Os POD assinados desse dia: <order>_sign_….pdf, a assinatura e as fotos (<order>_….png/jpg). | OptiRoutes |
pod/ | Notas de entrega originais a serem assinadas no aplicativo do motorista: pod/<order number>.pdf. | Você |
reports/YYYY/MM/ | Relatórios de fim de dia e de devoluções. | OptiRoutes |
podBaseFile/ | O formulário base do POD. | Você |
inbox/ | Pasta livre para os arquivos que você quiser entregar. | Você |
Referência
| Chamada | Permissão | O que faz |
|---|---|---|
GET /api/v1/me | qualquer | Verifica a chave. Responde com o número da empresa, as permissões da chave e o seu endereço. |
GET /api/v1/files?folder=<folder> | files:read (pod:read: somente pod/) | Lista um nível de pasta: arquivos (nome, caminho, tamanho, data de modificação) e subpastas. |
GET /api/v1/files/download?path=<file> | files:read (pod:read: somente pod/) | Baixa um arquivo. |
PUT /api/v1/files?path=<file> | files:write | Envia um arquivo (o corpo da solicitação é o arquivo, ou um formulário multipart com um campo file). Um arquivo existente é substituído. No máximo 50 MB. |
DELETE /api/v1/files?path=<file> | files:write | Exclui um arquivo que você enviou (onde o envio é permitido). |
GET /api/v1/pod?date=YYYY-MM-DD[&order=<number>] | pod:read | Os arquivos POD de um dia, cada um com o seu número de pedido e o tipo: signed_pdf, signature, photo. |
GET /api/v1/pod/archive?date=YYYY-MM-DD[&kind=signed_pdf] | pod:read | Todos os arquivos POD do dia em um único ZIP. |
Exemplo de resposta de uma listagem:
{
"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" }
]
}Tarefas comuns
Enviar o arquivo de pedidos de hoje
# 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"O OptiRoutes carrega o arquivo da mesma forma que carrega hoje (pelo carregamento automático de Configurações → Carregamento de pedidos, ou por “Carregar arquivo” do usuário).
Baixar os POD assinados de um pedido
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"
Baixar o relatório de fim de dia
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()));
}Trabalhar como com FTP — um script de sincronização de pasta
As equipes que trabalhavam com FTP podem manter uma pasta no próprio servidor sincronizada com a pasta da empresa: uma tarefa agendada baixa os arquivos novos (por exemplo, os POD) e envia os arquivos que você coloca em uma pasta local. O script PowerShell abaixo faz as duas coisas; execute-o a cada poucos minutos pelo Agendador de Tarefas do Windows (no Linux, use as linhas de curl com 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
}Migrar uma empresa do FTP para a API
O gestor faz a troca em Configurações → API e arquivos → Como os arquivos da empresa circulam: API (recomendado). A partir desse momento, nada mais é enviado ao FTP da empresa, e cada arquivo fica, em vez disso, na pasta da empresa:
| Com FTP | Com a API |
|---|---|
| Você coloca o arquivo de pedidos no FTP | PUT /api/v1/files?path=orders_files/YYYY-MM-DD.csv |
Os POD assinados são enviados para /POD/ no seu FTP | GET /api/v1/pod?date=… / /api/v1/pod/archive?date=… |
A exportação de rotas é enviada para /orders/ | orders_files/routes_export_YYYY_MM_DD.csv |
Os relatórios são enviados para /orders/YYYY/MM/ | reports/YYYY/MM/ |
As empresas novas trabalham com a API desde o início. Voltar para o FTP é feito pela mesma chave de alternância.
Empresas no servidor antigo do OptiRoutes
Uma empresa que ainda trabalha com o servidor antigo do OptiRoutes (WEB) pode usar a API para os seus POD assinados: crie uma chave com a permissão pod:read e use /api/v1/pod, /api/v1/pod/archive e /api/v1/files/download?path=pod/…. Os demais arquivos continuam circulando como hoje, até que a empresa migre para o novo servidor.
Erros
Um erro responde com {"ok": false, "error": "<code>", "message": "<explanation>"}.
| HTTP | error | O que fazer |
|---|---|---|
| 401 | missing_key / invalid_key | Envie a chave; verifique se ela não foi revogada nem expirou. |
| 403 | scope_missing | A chave não tem a permissão — crie uma chave que a tenha. |
| 403 | ip_not_allowed | Faça a chamada de um endereço permitido ou atualize os endereços da chave. |
| 403 | folder_read_only | Envie apenas para orders_files/, inbox/, podBaseFile/ ou pod/<file>.pdf. |
| 400 | invalid_path / invalid_date | Os caminhos são relativos (orders_files/a.csv) e as datas têm o formato YYYY-MM-DD. |
| 404 | not_found / no_pod_files | Arquivo inexistente / nenhum POD nesse dia. |
| 413 | file_too_large | No máximo 50 MB por arquivo. |
| 429 | rate_limited | Aguarde um minuto e tente novamente. |
| 502 / 503 | storage_unavailable / files_api_unavailable | Temporário — tente novamente em um minuto. |
Limites
- 300 solicitações por minuto por chave.
- 50 MB por arquivo.
- 20 chaves ativas por empresa.
- A listagem de uma pasta retorna até 5.000 entradas; para obter mais, liste as subpastas (por exemplo, um dia de POD).
Ajuda
O gestor da empresa vê cada chave, o seu último uso e as últimas chamadas em Configurações → API e arquivos. Para qualquer outro assunto, entre em contato com o suporte do OptiRoutes informando o número da empresa e o horário da chamada — nunca envie a chave em si.