← InicioFleetPay / API

Declarar un CIOT sin CT-e

Parámetros, estructura de datos y respuestas del contrato versionado.

POST/fiscal/ciot
declararCiotBase de Pruebas: https://api.fleetpay.site/v1

Las descripciones técnicas se traducen del contrato versionado. Se conservan los identificadores y el JSON originales; se omiten los ejemplos de datos.

Registra una Operación de Transporte ante ANTT a partir del viaje, sin depender de un CT-e emitido por FleetPay.

Es la ruta complementaria de POST /fiscal/cte/{cte_uuid}/ciot/emissao: quien contrata el flete y debe declarar el CIOT no siempre es quien emite su documento fiscal. En esta ruta, todo el viaje se envía en el cuerpo — contratado, ruta, carga, vehículo, conductor, documentos e importes — y el CIOT es el único resultado que se produce.

Ambas rutas coexisten. Si emite el CT-e mediante FleetPay y quiere vincularle el CIOT, siga utilizando la ruta asociada al documento: allí no ha cambiado nada.

El código de respuesta indica el resultado

CódigoSignificado¿Puede continuar el viaje?
201ANTT devolvió el CIOT: la respuesta contiene el número y el código verificador.Sí
202Se entregó la declaración; el resultado llegará después.No: consulte primero
422La declaración no se transmitió o fue rechazada.No

Interpretar un 202 como éxito pone un camión en carretera con un CIOT que quizá no exista. Ante un 202, consulte la operación por id hasta que su estado deje de ser sent.

La operación existe aunque falle la declaración

El registro se crea antes de contactar al proveedor. Un 422 devuelve el id de la operación en error.details.ciot.id; sigue disponible mediante GET /fiscal/ciot/{id}, con el motivo registrado. Guarde ese ID: permite investigar un rechazo.

Idempotencia

referencia_externa es opcional y única por empresa. Con ella, un reintento de red recibe 400 validacao en lugar de generar otro CIOT para el mismo flete, lo que sería un problema regulatorio, no solo una molestia. Sin ella, usted asume ese riesgo.

Alcance de esta versión

Carga completa o fraccionada, declarada en nombre propio (contratado.documento debe ser el CNPJ de la empresa autenticada), con uno a diez vehículos y uno a cien documentos fiscales que incluyan remitente y destinatario.

Para carga fraccionada, indique carga.contratantes. rota.trechos puede detallar hasta cien pares de recogida y entrega; rota.origem y rota.destino siguen representando los extremos del viaje. Esta ruta todavía no acepta TAC agregado, cuotas del flete ni vales de peaje con plazas.

Modo simulado en homologación

Esta operación no tiene un proveedor de CIOT contratado: en homologación, FleetPay genera una respuesta determinista sin efecto regulatorio. No se registra nada ante ANTT y ningún CIOT gestionado aquí tiene validez legal.

Valores de prueba

En modo simulado, estos valores de referencia_externa fuerzan un resultado; úselos para probar las rutas distintas de la exitosa:

referencia_externaRespuesta
CIOT-PENDENTE202: declaración entregada, sin resultado definitivo
CIOT-RECUSAR422 declaracao_recusada: el proveedor la rechazó
cualquier otro valor201: CIOT registrado

La referencia externa sirve como valor de prueba porque es el único campo del cuerpo que le pertenece a usted, es opcional y no se envía a ANTT. Solicitar un resultado a través de ella no contamina ningún dato de la operación.

Autenticación

[
  {
    "oauth2": []
  },
  {
    "chaveApi": []
  }
]
La disponibilidad depende del entorno, los permisos habilitados y el proveedor. Esta referencia no ejecuta solicitudes ni recibe credenciales.

Parámetros

No hay parámetros declarados para esta operación.

Cuerpo de la Solicitud

Obligatorio

application/json

referencia_externastring | nullOpcional

Identificador de su sistema para este viaje. Es opcional y único por empresa: es la clave de idempotencia que impide que un reintento de red genere un segundo CIOT para el mismo flete.

No se envía a ANTT.

maxLength64
tipo_operacaostringObligatorio

lotacao para una carga que ocupa toda la operación; fracionado para cargas de varios contratantes en el mismo viaje. TAC agregado sigue fuera del alcance de esta versión.

"lotacao" · "fracionado"
contratadoobjectObligatorio

Quién transporta. Debe ser la empresa autenticada: esta ruta declara operaciones en nombre propio. Un contratado diferente devuelve 422 declaracao_bloqueada.

viagemobjectObligatorio
rotaobjectObligatorio
cargaobjectObligatorio
veiculosarrayObligatorio

De uno a diez vehículos por operación.

minItems1
maxItems10
motoristaobjectObligatorio
valoresobjectObligatorio

Respuestas

201 Respuesta HTTP

CIOT registrado en ANTT.

application/json

202 Respuesta HTTP

Declaración enviada, todavía sin resultado definitivo. No inicies el viaje: consulta la operación por id hasta que el estado deje de ser sent.

application/json

400 Respuesta HTTP

validacao — falta un campo obligatorio del viaje, o referencia_externa ya fue utilizada por otra operación de esta empresa.

application/json

errorobjectOpcional
401 Respuesta HTTP

Sin autenticación (autenticacao): credencial ausente, inválida o vencida, incluida una clave API utilizada en el entorno incorrecto. La clave de homologación no es válida en producción, ni la de producción en homologación; el mensaje de error indica el entorno esperado.

application/json

errorobjectOpcional
403 Respuesta HTTP

