2ª via do ATPV-e
Segunda via do ATPV-e; cobertura nacional pelo fornecedor.
Resumo
| Item | Valor |
|---|---|
| Identificador técnico | atpve |
| Dados exigidos | placa + aceite_atpve (declaração do aviso) (no catálogo: placa) |
| O que devolve | Documento em PDF (sem JSON) |
| Preço vigente | R$ 39,99. Com a sua chave, GET /v1/servicos traz o seu preço. |
| Prazo | Prazo sujeito à disponibilidade da base, UF e situação do veículo. |
| Bloco veiculo | Não |
Requisição
Pelo endpoint comum de consultas, POST /v1/consultas. Os valores do exemplo são fictícios.
curl -X POST "https://api.zapcarconsulta.com.br/v1/consultas" \
-H "Authorization: Bearer $ZAPCAR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-erp-984281-atpve" \
-d '{"servico":"atpve","placa":"ABC1D23","aceite_atpve":{"aceito":true,"versao":"2026-09-23"}}'Declaração obrigatória
A 2ª via não é emitida quando a ATPV-e anterior já foi assinada e teve as firmas reconhecidas em cartório, e isso não pode ser verificado antes da emissão. Por isso o pedido exige a declaração do usuário final em aceite_atpve. A regra vale em todos os canais que vendem a 2ª via, não só na API.
Passo 1: Busque o aviso vigente
GET /public/avisos/atpveé público (não usa a sua chave) e devolve o texto do aviso, aversaovigente e ohash_sha256do texto integral.cURLaviso vigente curl https://api.zapcarconsulta.com.br/public/avisos/atpveJSONresposta 200 (textos abreviados) { "versao": "2026-09-23", "titulo": "Atenção antes de continuar", "mensagem": "Este serviço não emite uma nova ATPV-e para veículo cuja autorização anterior …", "complementar": "Se a ATPV-e existente já foi assinada ou reconhecida em cartório, não efetue a compra. …", "impedimentosTitulo": "Também podem impedir a emissão:", "impedimentos": ["Comunicação de venda já realizada", "Intenção de venda ativa", "…"], "declaracao": "Confirmo que a ATPV-e anterior não foi assinada nem teve firma reconhecida …", "texto_integral": "…", "hash_sha256": "…" }Passo 2: Mostre o aviso ao usuário final
Exiba o aviso no seu sistema e colha a confirmação dadeclaracaoantes de pedir a emissão. A declaração é do usuário final: não a envie sem que ele tenha visto o aviso.Passo 3: Envie a declaração junto com o pedido
aceitoprecisa ser o booleanotrue(o texto"true"é recusado) eversaoé a que veio no passo 1.
| HTTP | Código | Quando acontece |
|---|---|---|
| 422 | ACEITE_ATPVE_OBRIGATORIO | Faltou aceite_atpve, ou aceito não é true. Nada é cobrado. |
| 409 | AVISO_ATPVE_DESATUALIZADO | A versao enviada não é a vigente. Busque o texto novo, mostre ao usuário e reenvie. Nada é cobrado. |
Não fixe a versão no código
versao muda junto e pedidos com a versão antiga passam a responder 409. A declaração fica registrada com o texto aceito, a versão, o IP e o user-agent da chamada. A chave zc_test_ faz a mesma validação.Resposta
O POST devolve 201 com o id e status: "processando". O resultado sai em GET /v1/consultas/{id}, que passa por um destes estados:
| status | O que vem |
|---|---|
| processando | Só o envelope. Consulte de novo em 3 a 5 s. |
| concluido | Sem dados: o resultado é o documento em pdf_url. |
| erro | Valor estornado. erro_codigo diz o motivo e retryable se vale criar uma consulta nova. |
{
"id": "6f1c2e2a-1b3d-4a9e-8f7c-2a1b3c4d5e6f",
"servico": "atpve",
"placa": "ABC1D23",
"status": "concluido",
"schema_version": "1.0",
"valor_cobrado": 39.99,
"criado_em": "2026-10-18T09:14:02-03:00",
"pdf_url": "/v1/consultas/6f1c2e2a-1b3d-4a9e-8f7c-2a1b3c4d5e6f/pdf"
}Particularidades
- Exige a declaração do usuário final em aceite_atpve: aceito precisa ser o booleano true e versao, a vigente em GET /public/avisos/atpve. Sem a declaração, 422 ACEITE_ATPVE_OBRIGATORIO; versão antiga, 409 AVISO_ATPVE_DESATUALIZADO. Nada é cobrado nos dois casos.
- Cobertura nacional e preço único: não há preco_por_uf. Enviar uf é aceito, mas não decide preço nem disponibilidade.
- É emissão: leva cerca de 1 minuto em processando.
No sandbox
Faz a mesma validação de aceite_atpve da produção (dá para testar o fluxo do aviso sem custo), mas não gera documento: GET /pdf responde 422 SANDBOX_SEM_DOCUMENTO.
Cobrança
Debitado no POST, antes do processamento, e estornado automaticamente se a consulta terminar em erro. Pedido recusado na validação (400, 402, 409, 422) não cobra. Ler o resultado e baixar o documento são gratuitos. Ver Cobrança e estorno.
Testar no sandbox: abrir no API Explorer. Base da API: https://api.zapcarconsulta.com.br.