Pular para o conteúdo principal
Módulos v2

Módulo Indicação de Condutores — API v2

12 min de leituraVale para v2

Quando um veículo da empresa leva uma multa, a empresa tem um prazo para informar ao órgão de trânsito quem estava dirigindo. Isso é a indicação de condutor. Sem ela, os pontos vão para o proprietário do veículo.

Este módulo faz a indicação pela API: você informa a multa, o condutor e os documentos, e o resultado do órgão chega para o seu sistema por webhook.

A rota POST /v2/driver-indications será desligada em 24/11/2026

Depois dessa data, ela deixa de responder. No lugar dela entra o fluxo por etapas, que mostra em que ponto está cada indicação e devolve os erros na hora. Se você já usa a rota antiga, veja por que mudou e como migrar.

Como funciona​

A indicação é feita em quatro etapas, nesta ordem:

  1. Criar a indicação. Você informa qual multa quer indicar. A API responde com a lista de documentos que o órgão exige.
  2. Escolher o condutor. Você informa quem estava dirigindo.
  3. Enviar os documentos. Um documento por vez, até não faltar nenhum.
  4. Confirmar. A indicação é enviada ao órgão de trânsito.

Se algo estiver errado em qualquer etapa, a API avisa na hora, e você corrige antes de seguir. Depois da confirmação, o órgão analisa a indicação, o que pode levar alguns dias, e o resultado chega por webhook.

Para quem é cada parte desta página

Visão geral: até a seção Status da indicação está tudo o que você precisa para entender o processo.

Implementação: a partir de Referência técnica das rotas estão endpoints, payloads, erros e um exemplo completo em Python, PHP, Node.js e cURL.

Rotas disponíveis​

AçãoEndpointDescrição
Criar rascunhoPOST /v2/driver-indications/draftCria a indicação e retorna os arquivos pendentes
Vincular condutorPATCH /v2/driver-indications/{id}/driverAssocia ou substitui o condutor do rascunho
Enviar arquivoPOST /v2/driver-indications/{id}/filesEnvia um arquivo por chamada
Confirmar indicaçãoPOST /v2/driver-indications/{id}/confirmEnvia ao órgão e avança para sent_to_organ
Consultar por IDGET /v2/driver-indications/{id}Verifica o estado atual da indicação
Enviar indicação (antiga)POST /v2/driver-indications⛔ Será desligada — não utilizar
Autenticação

Este módulo usa a mesma autenticação HMAC-SHA256 da API v1. Veja o Guia de Autenticação HMAC.

Pré-requisitos

Antes de usar este módulo, certifique-se de ter:

  • clientId — ID da sua empresa. Obtenha via módulo de Empresas.
  • driverId — Condutor cadastrado via API de Condutores.
  • Documentos — Arquivos disponíveis via URL HTTPS.
  • Credenciais HMAC — Access Token e Secret Key fornecidos no onboarding.

Sequência de chamadas​

Cada etapa é uma chamada separada. Se houver erro de validação ou de regra de negócio, ele volta na resposta da própria chamada, sem esperar webhook.

1. POST  /v2/driver-indications/draft        →  201 { id, status: "draft", requiredFiles: [...] }
2. PATCH /v2/driver-indications/{id}/driver → 200 { id, status: "draft", driverId, requiredFiles: [...] }
3. POST /v2/driver-indications/{id}/files → 200 { fileId, fileType, missing: [...] } (repetir por arquivo)
4. POST /v2/driver-indications/{id}/confirm → 200 { id, status: "sent_to_organ" }
5. GET /v2/driver-indications/{id} → 200 { ... } (consulta opcional)

Resposta do órgão → Webhook driver_indication (accepted | rejected | wrong_documents | cancelled | failed)

Quer testar sem dados reais? Veja o Ambiente de testes (sandbox).

Ainda usa a rota antiga POST /v2/driver-indications? Veja Como migrar da rota antiga.


Status da indicação​

