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    timestamptz

RLS: somente admin e operador da empresa dona do frete acessam.

Webhook

Cada INSERT dispara marketplace.lead.created via outbox. Veja catálogo de eventos.