Ámbito no habilitado para esta credencial

application/json

errorobjectOpcional
422 Respuesta HTTP

declaracao_bloqueada — la declaración no llegó a transmitirse (el contratado no es la empresa autenticada, su perfil no está cubierto o no hay proveedor). declaracao_recusada — el proveedor rechazó la declaración.

En ambos casos, error.details.ciot.id identifica la operación, que sigue disponible para consulta mediante GET /fiscal/ciot/{id}.

application/json

errorobjectOpcional
Definición Completa de la Operación
{
  "tags": [
    "CIOT"
  ],
  "summary": "Declarar CIOT sem CT-e",
  "operationId": "declararCiot",
  "description": "Registra uma Operação de Transporte na ANTT a partir da **viagem**, sem depender de um\nCT-e emitido pela FleetPay.\n\nÉ o irmão de `POST /fiscal/cte/{cte_uuid}/ciot/emissao`, e existe porque quem contrata\nfrete e precisa declarar o CIOT nem sempre é quem emite o documento fiscal dele. Nesta\nrota a viagem inteira chega no corpo — contratado, rota, carga, veículo, motorista,\ndocumentos e valores — e o CIOT é a única coisa que se produz.\n\n**As duas rotas convivem.** Se você emite o CT-e pela FleetPay e quer o CIOT amarrado a\nele, continue na rota ancorada: nada mudou lá.\n\n## O código de resposta conta o desfecho\n\n| Código | Significa | Pode seguir viagem? |\n|---|---|---|\n| `201` | A ANTT devolveu o CIOT: número e código verificador na resposta. | **Sim** |\n| `202` | A declaração foi entregue e o veredito vem depois. | **Não** — consulte antes |\n| `422` | A declaração não saiu daqui, ou foi recusada. | Não |\n\nTratar um `202` como sucesso põe caminhão na estrada com um CIOT que talvez não exista.\nEm `202`, releia a operação pelo `id` até o status sair de `sent`.\n\n## A operação existe mesmo quando a declaração falha\n\nA linha é criada **antes** da chamada ao provedor. Um `422` devolve o `id` da operação\nem `error.details.ciot.id`, e ela continua legível por `GET /fiscal/ciot/{id}` com o\nmotivo gravado. Guarde esse id: é por ele que se investiga uma recusa.\n\n## Idempotência\n\n`referencia_externa` é opcional e **única por empresa**. Com ela, um retry de rede\nesbarra em `400 validacao` em vez de gerar um segundo CIOT para o mesmo frete — o que\nseria problema regulatório, não inconveniência. Sem ela, o risco é seu.\n\n## Escopo desta versão\n\nCarga **lotação ou fracionada**, declarada **em nome próprio** (o\n`contratado.documento` tem de ser o CNPJ da empresa autenticada), de um a dez veículos\ne de um a cem documentos fiscais com remetente e destinatário.\n\nNo fracionado, informe `carga.contratantes`. `rota.trechos` pode detalhar até cem\npares de coleta e entrega; `rota.origem` e `rota.destino` continuam representando os\nextremos da viagem. TAC agregado, parcelas do frete e Vale-Pedágio com praças ainda\nnão são aceitos por esta rota.\n\n## Modo simulado em homologação\n\nEsta operação **não tem provedor de CIOT contratado** por trás: em homologação a\nresposta é gerada pela FleetPay, é determinística e **não tem efeito regulatório** —\nnada é registrado na ANTT e nenhum CIOT tratado aqui tem valor legal.\n\n### Sentinelas de teste\n\nEm modo simulado, estes valores de `referencia_externa` forçam um desfecho — use-os\npara exercitar os caminhos que não são o feliz:\n\n| `referencia_externa` | Resposta |\n|---|---|\n| `CIOT-PENDENTE` | `202` — declaração entregue, sem veredito |\n| `CIOT-RECUSAR` | `422 declaracao_recusada` — o provedor recusou |\n| qualquer outro valor | `201` — CIOT registrado |\n\nA referência externa serve de sentinela porque é o único campo do corpo que é seu, é\nopcional e **não vai para a ANTT** — pedir um desfecho por ela não contamina nenhum\ndado da operação.\n",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/DeclaracaoCiot"
        }
      }
    }
  },
  "responses": {
    "201": {
      "description": "CIOT registrado na ANTT.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RespostaCiot"
          }
        }
      }
    },
    "202": {
      "description": "Declaração entregue e ainda sem desfecho. **Não siga viagem**: releia a operação\npelo `id` até o status sair de `sent`.\n",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RespostaCiot"
          }
        }
      }
    },
    "400": {
      "description": "`validacao` — falta campo obrigatório da viagem, ou a `referencia_externa` já foi\nusada por outra operação desta empresa.\n",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Erro"
          }
        }
      }
    },
    "401": {
      "$ref": "#/components/responses/Erro401"
    },
    "403": {
      "$ref": "#/components/responses/Erro403"
    },
    "422": {
      "description": "`declaracao_bloqueada` — a declaração não chegou a ser transmitida (o contratado\nnão é a empresa autenticada, o perfil dele não é coberto, ou não há provedor).\n`declaracao_recusada` — o provedor respondeu recusando.\n\nNos dois casos `error.details.ciot.id` traz o endereço da operação, que permanece\nlegível por `GET /fiscal/ciot/{id}`.\n",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Erro"
          }
        }
      }
    }
  },
  "method": "POST",
  "path": "/fiscal/ciot",
  "parameters": []
}