Ao longo do processo, a indicação passa por status diferentes. Quando chega a um status final, não muda mais.

draft ──confirm──▶ sent_to_organ ──▶ confirmed ──▶ accepted
│ │
└────────┬───────┘
├──▶ rejected
├──▶ wrong_documents ↺ corrigir e reenviar
├──▶ cancelled
└──▶ failed
StatusO que significaÉ o status final?O que fazer
draftRascunho criado — condutor e/ou arquivos pendentesNãoCompletar as etapas e confirmar
sent_to_organRecebida pelo órgão, em análiseNãoAguardar webhook
confirmedPré-confirmada pelo órgão, aguardando decisão finalNãoAguardar webhook
acceptedIndicação aceita pelo órgão ✅Sim—
rejectedIndicação recusada — inclusive quando o próprio condutor recusa a indicação ❌Sim—
wrong_documentsProblema na documentação do condutor ou no formulárioNãoCorrigir e reenviar dentro do prazo
cancelledIndicação cancelada ou prazo da multa expirado — não será mais avaliadaSim—
failedNão foi possível concluir a indicaçãoSimFalar com o suporte
Status da rota antiga

received, processing e error só aparecem em indicações criadas pela rota antiga POST /v2/driver-indications.


Referência técnica das rotas​

1. Criar rascunho​

POST/v2/driver-indications/draft

Cria a indicação e retorna quais tipos de arquivo ainda precisam ser enviados antes da confirmação.

Body​

CampoTipoObrigatórioDescrição
clientIdnumberSimID da empresa
notificationIdstringSimID da notificação do AIT no órgão
vehicleTypeVEHICLE_OWNED | VEHICLE_RENTEDSimVeículo próprio ou locado
signerTypeOWNER_SIGNATURE | PROXY_SIGNATURESimAssinante: proprietário ou procurador

Exemplo de requisição​

curl -X POST \
https://api.sandbox.v2.frota162.com.br/v2/driver-indications/draft \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}' \
-H 'Content-Type: application/json' \
-d '{
"clientId": 789,
"notificationId": "1591837",
"vehicleType": "VEHICLE_OWNED",
"signerType": "OWNER_SIGNATURE"
}'

Resposta 201 Created​

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "draft",
"requiredFiles": [
"NOMINATE_FORM_FILE",
"COMPANY_REGISTRATION_FILE",
"LICENSE_FILE",
"CARD_ID_FILE"
]
}

Resposta 200 OK — indicação já existe (idempotência)​

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "draft",
"driverId": "987654321",
"requiredFiles": ["NOMINATE_FORM_FILE"],
"alreadyExists": true
}

Erros​

StatusNomeCausa
404NotificationNotFoundNotificação inexistente
409—Indicação criada pela rota antiga, ainda em processamento
422DriverIndicationExpiredPrazo da multa vencido
500—Erro inesperado do serviço de trânsito

2. Vincular condutor​

PATCH/v2/driver-indications/{id}/driver

Associa ou substitui o condutor de um rascunho. Pode ser chamado mais de uma vez — em caso de erro, a indicação permanece no estado anterior (sem estado parcial).

Path param​

ParâmetroTipoDescrição
idstring (UUID)ID retornado pelo POST /draft

Body​

CampoTipoObrigatórioDescrição
driverIdstringSimID do condutor a ser vinculado

Exemplo de requisição​

curl -X PATCH \
https://api.sandbox.v2.frota162.com.br/v2/driver-indications/a1b2c3d4-e5f6-7890-abcd-ef1234567890/driver \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}' \
-H 'Content-Type: application/json' \
-d '{ "driverId": "987654321" }'

Resposta 200 OK​

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "draft",
"driverId": "987654321",
"requiredFiles": ["NOMINATE_FORM_FILE", "COMPANY_REGISTRATION_FILE"]
}

Erros​

