API — Leads do Marketplace
Vitrine pública e gestão de leads.
Endpoints públicos vs autenticados
A vitrine (
/fretes) e o detalhe (/f/:slug) são públicos e usam server functions sem auth. A criação de lead também é pública. A gestão de leads exige autenticação do embarcador.GET /fretes — vitrine pública
Retorna fretes com visibility=publico e status=publicado. Aceita filtros via querystring: originState, destinationState, vehicleType, minPrice, maxPrice, pickupFrom, search, limit.
bash
curl "https://freteflow.fr.com.br/fretes?originState=SP&vehicleType=truck"GET /f/:slug — detalhe público
Resposta limitada a campos seguros do frete:
json
{
"id": "...",
"public_slug": "a1b2c3d4",
"code": "FRT-0123",
"origin_city": "São Paulo",
"origin_state": "SP",
"destination_city": "Rio de Janeiro",
"destination_state": "RJ",
"cargo_type": "Carga geral",
"weight_kg": 12000,
"vehicle_type": "Truck",
"price": 4500,
"pickup_at": "2026-05-10T08:00:00Z",
"delivery_at": "2026-05-11T18:00:00Z",
"company_name": "Acme Logística"
}POST createMarketplaceLead — capturar interesse
Server function pública usada pelo formulário em /f/:slug. Validações: nome (2–80), telefone (regex), CPF e placa opcionais, mensagem ≤ 500 chars, honeypot e rate-limit de 5 req/min por IP.
json
{
"slug": "a1b2c3d4",
"driverName": "Carlos Oliveira",
"driverPhone": "(11) 99999-0000",
"driverDoc": "000.000.000-00",
"vehiclePlate": "ABC1D23",
"message": "Tenho disponibilidade para essa rota."
}Resposta:
json
{ "ok": true }Gestão (autenticada)
As funções abaixo exigem token do embarcador (RLS aplica filtro por company_id):
listCompanyLeads()— lista os leads do embarcador (até 200, ordem decrescente).updateLeadStatus({ id, status })— status:novo,contatado,convertido,descartado.countNewLeads()— usado pelo badge da sidebar.
Schema da tabela marketplace_leads
text
id uuid pk
freight_id uuid → freights(id)
company_id uuid → companies(id) (dono do frete)
driver_name text
driver_phone text
driver_doc text (CPF, opcional)
vehicle_plate text (opcional)
message text (opcional)
status text (novo|contatado|convertido|descartado)
source text (default 'public_marketplace')
ip_addr text
user_agent text
created_at timestamptzRLS: somente admin e operador da empresa dona do frete acessam.
Webhook
Cada INSERT dispara marketplace.lead.created via outbox. Veja catálogo de eventos.