← InícioFleetPay / API

Emitir contra-CT-e em lote (1:1 ou em pernas)

Parâmetros, estrutura de dados e respostas do contrato versionado.

POST/fiscal/cte-subcontratacao/lote
createContraCteBatchBase de Homologação: https://api.fleetpay.site/v1

Descrições técnicas preservadas do contrato versionado. Exemplos de dados foram omitidos da cópia pública.

Emite vários contra-CT-e numa chamada e devolve um batch_id; a emissão roda em segundo plano e o resultado por chave sai em GET /fiscal/cte-subcontratacao/lote/{batch_id}. Cada CT-e da contratante precisa ter chegado antes por POST /fiscal/cte-subcontratacao.

Dois desenhos, um endpoint

  • 1:1 — um contra-CT-e integral por CT-e da contratante. ctes[] traz as chaves; o motorista (motorista.cpf) e o veículo (placa) são os mesmos para o lote inteiro.
  • Pernas — um CT-e da contratante subcontratado em trechos: ctes[].pernas[] descreve cada trecho com origem/destino próprios, e cada perna pode ter motorista, veículo e valor próprios (o motorista/placa do lote são o padrão das pernas que não informam os seus). Não misture chaves com e sem pernas no mesmo lote.

Valor: por chave OU rateio — nunca os dois

  • ctes[].valor (ou pernas[].valor) congela o valor de cada contra-CT-e; o fiscal (vTPrest/vRec) e o repasse ao motorista saem desse valor, sem arredondar.
  • valores.frete_bruto no lote rateia total ÷ N em centavos, com o resíduo nas últimas chaves da sequência; a soma fecha exata.

Informar os dois responde 422.

Rota do trecho

Por padrão o contra-CT-e herda origem → destino da contratante. origem/destino no lote (ou por chave/perna) declaram a rota REAL do trecho — e é dela que saem CFOP e ICMS: origem na UF do emitente → 5360 (mesma UF) / 6360 (outra UF); origem fora da UF do emitente → 5932 (início e fim na mesma UF) / 6932. Com regra de tributação do tipo de serviço (tp_serv na regra), o CFOP da regra é mantido quando a prestação começa na UF do emitente; o 5932/6932 continua imposto quando começa em outra UF. Os pares município × UF são validados; precisa existir regra de tributação aplicável à rota e ao tipo (GET /fiscal/regras-tributacao).

Tipo de serviço

tipo_servico é o ide/tpServ de cada contra-CT-e, com precedência perna → chave → lote → 1 (subcontratação). Só 1 subcontratação, 2 redespacho e 3 redespacho intermediário. No redespacho a rota é o trecho que a subcontratada executa, não a viagem da contratante: 2 e 3 exigem origem e destino (na chave, no lote ou na perna — 422 sem eles), e um "trecho" igual à viagem inteira do CT-e da contratante é recusado na linha com redespacho_exige_rota. Um CT-e da contratante vinculado a multimodal (tpServ 4) não admite contra-CT-e (origem_incompativel_com_tipo; na caixa, allows_counter_cte: false). A linha de resultado devolve o tipo_servico com que o documento saiu (na linha duplicated, o tipo pedido — o do contra-CT-e existente está em GET /fiscal/cte/{counter_cte_id}, campo service_type).

Repasse ao motorista (mesma regra do CIOT)

repasse.parcelas é a regra de parcelas do lote (posições 1..3, percentuais somando 100, dias de 0 a 30) e vence a regra cadastrada do motorista. Os contra-CT-e de um mesmo motorista no lote formam um grupo:

  • N ≥ nº de parcelas → cada documento inteiro cai numa parcela (60/20/20 em 15 docs = 9/3/3 documentos, sempre ≥ 1 por parcela) — a parcela 1 libera na bipagem, a 2 na conclusão, a 3 na prestação de contas;
  • N < nº de parcelas → cada documento é fracionado nas parcelas (60/20/20 do valor dele).