StatusNomeCausa
400—Payload inválido ou id não é UUID
404DriverIndicationNotFoundIndicação não encontrada para esta organização
409DriverIndicationNotEditableIndicação fora do status draft
422DriverNotFoundCondutor não encontrado
422DriverInvalidForIndicationCondutor inválido; o detail lista os campos faltantes
422DriverLicenseFileNão foi possível processar o arquivo da CNH do condutor
500—Erro inesperado do serviço de trânsito

3. Enviar arquivo​

POST/v2/driver-indications/{id}/files

Envia um arquivo por chamada via URL HTTPS. Repita para cada arquivo listado em requiredFiles. O campo missing na resposta indica os tipos que ainda faltam.

Path param​

ParâmetroTipoDescrição
idstring (UUID)ID da indicação

Body (Content-Type: application/json)​

CampoTipoObrigatórioDescrição
fileTypestringSimTipo do arquivo (valores em requiredFiles): ex. LICENSE_FILE, NOMINATE_FORM_FILE
urlstringSimURL HTTPS pública do arquivo

Exemplo de requisição​

curl -X POST \
https://api.sandbox.v2.frota162.com.br/v2/driver-indications/a1b2c3d4-e5f6-7890-abcd-ef1234567890/files \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}' \
-H 'Content-Type: application/json' \
-d '{
"fileType": "LICENSE_FILE",
"url": "https://storage.example.com/cnh.pdf"
}'

Resposta 200 OK​

{
"fileId": "legacy-file-12345",
"fileType": "LICENSE_FILE",
"missing": ["NOMINATE_FORM_FILE", "COMPANY_REGISTRATION_FILE"]
}

Quando missing retornar [], todos os arquivos foram enviados e a indicação está pronta para o confirm.

Erros​

StatusNomeCausa
400—Payload inválido, fileType desconhecido ou URL não-HTTPS
400FileTypeNotFoundTipo de arquivo não existe no órgão
400AdditionalFilesLimitExceededLimite de arquivos desse tipo atingido
404DriverIndicationNotFoundIndicação não encontrada para esta organização
409DriverIndicationNotEditableIndicação fora do status draft
409FileAlreadyUploadedArquivo deste tipo já foi enviado — pule para o próximo
415—Content-Type diferente de application/json
422FileDownloadFailedNão foi possível baixar o arquivo da URL informada
500—Erro inesperado do serviço de trânsito
Arquivo já enviado (409)

Se receber 409 FileAlreadyUploaded, o arquivo já está registrado. Simplesmente pule para o próximo tipo em requiredFiles.


4. Confirmar indicação​

POST/v2/driver-indications/{id}/confirm

Confirma a indicação e a envia ao órgão. Sem body. Após o confirm, o status avança para sent_to_organ e a resposta do órgão chegará via webhook.

Path param​

ParâmetroTipoDescrição
idstring (UUID)ID da indicação

Exemplo de requisição​

curl -X POST \
https://api.sandbox.v2.frota162.com.br/v2/driver-indications/a1b2c3d4-e5f6-7890-abcd-ef1234567890/confirm \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}'

Resposta 200 OK​

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "sent_to_organ"
}

Erros​

StatusNomeCausa
400AttachmentNotFoundFalta arquivo obrigatório
400DriverIndicationNotEnabledÓrgão não habilitado para esta indicação
400DriverIndicationNoFileChangedNenhum arquivo alterado desde o último envio
404DriverIndicationNotFoundIndicação não encontrada para esta organização
409DriverIndicationNotEditableIndicação já confirmada ou em outro estado
422DriverIndicationExpiredPrazo da multa venceu após a criação do draft
422DriverNotFoundCondutor não encontrado no órgão
500—Erro inesperado do serviço de trânsito

5. Consultar indicação por ID​

GET/v2/driver-indications/{id}

Consulta o estado atual de uma indicação. Use para reconciliação ou para verificar o status sem depender de webhook. O {id} é o UUID devolvido pelo POST /draft — o mesmo usado nas demais rotas e nos webhooks. Indicações de outra organização retornam o mesmo 404 de uma inexistente, sem revelar que existem.

