API da Tabela FIPE por placa
Três consultas pela placa — dados do veículo, candidatos da Tabela FIPE com preço e série histórica — direto do seu sistema. Pré-pago, R$ 0,08 por consulta.
Crie sua chave, recarregue o saldo e comece a consultar por código.
O que é
A API do FipePlaca abre, para integração, a mesma base que atende o site e o aplicativo. São três consultas que formam um funil: os dados do veículo a partir da placa, os candidatos da Tabela FIPE com preço e confiança, e a série histórica de preço do modelo que você escolher entre eles.
Cada passo é uma consulta distinta, e não uma fatia da mesma resposta — porque o cruzamento entre a placa e a Tabela FIPE é ambíguo com frequência. Em vez de escolher um modelo em silêncio e cobrar como se fosse certeza, a segunda rota entrega os candidatos e o quanto cada um casa. Quem integra decide com o que o dado sustenta.
Preço por rota
Pré-pago, sem mensalidade e sem franquia mínima de uso: você recarrega o saldo e ele só sai quando uma consulta entrega resultado. Placa que não existe, parâmetro malformado e falha nossa não são cobrados.
| Rota | Entrega | SKU | Preço |
|---|---|---|---|
GET /placa/{placa} | Os dados do veículo. | consulta-veiculo | R$ 0,08 |
GET /placa/{placa}/fipe | Os candidatos da Tabela FIPE, com preço e confiança de cada um. | consulta-fipe | R$ 0,08 |
GET /fipe/{codigoFipe}/historico | A série de preço do modelo escolhido, até 48 meses. | consulta-historico | R$ 0,08 |
GET /saldo | O saldo da conta. Não cobra nada. | — | grátis |
O SKU é o que aparece no extrato de consultas do painel, linha a linha — é por ele que você reconcilia o gasto por rota. As três valem o mesmo hoje de propósito; a tabela existe porque elas podem divergir, e aí você já tem onde olhar.
Como começar
1. Crie sua conta
Ao cadastrar, sua primeira chave de API aparece na tela em texto puro, uma única vez. Copie e guarde: o FipePlaca guarda só um hash da chave, e não há como recuperar o texto depois.
2. Confirme seu e-mail
Libera a recarga de saldo da conta.
3. Recarregue o saldo
A partir de R$ 30,00. O crédito é pré-pago e só sai da conta quando uma consulta entrega resultado.
4. Comece a consultar
Use a chave no cabeçalho
Authorization: Bearer. Perdeu a chave? Crie outra em Chaves de API, dentro do painel.
Autenticação
Toda chamada leva a chave no cabeçalho Authorization, com o esquema Bearer. Qualquer outro esquema é recusado com CHAVE_INVALIDA. A chave começa com fp_live_ e aparece completa uma única vez, no momento em que é criada.
Authorization: Bearer fp_live_a1b2c3d4e5f6...O endereço base de todas as rotas é https://services.fipeplaca.com.br/gateway/v1.
O funil de três passos
As três rotas encaixam sem você montar nada à mão. A rota de candidatos devolve, em cada item, os dois valores que a rota de histórico exige: codigoFipe vira o código do caminho, e anoId vira o parâmetro ano. Copie e cole, literalmente.
# 1. dados do veículo — confirme que é o carro certo
curl -H "Authorization: Bearer fp_live_..." \
https://services.fipeplaca.com.br/gateway/v1/placa/ABC1D23
# 2. os candidatos da Tabela FIPE para essa placa
curl -H "Authorization: Bearer fp_live_..." \
https://services.fipeplaca.com.br/gateway/v1/placa/ABC1D23/fipe
# o primeiro candidato traz:
# "codigoFipe": "001235-1"
# "anoId": "2021-1"
# 3. a série histórica DAQUELE candidato
curl -H "Authorization: Bearer fp_live_..." \
"https://services.fipeplaca.com.br/gateway/v1/fipe/001235-1/historico?ano=2021-1&meses=24"Cada passo é cobrado por si. Você não precisa dos três: quem só quer conferir o veículo para no passo 1, quem precisa do valor de mercado para no passo 2, e o passo 3 existe para quem precisa da curva — depreciação, laudo, garantia, precificação de seguro.
A rota de histórico não aceita placa, e isso é decisão de desenho: a rota de candidatos existe justamente porque o cruzamento placa → modelo é ambíguo. Aceitar placa no passo 3 traria de volta a ambiguidade que o passo 2 foi feito para expor — e a escolha entre os candidatos é sua, não nossa.
/placa/{placa}Devolve os dados do veículo da placa consultada. Cobra R$ 0,08 por consulta bem-sucedida, no SKU consulta-veiculo. Devolve sempre o mesmo conjunto de chaves — um campo que a base não tem para aquele veículo vem null, nunca some. Quem integrou não precisa testar se a chave existe, só se o valor é nulo.
O chassi sai mascarado, com os quatro últimos caracteres apenas. Renavam e qualquer campo que identifique uma pessoa não saem desta rota. O valor e o código da Tabela FIPE também não saem aqui: o cruzamento entre a placa e o modelo da tabela é ambíguo com frequência, e publicar um código só seria escolher um candidato em silêncio. Preço e código FIPE saem em /placa/{placa}/fipe.
| Parâmetro | Onde | Obrigatório | Descrição |
|---|---|---|---|
placa | caminho | sim | Grafia antiga (ABC1234) ou Mercosul (ABC1D23), maiúsculas, sem hífen nem espaço. |
Placa fora desses dois formatos é recusada na porta com 400 PLACA_INVALIDA, sem cobrar nada e sem consultar o fornecedor — é erro de entrada, não falha nossa, e repetir a mesma placa mal formatada nunca vai funcionar.
curl -H "Authorization: Bearer fp_live_..." https://services.fipeplaca.com.br/gateway/v1/placa/ABC1D23HTTP/1.1 200 OK
X-Saldo-Centavos: 4992
{
"marca": "FIAT",
"modelo": "ARGO DRIVE 1.0",
"anoFabricacao": 2020,
"anoModelo": 2021,
"cor": "PRATA",
"municipio": "CAMPINAS",
"uf": "SP",
"cilindradas": 999,
"potencia": 77,
"combustivel": "ALCOOL / GASOLINA",
"chassi": "*************1234"
}Campos da resposta:
marcastring | nullMarca do veículo.
modelostring | nullModelo do veículo.
anoFabricacaonumber | nullAno de fabricação — não é sempre igual ao ano-modelo.
anoModelonumber | nullAno-modelo — é por ele que a Tabela FIPE precifica o veículo.
corstring | nullCor predominante.
municipiostring | nullMunicípio de emplacamento.
ufstring | nullUF de emplacamento, com duas letras. Vem null quando a base não devolve uma UF de verdade — nunca um estado provável.
cilindradasnumber | nullCilindrada do motor, em cm³ (ex.: 999 para um 1.0).
potencianumber | nullPotência do motor, em cv. Vem null quando a base traz um texto que não dá para converter com segurança.
combustivelstring | nullCombustível registrado para o veículo, como a base o escreve (ex.: ALCOOL / GASOLINA).
chassistring | nullChassi MASCARADO: só os quatro últimos caracteres, o resto em asteriscos.
Erros que esta rota devolve (o que cada um significa está em Erros):
PLACA_INVALIDA400CHAVE_INVALIDA401SEM_SALDO402PLACA_NAO_ENCONTRADA404FILA_CHEIA503FORNECEDOR_INDISPONIVEL503ERRO_401401ERRO_403403
X-Saldo-Centavos pode faltar
X-Saldo-Centavos traz o saldo (em centavos) depois de cobrar esta consulta, e acompanha as três rotas pagas. Ele pode faltar quando a leitura do saldo falha depois de a consulta já ter sido entregue e paga — a ausência é honesta, e o cliente não deve programar assumindo que ele sempre vem./placa/{placa}/fipeDevolve os candidatos da Tabela FIPE para aquela placa. Cobra R$ 0,08 por consulta bem-sucedida, no SKU consulta-fipe.
A resposta é um array, ordenado do melhor casamento para o pior, e essa ordem é contrato: [0] é o candidato mais provável, e pode confiar nisso. Uma placa cujo cruzamento é ambíguo sai com vários candidatos; uma cujo vencedor é destacado sai com um só. A ordem é de casamento, não de preço — o primeiro candidato continua em primeiro mesmo quando é ele que está sem preço.
| Parâmetro | Onde | Obrigatório | Descrição |
|---|---|---|---|
placa | caminho | sim | Grafia antiga (ABC1234) ou Mercosul (ABC1D23), maiúsculas, sem hífen nem espaço. |
curl -H "Authorization: Bearer fp_live_..." https://services.fipeplaca.com.br/gateway/v1/placa/ABC1D23/fipeHTTP/1.1 200 OK
X-Saldo-Centavos: 4984
[
{
"codigoFipe": "001235-1",
"modelo": "Doblo Cargo 1.8 mpi Fire Flex 8V/16V 4p",
"anoModelo": 2021,
"anoId": "2021-1",
"combustivel": "Gasolina",
"valorFipe": "R$ 66.796,00",
"mesReferencia": "setembro de 2026",
"confianca": "alta",
"matchAno": true,
"matchCombustivel": null
},
{
"codigoFipe": null,
"modelo": "Doblo Cargo 1.8 mpi Fire Flex 8V/16V 4p (kit)",
"anoModelo": 2021,
"anoId": "2021-2",
"combustivel": null,
"valorFipe": null,
"mesReferencia": null,
"confianca": null,
"matchAno": null,
"matchCombustivel": null
}
]Campos de cada item do array:
codigoFipestring | nullO código da Tabela FIPE daquela versão. É a entrada da rota de série histórica. Vem null no candidato sem preço: o código chega junto do preço, e inventá-lo seria afirmar o que ninguém mediu.
modelostring | nullO nome do modelo como a FIPE o escreve — não como a base de veículos escreve.
anoModelonumber | nullO ano-modelo sob o qual a FIPE publicou este preço, extraído do anoId. Não é o ano da placa.
anoIdstring | nullO identificador de ano da FIPE (ex.: 2021-1: ano-modelo e código de combustível). É o parâmetro ano da rota de série histórica, e sai pronto daqui para o cliente não ter de montar a string na mão.
combustivelstring | nullO combustível como a FIPE o rotula. Ela chama de "Gasolina" muito carro flex — leia junto com matchCombustivel.
valorFipestring | nullO preço como a FIPE o publica (ex.: R$ 66.796,00). Vem null quando a FIPE não tem preço para esta versão — e o candidato continua no array de propósito.
mesReferenciastring | nullO mês da tabela a que o preço se refere (ex.: setembro de 2026).
confianca'alta' | 'media' | 'baixa' | nullQuanto este candidato casa com o veículo da placa. Lista fechada: um nível fora dela sai null, nunca um valor que a doc não descreve.
matchAnoboolean | nullSe o ano-modelo do candidato bate com o do veículo. null quando não dá para afirmar.
matchCombustivelboolean | nullSe o combustível bate. null quando não dá para afirmar — e isso NÃO significa false. Ver o aviso abaixo.
valorFipe: null não é erro — é um candidato de propósito
valorFipe: null significa este modelo casou com a placa, mas a FIPE não publica preço para ele. O candidato não é omitido, e não deve ser tratado como falha: é justamente ele que explica por que o preço do vizinho não é certeza. Esconder esse item esconderia metade da ambiguidade que esta rota existe para mostrar.
Só quando nenhum candidato se sustenta a rota devolve 404 FIPE_NAO_ENCONTRADA — e aí nada é cobrado.
matchCombustivel: null não quer dizer false
fuel: "Gasolina". Divergir do rótulo, portanto, não é erro de cruzamento, e nós não forçamos um false que ninguém pode afirmar: sai null, que quer dizer “não dá para afirmar”. Quem programa if (!matchCombustivel) descartar() descarta exatamente o candidato certo.Erros que esta rota devolve (o que cada um significa está em Erros):
PLACA_INVALIDA400CHAVE_INVALIDA401SEM_SALDO402PLACA_NAO_ENCONTRADA404FIPE_NAO_ENCONTRADA404FILA_CHEIA503FORNECEDOR_INDISPONIVEL503ERRO_401401ERRO_403403
/fipe/{codigoFipe}/historicoDevolve a série de preço daquele código FIPE naquele ano-modelo, do mês mais recente para o mais antigo. Cobra R$ 0,08 por consulta bem-sucedida, no SKU consulta-historico — uma cobrança pela série inteira, não por mês.
Os dois parâmetros saem prontos da rota de candidatos: codigoFipe e anoId.
| Parâmetro | Onde | Obrigatório | Descrição |
|---|---|---|---|
codigoFipe | caminho | sim | O código FIPE, no formato 001235-1. Sai do campo codigoFipe da rota de candidatos. |
ano | query | sim | O identificador de ano, no formato 2021-1. Sai do campo anoId da rota de candidatos. É obrigatório: um código FIPE vale para vários anos-modelo, e escolher um por conta própria venderia a série de um veículo que você não pediu. |
meses | query | não | Quantos meses buscar. Padrão 12, teto 48. Pedir mais que o teto é TRUNCADO, não recusado. Já 0, -3, 1.5 e abc são 400 PARAMETRO_INVALIDO — pedido grande demais é claro, pedido sem sentido não é. |
curl -H "Authorization: Bearer fp_live_..." \
"https://services.fipeplaca.com.br/gateway/v1/fipe/001235-1/historico?ano=2021-1&meses=48"HTTP/1.1 200 OK
X-Saldo-Centavos: 4976
{
"codigoFipe": "001235-1",
"anoId": "2021-1",
"modelo": "Doblo Cargo 1.8 mpi Fire Flex 8V/16V 4p",
"anoModelo": 2021,
"combustivel": "Gasolina",
"tipoVeiculo": 1,
"mesesSolicitados": 48,
"serie": [
{ "referencia": 337, "mesReferencia": "setembro de 2026", "valorFipe": "R$ 16.889,00" },
{ "referencia": 336, "mesReferencia": "agosto de 2026", "valorFipe": "R$ 16.902,00" },
{ "referencia": 334, "mesReferencia": "junho de 2026", "valorFipe": "R$ 16.955,00" }
]
}Repare no exemplo: a referência 335 não está lá. Esse é o contrato funcionando — ver o aviso sobre buracos, abaixo.
Campos da resposta:
codigoFipestringO código FIPE consultado, como veio no caminho.
anoIdstringO identificador de ano consultado, como veio na query.
modelostring | nullO nome do modelo, lido do ponto mais recente que respondeu.
anoModelonumber | nullO ano-modelo, do mesmo ponto.
combustivelstring | nullO combustível, do mesmo ponto.
tipoVeiculonumber | nullO que o fornecedor afirma: 1 carro, 2 moto, 3 caminhão.
mesesSolicitadosnumberQuantos meses foram PEDIDOS ao fornecedor, já truncados pelo teto de 48. Não é o tamanho da série.
seriePontoHistorico[]Os pontos de preço, do mais recente para o mais antigo — e essa ordem é contrato. Mês que a FIPE não tem sai AUSENTE, então serie.length pode ser menor que mesesSolicitados.
Campos de cada ponto de serie:
referencianumberO código da referência FIPE daquele mês (337 é setembro de 2026). A FIPE pula códigos de vez em quando — não faça aritmética com ele.
mesReferenciastring | nullComo o fornecedor nomeia o mês no corpo do preço (ex.: setembro de 2026).
valorFipestringO preço daquele mês, como a FIPE o publica.
A primeira consulta de um modelo pode demorar
A FIPE não publica série: cada mês é uma leitura separada ao fornecedor. Pedir 48 meses significa até 48 leituras, disparadas em rodadas paralelas com limite. Dimensione o timeout do seu cliente para isso — a primeira consulta de um modelo é a lenta.
Dentro do mês corrente, a repetição do mesmo par código+ano é servida do nosso cache e volta rápido. Entre meses, não: quando a tabela FIPE vira, a série é buscada de novo do zero. Não prometemos um acervo que fica permanentemente quente — prometemos que, dentro do mês, a segunda chamada é barata.
Mês sem preço sai AUSENTE — nunca interpolado
serie.length pode ser menor que mesesSolicitados — e por isso cada ponto carrega a sua referencia.Série vazia é 404 e não cobra; um ponto que seja cobra
404 FIPE_NAO_ENCONTRADA e nada é cobrado — zero pontos é zero entrega. Série parcial, com um ponto que seja, é entrega legítima e cobra normalmente: o tamanho do array é o que você lê para saber o que recebeu.Erros que esta rota devolve (o que cada um significa está em Erros):
PARAMETRO_INVALIDO400CHAVE_INVALIDA401SEM_SALDO402FIPE_NAO_ENCONTRADA404FILA_CHEIA503FORNECEDOR_INDISPONIVEL503ERRO_401401ERRO_403403
/saldoNão cobra nada e não tem parâmetros. Devolve o saldo atual da conta — para você conferir quanto resta sem gastar uma consulta.
curl -H "Authorization: Bearer fp_live_..." https://services.fipeplaca.com.br/gateway/v1/saldoHTTP/1.1 200 OK
{
"saldoCents": 5000,
"saldo": "50.00"
}Erros que esta rota devolve (o que cada um significa está em Erros):
CHAVE_INVALIDA401ERRO_401401ERRO_403403
Erros
Todo erro do gateway devolve { erro: { codigo, mensagem } }. Programe contra codigo — a lista abaixo é fechada e a mensagem pode mudar de texto sem aviso. Qual rota devolve qual código está no bloco de cada rota.
Uma resposta pode não ter corpo nenhum
499 sem corpo — nenhum JSON, nenhum { erro: ... } . Quem faz response.json() sem checar isso primeiro recebe uma exceção de parse, não um erro do contrato.| Código | Status | Quando acontece | O que fazer |
|---|---|---|---|
PLACA_NAO_ENCONTRADA | 404 | A placa não existe na base de dados de veículos. | Não repita a mesma placa — confirme o dado com o cliente. |
FIPE_NAO_ENCONTRADA | 404 | Na consulta de FIPE por placa: a placa existe e os dados do veículo vieram, mas nenhum modelo da Tabela FIPE corresponde a ele. Na série histórica: o código FIPE e o ano informados não produziram nenhum ponto de preço — série vazia é zero entrega, não resultado. | Não repita a mesma consulta: nem a Tabela FIPE cobre todo veículo, nem um código FIPE inexistente passa a existir tentando de novo. Nada é cobrado neste erro. Na consulta de placa, os dados do veículo continuam disponíveis em /placa/:placa. |
CHAVE_INVALIDA | 401 | A chave está ausente, incorreta, revogada, sem conta associada — ou o cabeçalho Authorization veio malformado ou com outro esquema que não Bearer. | Confira o cabeçalho Authorization: Bearer e se a chave não foi revogada em Chaves de API. |
SEM_SALDO | 402 | Não há saldo suficiente para cobrir esta consulta. | Recarregue o saldo no painel antes de tentar de novo. |
FILA_CHEIA | 503 | O teto de chamadas simultâneas do nosso processo está ocupado. NÃO é uma cota da sua chave: o contador é do processo inteiro e não olha de qual chave a chamada veio. | Espere e tente de novo — nada é cobrado neste erro. |
PLACA_INVALIDA | 400 | A placa enviada não está no formato aceito: antiga (ABC1234) ou Mercosul (ABC1D23), sem hífen nem espaço. A consulta é recusada na porta, antes de qualquer cobrança. | Não repita a chamada: corrija o formato antes. Nada é cobrado neste erro, e repetir a mesma placa mal formatada nunca vai funcionar. |
PARAMETRO_INVALIDO | 400 | Um parâmetro de caminho ou de query está ausente ou fora de forma — o ano (ano) da série histórica, que é obrigatório, o código FIPE do caminho, ou meses, que precisa ser um inteiro positivo. A consulta é recusada na porta, antes de qualquer cobrança. | Não repita a chamada: corrija o parâmetro antes. Nada é cobrado neste erro. Pedir mais de 48 meses NÃO cai aqui — o pedido é truncado em 48 e atendido. |
FORNECEDOR_INDISPONIVEL | 503 | Falha temporária no fornecedor de dados por trás da consulta. Na série histórica, também é o código de uma falha de credencial NOSSA junto à FIPE — sem ela as referências passadas são recusadas, e uma série de um mês só ficaria indistinguível de um veículo que de fato tem um mês de histórico. | Tente de novo com espera — este erro é de fato temporário, e nada é cobrado nele. Placa em formato inválido não cai mais aqui: ela tem código próprio (PLACA_INVALIDA). |
ERRO_401 | 401 | O IP de origem da chamada está bloqueado (hook global, não é sobre a chave). | Não é a chave — confirme de onde a chamada está saindo antes de repetir. |
ERRO_403 | 403 | Mesmo bloqueio de IP do ERRO_401, para o caso em que o status vem 403. | Não é a chave — confirme de onde a chamada está saindo antes de repetir. |
Promessas do contrato
- Conjunto de chaves estável — cada rota sempre devolve as mesmas chaves. Um dado que a base ou a FIPE não têm para aquele veículo vem
null, nunca some. Enullquer dizer “não sabemos”: nunca publicamos um valor plausível no lugar de um que não podemos garantir. - Ordem é contrato onde dissemos que é — os candidatos de
/placa/{placa}/fipevêm do melhor casamento para o pior, e aseriedo histórico vem do mês mais recente para o mais antigo. Reordenar qualquer uma das duas seria quebra de contrato, não detalhe de apresentação. - Você só paga entrega — placa inexistente, parâmetro malformado, fila cheia, falha nossa e série vazia não são cobradas. Uma consulta que devolve resultado é cobrada uma vez, mesmo quando custou dezenas de leituras ao fornecedor.
- Sem franquia, sem cota, sem limite por segundo — não existe rate limit por IP nem por chave, e nenhuma cota é reservada ou descontada por chave: o saldo é o teto, e você consulta na velocidade que ele permitir. O que existe é um teto de chamadas simultâneas do nosso processo, para ele não cair levando o site junto — não é trava comercial. Ele é folgado de propósito e uma integração legítima não chega nele; uma rajada que chegue recebe
FILA_CHEIA, que não é cobrada e passa assim que as chamadas em andamento terminam. Cada conta pode ter até 3 chaves ativas. - Erros programáveis — os códigos de erro são uma lista fechada e não mudam sem aviso; a mensagem em texto pode mudar, o código não.
Já tem conta?
Crie sua chave, acompanhe o saldo e o histórico de consultas no painel — em um clique.