O bucket é decidido pela posição no lote, não pelo valor: com valores diferentes, a ordem das chaves define quanto entra em cada parcela. A parcela só existe depois da bipagem do documento — consulte-a em GET /carriers/parcelas-repasse/{documento} (aceita o counter_cte_id).

Um modo por origem, e o que bloqueia

Uma chave com contra-CT-e integral ativo não aceita pernas (origem_ja_subcontratada_1a1) e vice-versa (origem_ja_subcontratada_em_pernas); cancelar o contra-CT-e libera o outro modo. Chave já subcontratada no mesmo modo responde duplicated com o counter_cte_id existente — reenviar o lote é seguro. CT-e emitido pela sua própria empresa responde cte_proprio; rota sem regra, sem_regra_tributacao; redespacho com o trecho igual à viagem inteira, redespacho_exige_rota; origem vinculada a multimodal, origem_incompativel_com_tipo; origem cujo repasse já foi pago não pode virar pernas.

Cancelar um contra-CT-e (POST /fiscal/cte/{cte_uuid}/eventos/cancelamento) cancela as parcelas ainda não pagas e tira o documento do grupo; o CT-e da contratante continua válido.

Autenticação

[
  {
    "oauth2": []
  },
  {
    "chaveApi": []
  }
]
A disponibilidade depende do ambiente, dos escopos habilitados e do provedor. Esta referência não executa chamadas nem recebe credenciais.

Parâmetros

Nenhum parâmetro declarado nesta operação.

Corpo da Requisição

Obrigatório

application/json

ctesarrayObrigatório

Cada item é a chave (string) ou um objeto com chave e os campos opcionais.

minItems1
motoristaobjectObrigatório
placastringObrigatório
pattern"^[A-Za-z]{3}[0-9][A-Za-z0-9][0-9]{2}$"
valoresobjectOpcional
tipo_servicointeger | nullOpcional

ide/tpServ dos contra-CT-e do lote: 1 subcontratação (padrão), 2 redespacho, 3 redespacho intermediário. Sobrescrevível por chave (ctes[].tipo_servico) e por perna (pernas[].tipo_servico). Em 2/3 o trecho (origem e destino) é obrigatório.

1 · 2 · 3 · null
repasseobjectOpcional

Opcional. Sem este bloco o lote é só fiscal: emite os contra-CT-e e não cria grupo de repasse, parcela, ROUTE de perna nem neutraliza o repasse da origem — as linhas emitidas voltam com financeiro: "nenhum". Com o bloco, o CT-e de origem — na conta da contratante — entra num grupo de repasse dela com estas parcelas e o motorista do lote: quem paga o motorista é a contratante, e a subcontratada nunca ganha documento financeiro. O payments manda o dinheiro para a conta de motorista (PF) ou para a Conta Operação da transportadora dele (PJ). Exige o opt-in da contratante; sem ele a linha volta financeiro: "nenhum" com motivo: contratante_sem_opt_in.

referencia_externastring | nullOpcional

Identificador seu, devolvido em external_reference.

maxLength64
subcontratadaobjectOpcional

Em nome da subcontratada. A chamada é da CONTRATANTE (chave de API dela) e o lote nasce na conta da subcontratada deste CNPJ — certificado, numeração, caixa fiscal, motorista e veículo dela. Exige a autorização concedida pela subcontratada em POST /fiscal/cte-subcontratacao/autorizacoes; sem ela, 403 emissao_nao_autorizada; CNPJ que não é cliente, 404 subcontratada_nao_encontrada. O próprio CNPJ é aceito e não muda nada. Com repasse, o opt-in da contratante é implícito: ela mesma pediu a emissão.

Respostas

202 Resposta HTTP

Lote aceito; a emissão roda em segundo plano.

application/json

Headers

X-Request-Id

Identificador de correlação da chamada.

400 Resposta HTTP

Requisição inválida