Path param​

ParâmetroTipoDescrição
idstring (UUID)ID da indicação

Exemplo de requisição​

curl -X GET \
https://api.sandbox.v2.frota162.com.br/v2/driver-indications/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}'

Resposta 200 OK​

{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"mongoId": "507f1f77bcf86cd799439011",
"notificationId": "1591837",
"carPlate": "ABC1234",
"orgCode": "ORG001",
"clientId": "789",
"status": "sent_to_organ",
"indicationLimitDate": "2026-06-14T00:00:00.000Z",
"indicationStartedAt": "2026-05-14T10:05:00.000Z",
"communicationsSent": 1,
"fileOptions": null,
"driverId": "987654321",
"responses": [
{
"id": "resp001",
"status": "draft",
"createdAt": "2026-05-14T10:00:00.000Z",
"updatedAt": "2026-05-14T10:00:00.000Z"
},
{
"id": "resp002",
"status": "sent_to_organ",
"createdAt": "2026-05-14T10:05:00.000Z",
"updatedAt": "2026-05-14T10:05:00.000Z"
}
],
"createdAt": "2026-05-14T10:00:00.000Z",
"updatedAt": "2026-05-14T10:05:00.000Z"
}

indicationLimitDate — prazo final para realizar a indicação junto ao órgão. Após essa data, o confirm retorna 422 DriverIndicationExpired.

Erros​

StatusNomeCausa
400—id não é UUID válido
404DriverIndicationNotFoundIndicação não encontrada
502—Erro inesperado do serviço de trânsito

Exemplo completo​

As quatro etapas de ponta a ponta, prontas para rodar no sandbox. O notificationId 99900010001 usa o cenário de sucesso: a indicação é aceita e o webhook chega com status: "accepted".

Assinatura HMAC

O header Key é a assinatura HMAC-SHA256 de cada requisição. Os exemplos deixam a função assinar para você implementar conforme o Guia de Autenticação HMAC. Assine exatamente o mesmo body que será enviado.

Código demonstrativo, não use em produção

Os exemplos abaixo existem só para mostrar a sequência das chamadas. Eles foram simplificados de propósito e não seguem boas práticas de produção. Antes de levar para a sua integração, trate pelo menos:

  • Credenciais: não deixe o token no código. Use variáveis de ambiente ou um cofre de segredos.
  • Retentativas: respostas 429 e 5xx devem ser retentadas com backoff. Os exemplos desistem no primeiro erro.
  • Retomada: guarde o id da indicação assim que o rascunho for criado, para continuar de onde parou se o processo cair no meio.
  • Logs e rastreio: registre o traceId das respostas de erro. É ele que o suporte vai pedir.
  • Webhook: o resultado final do órgão chega por webhook, que os exemplos não cobrem. Veja Receber atualizações via webhook.
import json
import requests

BASE_URL = "https://api.sandbox.v2.frota162.com.br"
ACCESS_TOKEN = "SEU_ACCESS_TOKEN"


class ApiError(Exception):
def __init__(self, problem):
self.status = problem.get("status")
self.error_name = problem.get("errorName")
super().__init__(f"{self.status} {self.error_name}: {problem.get('detail')}")


def assinar(metodo, caminho, body):
"""Gera a assinatura do header `Key`. Implemente conforme o Guia de Autenticação HMAC."""
raise NotImplementedError


def chamar(metodo, caminho, payload=None):
body = json.dumps(payload) if payload is not None else ""
headers = {
"Authorization": f"Basic {ACCESS_TOKEN}",
"Key": assinar(metodo, caminho, body),
"Content-Type": "application/json",
}
resp = requests.request(metodo, BASE_URL + caminho, data=body or None, headers=headers, timeout=30)
if resp.status_code >= 400:
raise ApiError(resp.json())
return resp.json()


