Importar fretes em massa via API
Lê um CSV e cria fretes em paralelo, com retry e log.
CSV de exemplo
csv
code,origin_city,origin_state,destination_city,destination_state,cargo_type,weight_kg,price
F-001,São Paulo,SP,Rio de Janeiro,RJ,geral,1500,2400
F-002,Curitiba,PR,Florianópolis,SC,refrigerada,2000,3100
F-003,Belo Horizonte,MG,Vitória,ES,geral,800,1600Script Node (TypeScript)
ts
import { readFileSync } from "node:fs";
import { parse } from "csv-parse/sync";
const API_KEY = process.env.FRETEFLOW_API_KEY!;
const BASE = "https://freteflow.fr.com.br/api/public/v1";
const CONCURRENCY = 5;
const rows = parse(readFileSync("freights.csv"), {
columns: true,
skip_empty_lines: true,
});
async function createOne(row: Record<string, string>) {
for (let attempt = 1; attempt <= 3; attempt++) {
const res = await fetch(`${BASE}/freights`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
code: row.code,
origin: { city: row.origin_city, state: row.origin_state },
destination: { city: row.destination_city, state: row.destination_state },
cargo_type: row.cargo_type,
weight_kg: Number(row.weight_kg),
price: Number(row.price),
}),
});
if (res.ok) return console.log("OK", row.code);
if (res.status === 429) await new Promise((r) => setTimeout(r, 1000 * attempt));
else { console.error("FAIL", row.code, await res.text()); return; }
}
}
// roda em batches de CONCURRENCY
for (let i = 0; i < rows.length; i += CONCURRENCY) {
await Promise.all(rows.slice(i, i + CONCURRENCY).map(createOne));
}Boas práticas
Use
code como idempotency key — o FreteFlow rejeita códigos duplicados no mesmo período, então o script é seguro para re-execução parcial.