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:

Ficha completabash
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.

Requisiçãobash
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 }'
Respostajson
{
  "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 }
}
Só itens 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.

Primeira leiturabash
curl "https://datacar.digitalmart.com.br/api/v1/changes?since=2026-10-01T00:00:00Z&limit=500" \
  -H "Authorization: Bearer $DATACAR_API_KEY"
Leituras seguintesjs
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.

http
GET /api/v1/vehicles/005340-6/2015-3 HTTP/1.1
If-None-Match: W/"5f1c2d…-9a8b7c6d"

HTTP/1.1 304 Not Modified

5. 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