# URL HTTPS de cada documento que você pode enviar
DOCUMENTOS = {
"NOMINATE_FORM_FILE": "https://seu-storage.com/formulario.pdf",
"COMPANY_REGISTRATION_FILE": "https://seu-storage.com/contrato-social.pdf",
"LICENSE_FILE": "https://seu-storage.com/cnh.pdf",
"CARD_ID_FILE": "https://seu-storage.com/documento.pdf",
}

# 1. Criar a indicação
draft = chamar("POST", "/v2/driver-indications/draft", {
"clientId": 789,
"notificationId": "99900010001",
"vehicleType": "VEHICLE_OWNED",
"signerType": "OWNER_SIGNATURE",
})
indicacao_id = draft["id"]

# 2. Vincular o condutor (a resposta traz a lista atualizada de documentos)
driver = chamar("PATCH", f"/v2/driver-indications/{indicacao_id}/driver", {"driverId": "987654321"})

# 3. Enviar os documentos, um por chamada
for tipo in driver["requiredFiles"]:
try:
chamar("POST", f"/v2/driver-indications/{indicacao_id}/files", {
"fileType": tipo,
"url": DOCUMENTOS[tipo],
})
except ApiError as erro:
if erro.error_name != "FileAlreadyUploaded": # já enviado: segue para o próximo
raise

# 4. Confirmar e enviar ao órgão
confirmacao = chamar("POST", f"/v2/driver-indications/{indicacao_id}/confirm")
print(confirmacao["status"]) # sent_to_organ

Como migrar da rota antiga​

Por que a rota mudou​

Na rota antiga, a indicação inteira era enviada numa única chamada e processada em segundo plano. Se algo desse errado, você só ficava sabendo depois, por webhook, e nem sempre era possível saber em que ponto a indicação tinha parado: se o problema estava na multa, no condutor ou em algum documento.

No fluxo por etapas, você acompanha a indicação passo a passo:

  • Cada etapa responde na hora. Você sabe exatamente qual etapa falhou e por quê.
  • Você corrige só o que deu errado. Se o envio de um documento falhar, basta reenviar aquele documento, sem refazer a indicação inteira.
  • O status é sempre claro. Antes da confirmação, a indicação fica em draft, e o campo missing mostra o que ainda falta.

O que muda na integração​

A rota antiga fazia tudo em uma única chamada e só avisava erros por webhook. No fluxo por etapas, cada etapa é uma chamada separada e os erros voltam na hora.

Rota antiga (POST /v2/driver-indications)Fluxo por etapas
clientId, notificationId, vehicleType, signerTypePOST /v2/driver-indications/draft (mesmos campos)
driverIdPATCH /v2/driver-indications/{id}/driver
Objeto files (todos os arquivos juntos)POST /v2/driver-indications/{id}/files — um arquivo por chamada, usando os tipos em requiredFiles
Processamento e envio ao órgão em segundo planoPOST /v2/driver-indications/{id}/confirm
Erros só via webhookErros na resposta de cada chamada (RFC 7807)
Resultado do órgão via webhookResultado do órgão via webhook (sem mudança)
Não dependa da lista fixa de arquivos

No fluxo por etapas, os arquivos obrigatórios (inclusive os condicionais por vehicleType e signerType) vêm em requiredFiles na resposta do draft. Envie o que estiver lá e confira o campo missing até retornar [].


Rota antiga — referência (será desligada em 24/11/2026)​

POST/v2/driver-indications
Será desligada em 24/11/2026 — não utilize

Esta rota será desligada e não deve ser usada em novas integrações. Quem ainda a utiliza deve migrar para o fluxo por etapas — veja Como migrar da rota antiga. A documentação abaixo existe apenas para apoiar a migração.

Ver referência da rota antiga

Fluxo​

1. POST /v2/driver-indications  →  201 { id, status: "received", createdAt }
↓ [processamento assíncrono em background]
2. Validar documentos → status: processing
3. Confirmar indicação → status: confirmed
4. Enviar ao órgão → status: sent_to_organ
5. Resposta do órgão → Webhook (accepted | rejected | wrong_documents)