application/json

errorobjectOpcional
401 Resposta HTTP

Chave de API FleetPay ausente ou inválida.

application/json

Headers

X-Request-Id

Identificador de correlação da chamada.

403 Resposta HTTP

Escopo fiscal desabilitado na chave, ou chave sem transportadora ativa.

application/json

Headers

X-Request-Id

Identificador de correlação da chamada.

422 Resposta HTTP

Validação do payload (error.details.fields) ou regra de negócio antes de criar o lote: motorista_nao_encontrado, veiculo_nao_encontrado — nas pernas, o message aponta a perna (ctes.0.pernas.2).

application/json

429 Resposta HTTP

Limite por transportadora excedido.

application/json

Headers

X-Request-Id

Identificador de correlação da chamada.

Retry-After

Segundos até uma nova tentativa.

500 Resposta HTTP

Falha interna sem detalhes de integrações operacionais.

application/json

Headers

X-Request-Id

Identificador de correlação da chamada.

Definição Completa da Operação
{
  "tags": [
    "CT-e de subcontratação"
  ],
  "summary": "Emitir contra-CT-e em lote (1:1 ou em pernas)",
  "operationId": "createContraCteBatch",
  "description": "Emite **vários contra-CT-e numa chamada** e devolve um `batch_id`; a emissão roda em\nsegundo plano e o resultado por chave sai em `GET /fiscal/cte-subcontratacao/lote/{batch_id}`.\nCada CT-e da contratante precisa ter chegado antes por `POST /fiscal/cte-subcontratacao`.\n\n## Dois desenhos, um endpoint\n\n- **1:1** — um contra-CT-e integral por CT-e da contratante. `ctes[]` traz as chaves; o\n  motorista (`motorista.cpf`) e o veículo (`placa`) são os mesmos para o lote inteiro.\n- **Pernas** — um CT-e da contratante subcontratado em **trechos**: `ctes[].pernas[]`\n  descreve cada trecho com origem/destino próprios, e cada perna pode ter motorista,\n  veículo e valor próprios (o `motorista`/`placa` do lote são o padrão das pernas que não\n  informam os seus). Não misture chaves com e sem `pernas` no mesmo lote.\n\n## Valor: por chave OU rateio — nunca os dois\n\n- `ctes[].valor` (ou `pernas[].valor`) congela o valor de **cada** contra-CT-e; o fiscal\n  (`vTPrest`/`vRec`) e o repasse ao motorista saem desse valor, sem arredondar.\n- `valores.frete_bruto` no lote rateia `total ÷ N` em centavos, com o resíduo nas\n  **últimas** chaves da sequência; a soma fecha exata.\n\nInformar os dois responde `422`.\n\n## Rota do trecho\n\nPor padrão o contra-CT-e herda origem → destino da contratante. `origem`/`destino` no lote\n(ou por chave/perna) declaram a rota REAL do trecho — e é dela que saem CFOP e ICMS:\norigem na UF do emitente → `5360` (mesma UF) / `6360` (outra UF); origem fora da UF do\nemitente → `5932` (início e fim na mesma UF) / `6932`. Com regra de tributação **do tipo\nde serviço** (`tp_serv` na regra), o CFOP da regra é mantido quando a prestação começa na\nUF do emitente; o `5932`/`6932` continua imposto quando começa em outra UF. Os pares\nmunicípio × UF são validados; precisa existir regra de tributação aplicável à rota e ao\ntipo (`GET /fiscal/regras-tributacao`).\n\n## Tipo de serviço\n\n`tipo_servico` é o `ide/tpServ` de cada contra-CT-e, com precedência **perna → chave →\nlote → `1`** (subcontratação). Só `1` subcontratação, `2` redespacho e `3` redespacho\nintermediário. No redespacho a rota é o **trecho** que a subcontratada executa, não a\nviagem da contratante: `2` e `3` exigem `origem` e `destino` (na chave, no lote ou na\nperna — `422` sem eles), e um \"trecho\" igual à viagem inteira do CT-e da contratante é\nrecusado na linha com `redespacho_exige_rota`. Um CT-e da contratante vinculado a\nmultimodal (`tpServ` 4) não admite contra-CT-e (`origem_incompativel_com_tipo`; na caixa,\n`allows_counter_cte: false`). A linha de resultado devolve o `tipo_servico` com que o\ndocumento saiu (na linha `duplicated`, o tipo **pedido** — o do contra-CT-e existente está\nem `GET /fiscal/cte/{counter_cte_id}`, campo `service_type`).\n\n## Repasse ao motorista (mesma regra do CIOT)\n\n`repasse.parcelas` é a regra de parcelas do lote (posições 1..3, percentuais somando 100,\n`dias` de 0 a 30) e **vence a regra cadastrada do motorista**. Os contra-CT-e de um mesmo\nmotorista no lote formam um grupo:\n\n- **N ≥ nº de parcelas** → cada documento inteiro cai numa parcela (60/20/20 em 15 docs =\n  9/3/3 documentos, sempre ≥ 1 por parcela) — a parcela 1 libera na bipagem, a 2 na\n  conclusão, a 3 na prestação de contas;\n- **N < nº de parcelas** → cada documento é fracionado nas parcelas (60/20/20 do valor\n  dele).\n\nO bucket é decidido pela **posição no lote**, não pelo valor: com valores diferentes, a\nordem das chaves define quanto entra em cada parcela. A parcela só existe depois da\n**bipagem** do documento — consulte-a em `GET /carriers/parcelas-repasse/{documento}`\n(aceita o `counter_cte_id`).\n\n## Um modo por origem, e o que bloqueia\n\nUma chave com contra-CT-e integral ativo não aceita pernas (`origem_ja_subcontratada_1a1`)\ne vice-versa (`origem_ja_subcontratada_em_pernas`); cancelar o contra-CT-e libera o outro\nmodo. Chave já subcontratada no mesmo modo responde `duplicated` com o `counter_cte_id`\nexistente — reenviar o lote é seguro. CT-e emitido pela sua própria empresa responde\n`cte_proprio`; rota sem regra, `sem_regra_tributacao`; redespacho com o trecho igual à\nviagem inteira, `redespacho_exige_rota`; origem vinculada a multimodal,\n`origem_incompativel_com_tipo`; origem cujo repasse já foi pago não pode virar pernas.\n\nCancelar um contra-CT-e (`POST /fiscal/cte/{cte_uuid}/eventos/cancelamento`) cancela as\nparcelas ainda não pagas e tira o documento do grupo; o CT-e da contratante continua válido.\n",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/ContraCteLoteInput"
        }
      }
    }
  },
  "responses": {
    "202": {
      "description": "Lote aceito; a emissão roda em segundo plano.",
      "headers": {
        "X-Request-Id": {
          "$ref": "#/components/headers/RequestId"
        }
      },
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ContraCteLoteAcceptedEnvelope"
          }
        }
      }
    },
    "400": {
      "$ref": "#/components/responses/Erro400"
    },
    "401": {
      "$ref": "#/components/responses/Unauthorized"
    },
    "403": {
      "$ref": "#/components/responses/Forbidden"
    },
    "422": {
      "description": "Validação do payload (`error.details.fields`) ou regra de negócio antes de criar o lote:\n`motorista_nao_encontrado`, `veiculo_nao_encontrado` — nas pernas, o `message` aponta a\nperna (`ctes.0.pernas.2`).\n",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ErrorEnvelope"
          }
        }
      }
    },
    "429": {
      "$ref": "#/components/responses/RateLimited"
    },
    "500": {
      "$ref": "#/components/responses/InternalError"
    }
  },
  "method": "POST",
  "path": "/fiscal/cte-subcontratacao/lote",
  "parameters": []
}