Guia de integração
O padrão recomendado para DMS, ERPs, marketplaces e sistemas de seguradoras tem quatro partes: identificar o veículo, fazer a carga em lote, manter tudo atualizado pelo feed de alterações (a Tabela FIPE muda todo mês) e, opcionalmente, reagir na hora com webhooks.
1. Identificar o veículo
Há quatro caminhos até o código FIPE e o ano, a chave de tudo no Datacar:
- Seletor em cascata (sem custo):
GET /v1/catalog/car/brands→/brands/{brand_id}/models→/models/{model_id}/years. Usecar,motorcycleoutruck. - Código FIPE conhecido:
GET /v1/vehicles/005340-6lista os anos e combustíveis disponíveis (sem custo). - Chassi:
GET /v1/vin/9BWAB45U3FT123456lê fabricante, país e ano modelo e sugere versões do catálogo. - Placa (escopo
plates:read):GET /v1/plates/ABC1D23?include=vehicletraz marca, modelo, anos, cor, UF e os códigos FIPE compatíveis, já com a ficha da melhor correspondência.
curl "https://datacar.digitalmart.com.br/api/v1/vehicles/005340-6/2015-3?include=history" \
-H "Authorization: Bearer $DATACAR_API_KEY"2. Carga em lote
Envie até 100 veículos por chamada para POST /v1/vehicles/batch, no formato <código FIPE>:<ano>. Os que já estão catalogados voltam na hora; os novos voltam como processing e são consultados em segundo plano. Com wait_ms a API tenta consultá-los dentro da própria requisição.
curl -X POST https://datacar.digitalmart.com.br/api/v1/vehicles/batch \
-H "Authorization: Bearer $DATACAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "vehicles": ["005340-6:2015-3", "004516-0:2023", "811138-3:2020-1"], "view": "flat", "wait_ms": 5000 }'{
"data": [
{ "input": "005340-6:2015-3", "id": "005340-6:2015-3", "status": "ready", "revision": 3,
"data": { "marca": "Volkswagen", "modelo": "Amarok", "carroceria": "Picape", "cambio": "Automático",
"preco_fipe": 96781, "mes_referencia": "2026-10", "...": "..." } },
{ "input": "004516-0:2023", "id": "004516-0:2023-5", "status": "ready", "revision": 1, "data": { "...": "..." } },
{ "input": "811138-3:2020-1", "id": "811138-3:2020-1", "status": "processing", "data": null, "revision": null }
],
"summary": { "ready": 2, "processing": 1, "not_found": 0, "invalid": 0 }
}ready consomem cota, e o mesmo veículo repetido no lote é cobrado uma vez. Para itens processing, assine o webhook vehicle.enriched ou repita a chamada depois de alguns segundos.3. Sincronização incremental
Todo mês a FIPE publica uma nova tabela e o Datacar reprocessa os veículos nos dias seguintes. Em vez de reconsultar o estoque inteiro, leia o feed: ele traz apenas os veículos que mudaram desde a última leitura, em ordem, com cursor estável. Com scope=catalog (padrão) você recebe só os veículos que já consultou, sem custo.
curl "https://datacar.digitalmart.com.br/api/v1/changes?since=2026-10-01T00:00:00Z&limit=500" \
-H "Authorization: Bearer $DATACAR_API_KEY"let cursor = await db.get('datacar_cursor') // guarde entre execuções
do {
const url = new URL('https://datacar.digitalmart.com.br/api/v1/changes')
if (cursor) url.searchParams.set('cursor', cursor)
else url.searchParams.set('since', '2026-10-01T00:00:00Z')
const res = await fetch(url, { headers: { Authorization: `Bearer ${KEY}` } })
const page = await res.json()
for (const item of page.data) await upsertVehicle(item.vehicle) // item.revision só cresce
if (page.next_cursor) cursor = page.next_cursor
await db.set('datacar_cursor', cursor)
if (!page.next_cursor) break
} while (true)4. Reconsultas baratas com ETag
Toda ficha vem com ETag. Guarde-o e envie em If-None-Match na próxima consulta: se nada mudou, a resposta é 304, sem corpo e sem consumir cota.
GET /api/v1/vehicles/005340-6/2015-3 HTTP/1.1
If-None-Match: W/"5f1c2d…-9a8b7c6d"
HTTP/1.1 304 Not Modified5. Webhooks
Cadastre um endpoint e receba vehicle.updated (com price_changed) assim que um veículo que você consulta mudar. Detalhes de assinatura e retentativas em Webhooks.
Boas práticas
- Publique automaticamente campos com confiança ≥ 0,8 (
include=provenance) e mande para revisão os que tiverem alertaconflict. - Use
view=flatpara planilhas e sistemas chave/valor;fields=para trafegar só o necessário. - Trate
202e503com retentativa apósRetry-After. - Chame a API do seu servidor, nunca do navegador.