Enfileira a indicação. Retorna 201 imediatamente com status: received. Todas as demais etapas ocorrem de forma assíncrona; o resultado chega exclusivamente via webhook.

Body​

CampoTipoObrigatórioDescrição
clientIdnumberSimID da empresa
notificationIdstringSimID da notificação do AIT
driverIdstringSimID do condutor
vehicleTypeVEHICLE_OWNED | VEHICLE_RENTEDSimTipo do veículo
signerTypeOWNER_SIGNATURE | PROXY_SIGNATURESimAssinante
filesobjectSimArquivos da indicação (ver abaixo)
saveDefaultFileTypesstring[]NãoSalvar arquivos como padrão da empresa

Arquivos (files):

CampoObrigatórioCondição
nominateFormFileSimSempre
companyRegistrationFileSimSempre
licenseFileSimSempre
cardIdFileSimSempre
leaseContractFileCondicionalvehicleType=VEHICLE_RENTED
legalRepresentationFileCondicionalsignerType=PROXY_SIGNATURE
additionalDriverFineIndicationFileOpcional—

Resposta 201 Created​

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "received",
"createdAt": "2026-05-14T10:00:00.000Z"
}

Receber atualizações via webhook​

Configure uma URL global de webhook via Guia de Webhooks. Sua URL receberá notificações a cada mudança de status relevante — incluindo as respostas do órgão.

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ait": "SP-2024-000001",
"driver_id": "987654321",
"company_id": 789,
"event_type": "DRIVER_INDICATION",
"status": "accepted",
"vehicle_type": "VEHICLE_OWNED",
"signer_type": "OWNER_SIGNATURE",
"notification_id": "1591837",
"created_at": "2026-05-14T10:00:00.000Z",
"updated_at": "2026-05-14T10:30:00.000Z"
}
Status wrong_documents

Quando status for wrong_documents, o payload inclui o campo can_reindicate, que indica se a indicação ainda pode ser corrigida e reenviada dentro do prazo.


Ambiente de testes (sandbox)​

No ambiente sandbox, a indicação de condutor não aciona órgãos de trânsito nem consome dados reais: um catálogo determinístico de prefixos no notificationId devolve desfechos previsíveis para você testar todas as etapas e os webhooks da sua integração. Mesmo prefixo → mesmo resultado, sempre.

Como o catálogo funciona​

  • Resolução por prefixo: o sandbox identifica o cenário desejado pelos primeiros 7 dígitos do notificationId (faixa 99900xx).
  • Sufixo livre: você pode adicionar qualquer sequência numérica ao final do prefixo (por exemplo, 99900010001 ou 99900019999 ambos acionam o cenário OKAC).
  • Identificador de AIT determinístico: o AIT gerado é T999 seguido dos 6 últimos dígitos do notificationId (ex.: 99900010042 → T999010042).
  • Isolamento completo: o sandbox reproduz as validações de negócio e o envio de webhooks, sem acionar órgãos externos.
  1. Passo 1 — Criar rascunho (POST /draft): envie o notificationId iniciado pelo prefixo escolhido. Se o cenário for uma falha de criação (CRNF, CREX ou prefixo desconhecido), o erro HTTP é retornado imediatamente na resposta e o rascunho não permanece ativo.
  2. Passo 2 — Vincular condutor (PATCH /{id}/driver): envie os dados do condutor. No cenário CRDR, a API retorna 422 DriverInvalidForIndication, mantendo o rascunho aberto para correção.
  3. Passo 3 — Enviar arquivos (POST /{id}/files): envie os arquivos solicitados em requiredFiles. Cenários como FLTP (tipo inválido), FLDL (falha no download da URL) e FLDU (arquivo duplicado) retornam o erro correspondente.
  4. Passo 4 — Confirmar indicação (POST /{id}/confirm): valida se todos os anexos foram enviados. Cenários como CFAT (anexo ausente) ou CFEX (prazo expirado no confirm) barram a confirmação. Em cenários de sucesso, a rota retorna 200 com status sent_to_organ.
  5. Passo 5 — Webhook de desfecho: para indicações confirmadas, o webhook com o resultado final do órgão (accepted ou wrong_documents) é enviado ao seu endpoint configurado poucos segundos após a confirmação. Em produção, esse retorno do órgão pode levar dias.

Tabela de prefixos e cenários​

Envie um notificationId com um destes prefixos:

PrefixoCenárioO que aconteceExecute atéHTTPerrorNameWebhook final
9990001OKACIndicação aceita pelo órgão de trânsitodraft → driver → files → confirm200—accepted
9990002OKWDDocumentos recusados pelo órgão de trânsito (permite reindicação)draft → driver → files → confirm200—wrong_documents
9990004CRNFNotificação não encontrada no órgão de trânsitodraft404NotificationNotFound—
9990005CREXPrazo da indicação expirado no momento da criaçãodraft422DriverIndicationExpired—
9990006CRDURepetir o POST /draft com o mesmo notificationId devolve o mesmo rascunhodraft ×2200—accepted
9990007CRDRCondutor inválido para indicação ao vincular o condutordraft → driver422DriverInvalidForIndication—
9990008FLTPTipo de arquivo não existe no órgão de trânsitodraft → driver → files400FileTypeNotFound—
9990009FLDLFalha no download do arquivo a partir da URL fornecidadraft → driver → files422FileDownloadFailed—
9990010FLDUArquivo já enviado previamente (COMPANY_REGISTRATION_FILE)draft → driver → files409FileAlreadyUploaded—
9990011CFATAnexo obrigatório ausente no momento da confirmaçãodraft → driver → files → confirm400AttachmentNotFound—
9990012CFEXPrazo da indicação expirado no momento da confirmaçãodraft → driver → files → confirm422DriverIndicationExpired—
qualquer outro—Prefixo não catalogado no sandboxdraft422SandboxUnknownScenario—

Regras do catálogo:

  • O erro é forçado pelo prefixo: a coluna Execute até mostra quais chamadas fazer, em ordem. A última delas retorna o erro do cenário independentemente do payload. Por exemplo, em FLTP qualquer fileType válido retorna FileTypeNotFound, e em CFAT o confirm falha mesmo com todos os arquivos enviados.
  • Prefixo não catalogado: qualquer notificationId que não comece com um dos prefixos acima retorna erro 422 Unprocessable Entity com errorName: SandboxUnknownScenario e lista os prefixos válidos no detail.
  • Apenas fluxo por etapas: o sandbox suporta exclusivamente o fluxo por etapas (/draft, /{id}/driver, /{id}/files, /{id}/confirm e consulta /{id}). A rota antiga POST /v2/driver-indications não tem suporte a sandbox.
  • Somente sandbox: prefixos e AITs gerados são fictícios. Em produção, use identificadores reais de notificações.

Observações por cenário​

  • CRDU: chame POST /draft duas vezes com os mesmos dados. A segunda chamada responde 200 OK (em vez de 201) com alreadyExists: true e o mesmo id do rascunho original.
  • OKWD: o webhook chega com can_reindicate: true, permitindo testar o fluxo de reindicação com documentos corrigidos.
  • CRDR: simula condutor inválido para indicação; o detail lista os campos faltantes (ex.: Missing fields: cnh, cpf). O rascunho continua aberto para vincular outro condutor.
  • FLDL: simula URL de arquivo inacessível ou expirada.
Horário do ambiente

O ambiente de sandbox opera de segunda a sexta-feira, das 07h às 19h (horário de Brasília, UTC−3). Fora deste horário, os serviços ficam suspensos e a primeira requisição pode sofrer um atraso temporário (cold start) enquanto a infraestrutura é inicializada.

Exemplos práticos​

1. Criação com sucesso (draft)​

curl -X POST https://api.sandbox.v2.frota162.com.br/v2/driver-indications/draft \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}' \
-H 'Content-Type: application/json' \
-d '{
"clientId": 789,
"notificationId": "99900010042",
"vehicleType": "VEHICLE_OWNED",
"signerType": "OWNER_SIGNATURE"
}'

Resposta 201 Created:

{
"id": "b7e6a2c4-1f3d-4e5a-9c8b-2d1e0f9a8b7c",
"status": "draft",
"requiredFiles": [
"NOMINATE_FORM_FILE",
"COMPANY_REGISTRATION_FILE",
"LICENSE_FILE",
"CARD_ID_FILE"
]
}

2. Webhook de indicação aceita (OKAC)​

Após completar os arquivos e chamar POST /v2/driver-indications/{id}/confirm, o webhook chega em poucos segundos:

{
"id": "b7e6a2c4-1f3d-4e5a-9c8b-2d1e0f9a8b7c",
"ait": "T999010042",
"driver_id": "987654321",
"company_id": 789,
"event_type": "DRIVER_INDICATION",
"status": "accepted",
"vehicle_type": "VEHICLE_OWNED",
"signer_type": "OWNER_SIGNATURE",
"notification_id": "99900010042",
"created_at": "2026-09-25T10:00:00.000Z",
"updated_at": "2026-09-25T10:00:15.000Z"
}

3. Webhook de documentos recusados (OKWD)​

{
"id": "c8f7b3d5-2e4a-5f6b-0d9c-3e2f1a0b9c8d",
"ait": "T999020042",
"driver_id": "987654321",
"company_id": 789,
"event_type": "DRIVER_INDICATION",
"status": "wrong_documents",
"can_reindicate": true,
"vehicle_type": "VEHICLE_OWNED",
"signer_type": "OWNER_SIGNATURE",
"notification_id": "99900020042",
"created_at": "2026-09-25T10:00:00.000Z",
"updated_at": "2026-09-25T10:00:15.000Z"
}

4. Erro de validação imediato (ex.: arquivo duplicado FLDU — 409 Conflict)​

{
"type": "urn:frota162-api-v2:error:conflict",
"title": "Conflict",
"status": 409,
"errorName": "FileAlreadyUploaded",
"detail": "A file of this type has already been uploaded",
"instance": "/v2/driver-indications/b7e6a2c4-1f3d-4e5a-9c8b-2d1e0f9a8b7c/files",
"traceId": "abc123def456"
}

5. Prefixo desconhecido (422 Unprocessable Entity)​

Quando o notificationId não começa com nenhum prefixo catalogado:

{
"type": "urn:frota162-api-v2:error:unprocessable-entity",
"title": "Unprocessable Entity",
"status": 422,
"errorName": "SandboxUnknownScenario",
"detail": "The notificationId does not match any sandbox scenario. Valid prefixes: 9990001 (OKAC), 9990002 (OKWD), ...",
"instance": "/v2/driver-indications/draft",
"traceId": "abc123def456"
}

Erros — referência geral​

Formato diferente da v1

A API v2 retorna erros no padrão RFC 7807 Problem Details. Veja o Guia de Tratamento de Erros para a referência completa.

{
"type": "urn:frota162-api-v2:error:{tipo}",
"title": "Título do erro",
"status": 400,
"detail": "Descrição específica do problema",
"instance": "/v2/driver-indications/draft",
"traceId": "abc123def456"
}
StatusCausaAção
400Campo obrigatório ausente ou inválidoRevisar payload
401Header Authorization ou Key ausenteAdicionar os headers
401Assinatura HMAC inválidaRecalcular HMAC
404Indicação não encontradaVerificar o id
409Conflito de estado (arquivo já enviado, etc)Ver detalhes no detail
415Content-Type inválidoUsar application/json
422Validação de negócio reprovadaVer detail ou errors
429Limite de requisições atingidoAguardar e retentar
502Erro inesperado do serviço de trânsitoRetentar com backoff

Próximos passos​