openapi: 3.1.0
info:
  title: API Credicarro
  description: API para gerenciamento de cobranças e pagamentos usando o Credicarro.
  version: 1.0.0
servers:
  - url: https://api.staging.credicarro.com.br/integration
    description: Servidor para o ambiente de staging
  - url: https://api.credicarro.com.br/integration
    description: Servidor para o ambiente de produção
paths:
  /v1/proposal:
    post:
      tags:
        - Proposta
      summary: Criar uma nova proposta
      description: Cria uma nova proposta a partir de uma simulação existente
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Os dados da sua proposta
              required: ['cpf', 'simulacaoId']
              additionalProperties: false
              properties:
                cpf:
                  minLength: 11
                  type: string
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                simulacaoId:
                  type: string
                  format: uuid
                  description: Identificador único da simulação
                  example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
      responses:
        '201':
          description: Proposta criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id_proposta:
                    type: string
                    format: uuid
                    description: Identificador único da proposta
                    example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente ou simulação não encontrados (`Customer.Account.NotFound`, `Simulation.Access.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.IdempotencyKeyReused`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra de negócio não atendida (`Customer.Account.Incomplete`, `Proposal.SimulationAlreadyExpired`, `Proposal.SimulationAlreadyActivated` ou `Proposal.BuyerAgeNotAllowed`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
    get:
      tags:
        - Proposta
      summary: Paginação de propostas
      description:  Paginação de propostas
      security:
        - bearerAuth: []
      parameters:
        - name: pagina_inicial
          in: query
          description: Página inicial (mínimo 1)
          schema:
            type: integer
            format: int32
            example: 1
        - name: limite
          in: query
          description: Quantidade de itens por página (1 a 100)
          schema:
            type: integer
            format: int32
            example: 10
      responses:
        '200':
          description: Lista de propostas retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  itens:
                    type: array
                    description: Lista de propostas
                    items:
                      $ref: "#/components/schemas/ProposalResponse"
                  pagina:
                    $ref: "#/components/schemas/Page"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: O cliente de uma proposta não foi encontrado (`Proposal.Customer.ProfileNotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '502':
          description: Não foi possível identificar o cliente de uma proposta (`Proposal.Customer.ProfileAmbiguous`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/{propostaId}:
    get:
      tags:
        - Proposta
      summary: Consultar proposta pelo ID.
      description: Consulta os detalhes de uma proposta específica utilizando o seu ID
      security:
        - bearerAuth: []
      parameters:
        - name: propostaId
          in: path
          description: Identificador único da proposta (UUID) retornado na criação da proposta
          required: true
          schema:
            type: string
            format: uuid
            description: Identificador único da proposta
            example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
      responses:
        '200':
          description: Proposta retornada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProposalResponse"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Proposta não encontrada para este parceiro (`Proposal.Access.NotFound`) ou cliente da proposta não encontrado (`Proposal.Customer.ProfileNotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/simulation/range/financing:
    get:
      tags:
        - Simulação
      summary: Consultar valor mínimo de entrada por prazo para financiamento
      description: Consulta o valor mínimo de entrada por prazo pela placa informada
      security:
        - bearerAuth: []
      parameters:
        - name: placa
          in: query
          description: Placa do veículo para busca
          required: true
          schema:
            type: string
            minLength: 7
            example: ABC-1234
            description: Placa do veículo
      responses:
        '200':
          description: Faixa Financiável retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  opcoes_por_prazo:
                    type: array
                    items:
                      type: object
                      properties:
                        prazo:
                          type: integer
                          format: int32
                          description: Prazo em meses
                          example: 12
                        valor_minimo_entrada:
                          type: number
                          format: double
                          description: Valor mínimo de entrada para o prazo
                          example: 5000.00
                      additionalProperties: false
                additionalProperties: false
        '400':
          description: Erro na requisição (parâmetros inválidos ou ausentes)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Nenhuma loja de integração vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Sem prazos disponíveis para o veículo (`Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/simulation/range/refinancing:
    get:
      tags:
        - Simulação
      summary: Consultar valor mínimo e máximo refinanciável
      description: Consulta o valor mínimo e máximo refinanciável pela placa informada
      security:
        - bearerAuth: []
      parameters:
        - name: placa
          in: query
          description: Placa do veículo para busca
          required: true
          schema:
            type: string
            minLength: 7
            example: ABC1D23
            description: Placa do veículo
      responses:
        '200':
          description: Faixa de valor refinanciavel
          content:
            application/json:
              schema:
                type: object
                properties:
                  opcoes_por_prazo:
                    type: array
                    items:
                      type: object
                      properties:
                        prazo:
                          type: integer
                          format: int32
                          description: Prazo
                          example: 6
                        valor_minimo_refinanciavel:
                          type: number
                          format: double
                          description: Mínimo valor refinanciavel
                          example: 12480
                        valor_maximo_refinanciavel:
                          type: number
                          format: double
                          description: Máximo valor refinanciavel
                          example: 35720
                      additionalProperties: false
                additionalProperties: false
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Nenhuma loja de integração vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Sem prazos disponíveis para o veículo (`Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/simulation:
    get:
      tags:
        - Simulação
      summary: Paginação de simulações
      description: Paginação de simulações
      security:
        - bearerAuth: []
      parameters:
        - name: pagina_inicial
          in: query
          description: Página inicial (mínimo 1)
          schema:
            type: integer
            format: int32
            example: 1
        - name: limite
          in: query
          description: Quantidade de itens por página (1 a 100)
          schema:
            type: integer
            format: int32
            example: 10
      responses:
        '200':
          description: Lista de simulações retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  itens:
                    type: array
                    description: Lista de simulações
                    items:
                      $ref: "#/components/schemas/SimulationResponse"
                  pagina:
                    $ref: "#/components/schemas/Page"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
  /v1/proposal/simulation/{simulacaoId}:
    get:
      tags:
        - Simulação
      summary: Consultar simulação pelo ID.
      description: Consulta os detalhes de uma simulação específica utilizando o seu ID
      security:
        - bearerAuth: []
      parameters:
        - name: simulacaoId
          in: path
          description: Identificador único da simulaçao (UUID) retornado na criação da simulaçao
          required: true
          schema:
            type: string
            format: uuid
            description: Identificador único da simulaçao
            example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
      responses:
        '200':
          description: Simulaçao retornada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SimulationResponse"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Simulação não encontrada para este parceiro (`Simulation.Access.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/simulation/financing:
    post:
      tags:
        - Simulação
      summary: Criar uma nova simulação de financiamento
      description: Cria uma nova simulação de financiamento
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              description: Os dados da sua simulação
              required: ['cpf', 'isVeiculoZeroKm', 'placa', 'valorVeiculo', 'uf', 'valorEntrada']
              additionalProperties: false
              properties:
                cpf:
                  minLength: 11
                  type: string
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                isVeiculoZeroKm:
                  type: boolean
                  description: Indica se o veículo é zero quilômetro. true para novo, false para usado.
                  example: true
                placa:
                  type: string
                  description: Placa do veículo
                  example: ABC1D23
                valorVeiculo:
                  type: number
                  description: Valor total do veículo
                  format: double
                  example: 45000
                uf:
                  type: string
                  description: UF (Unidade Federativa) do registro do veículo, em formato de 2 letras (ex. SP, RJ, MG).
                  example: "SP"
                valorEntrada:
                  type: number
                  description: Valor de entrada do financiamento, em reais. Utilize ponto como separador decimal. Informe zero quando não houver entrada; deve ser menor que o valor do veículo.
                  format: double
                  example: 5000
      responses:
        '201':
          description: Simulação criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  simulacoes:
                    type: array
                    items:
                      type: object
                      properties:
                        id_simulacao:
                          type: string
                          format: uuid
                          example: 123e4567-e89b-12d3-a456-426614174000
                        valor_solicitado:
                          type: number
                          format: double
                          example: 1
                        prazo:
                          type: integer
                          format: int32
                          example: 1
                        valor_parcela:
                          type: number
                          format: double
                          example: 1
                        valor_tac:
                          type: number
                          format: double
                          example: 1
                        valor_boleto:
                          type: number
                          format: double
                          example: 1
                        valor_seguro:
                          type: number
                          format: double
                          example: 1
                        valor_iof:
                          type: number
                          format: double
                          example: 1
                        percentual_iof:
                          type: number
                          format: double
                          example: 1
                        valor_credito_total:
                          type: number
                          format: double
                          example: 1
                        valor_divida_total:
                          type: number
                          format: double
                          example: 1
                        percentual_cet_mensal:
                          type: number
                          format: double
                          example: 1
                        percentual_cet_anual:
                          type: number
                          format: double
                          example: 1
                        percentual_juros_mensal:
                          type: number
                          format: double
                          example: 1
                        percentual_juros_anual:
                          type: number
                          format: double
                          example: 1
                        valor_retencao_diaria_aproximado:
                          type: number
                          format: double
                          description: Valor aproximado de retenção diária. Omitido quando não se aplica.
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`) ou nenhuma loja de integração vinculada ao parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.SimulationIdempotencyConflict`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra de negócio não atendida (por exemplo, `Proposal.DownPaymentInvalid`, `Proposal.RequestAmountInvalid`, `Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/proposal/simulation/refinancing:
    post:
      tags:
        - Simulação
      summary: Criar uma nova simulação de refinanciamento
      description: Cria uma nova simulação de refinanciamento
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              description: Os dados da sua simulação
              required: ['placa', 'valorSolicitado', 'cpf']
              additionalProperties: false
              properties:
                cpf:
                  minLength: 11
                  type: string
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                placa:
                  minLength: 1
                  type: string
                  description: Placa do veículo
                  example: ABC1D23
                valorSolicitado:
                  type: number
                  description: Valor total solicitado para refinanciamento
                  format: double
                  example: 45000
      responses:
        '201':
          description: Simulação criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  simulacoes:
                    type: array
                    items:
                      type: object
                      properties:
                        id_simulacao:
                          type: string
                          format: uuid
                          example: 123e4567-e89b-12d3-a456-426614174000
                        valor_solicitado:
                          type: number
                          format: double
                          example: 1
                        prazo:
                          type: integer
                          format: int32
                          example: 1
                        valor_parcela:
                          type: number
                          format: double
                          example: 1
                        valor_tac:
                          type: number
                          format: double
                          example: 1
                        valor_boleto:
                          type: number
                          format: double
                          example: 1
                        valor_seguro:
                          type: number
                          format: double
                          example: 1
                        valor_iof:
                          type: number
                          format: double
                          example: 1
                        percentual_iof:
                          type: number
                          format: double
                          example: 1
                        valor_credito_total:
                          type: number
                          format: double
                          example: 1
                        valor_divida_total:
                          type: number
                          format: double
                          example: 1
                        percentual_cet_mensal:
                          type: number
                          format: double
                          example: 1
                        percentual_cet_anual:
                          type: number
                          format: double
                          example: 1
                        percentual_juros_mensal:
                          type: number
                          format: double
                          example: 1
                        percentual_juros_anual:
                          type: number
                          format: double
                          example: 1
                        valor_retencao_diaria_aproximado:
                          type: number
                          format: double
                          description: Valor aproximado de retenção diária. Omitido quando não se aplica.
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`) ou nenhuma loja de integração vinculada ao parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.SimulationIdempotencyConflict`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra de negócio não atendida (por exemplo, `Proposal.RequestAmountInvalid`, `Simulation.Refinancing.AmountOutOfRange`, `Simulation.Terms.Unavailable` ou `Simulation.Refinancing.UfUnavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/authentication/accesstoken:
    post:
      tags:
        - Autenticação
      summary: Gerar token de acesso.
      description: Gera um token de acesso para o parceiro utilizando as credenciais do cliente.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                clientId:
                  type: string
                  description: Identificador do cliente de integração fornecido pelo Credicarro
                  example: 8pqh3k1y0zmtg4u9xenrcvlsw2
                clientSecret:
                  type: string
                  description: Segredo do cliente de integração fornecido pelo Credicarro
                  example: 8qzn2v0w5lgyh3cmt9a7jrk1f4bepsdu6xovifn3t5hlgq7r9kc
              required:
                - clientId
                - clientSecret
      responses:
        '200':
          description: autenticação retornada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/authenticationResponse"
        '400':
          description: "`clientId` ou `clientSecret` ausente ou longo demais (`Validation.Field.Required`, `Validation.Field.TooLong`)"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '401':
          description: Credenciais inválidas ou integração inativa (`Integration.Authentication.InvalidCredentials`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/customer:
    post:
      tags:
        - Cliente
      summary: Criar um novo cliente
      description: Cria um novo cliente com base nos dados fornecidos
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Dados do novo cliente
              required: ['celular', 'cpf', 'dataDeNascimento', 'email', 'nome', 'sobrenome']
              additionalProperties: false
              properties:
                celular:
                  type: string
                  minLength: 1
                  description: Telefone celular exatamente no formato `+55 (DD) 99999-9999`.
                  example: "+55 (11) 99876-5432"
                cpf:
                  type: string
                  minLength: 11
                  maxLength: 14
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                dataDeNascimento:
                  type: string
                  format: date-time
                  description: Data de nascimento em ISO-8601. O cliente precisa ter entre 18 e 75 anos.
                  example: "1990-05-20T00:00:00-03:00"
                email:
                  type: string
                  minLength: 1
                  description: Endereço de e-mail do cliente.
                  example: "maria.souza@exemplo.com.br"
                nome:
                  type: string
                  minLength: 1
                  description: Primeiro nome do cliente.
                  example: "Maria"
                sobrenome:
                  type: string
                  minLength: 1
                  description: Sobrenome do cliente.
                  example: "Souza"
      responses:
        '200':
          description: Cliente criado ou atualizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  id_cliente:
                    type: string
                    format: uuid
                    description: Identificador único do cliente
                    example: 123e4567-e89b-12d3-a456-426614174000
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          description: Integração inativa (`Integration.Access.Inactive`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: CPF, e-mail ou celular já cadastrado (`Cpf.CpfAlreadyAdded`, `Email.EmailAlreadyAdded`, `Phone.PhoneAlreadyAdded`), ou Idempotency-Key reutilizada com outro conteúdo
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/customer/address:
    post:
      tags:
        - Cliente
      summary: Criar ou atualizar endereço de um cliente
      description: Cria ou atualiza o endereço de um cliente com base nos dados fornecidos.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Dados para criação ou atualização de endereço
              required: ['cpf', 'endereco']
              additionalProperties: false
              properties:
                cpf:
                  type: string
                  minLength: 11
                  maxLength: 14
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                endereco:
                  type: object
                  required: ['rua', 'cidade', 'estado', 'bairro', 'cep']
                  additionalProperties: false
                  properties:
                    rua:
                      type: string
                      description: Nome da rua.
                      example: "Av. Paulista"
                    cidade:
                      type: string
                      description: Cidade.
                      example: "São Paulo"
                    estado:
                      type: string
                      description: Estado.
                      example: "SP"
                    bairro:
                      type: string
                      description: Bairro.
                      example: "Bela Vista"
                    cep:
                      type: string
                      description: CEP com 8 dígitos, com ou sem hífen.
                      example: "01311000"
                    numero:
                      type: string
                      description: Número do endereço (opcional).
                      example: "1578"
                    complemento:
                      type: string
                      description: Complemento (opcional).
                      example: "Bloco B, Apto 1203"
      responses:
        '202':
          description: Endereço aceito para criação ou atualização. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: Accepted
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          description: Integração inativa (`Integration.Access.Inactive`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/customer/professional:
    post:
      tags:
        - Cliente
      summary: Criar ou atualizar dados profissionais de um cliente
      description: Cria ou atualiza as informações profissionais de um cliente com base nos dados fornecidos.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Dados profissionais do cliente
              required: ['cpf', 'tipoOcupacao', 'renda']
              additionalProperties: false
              properties:
                cpf:
                  type: string
                  minLength: 11
                  maxLength: 14
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                tipoOcupacao:
                  type: integer
                  format: int32
                  description: |
                    Tipo de ocupação do cliente.
                    Valores aceitos:
                      - 1 = aposentado
                      - 2 = pensionista
                      - 3 = assalariado
                      - 4 = autônomo
                      - 6 = freelancer
                      - 7 = proprietário
                  example: 1
                renda:
                  type: number
                  format: double
                  description: Renda mensal do cliente, em reais (use ponto como separador decimal).
                  example: 6500.00
      responses:
        '202':
          description: Dados profissionais aceitos para criação ou atualização. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: Accepted
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          description: Integração inativa (`Integration.Access.Inactive`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/customer/unified:
    post:
      tags:
        - Cliente
      summary: Criar ou atualizar cliente com dados completos
      description: Cria ou atualiza um cliente incluindo informações pessoais, endereço e dados profissionais.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Dados completos do cliente
              required: ['celular', 'cpf', 'dataDeNascimento', 'email', 'nome', 'sobrenome', 'endereco', 'dadosProfissionais']
              additionalProperties: false
              properties:
                celular:
                  type: string
                  minLength: 1
                  description: Telefone celular exatamente no formato `+55 (DD) 99999-9999`.
                  example: "+55 (11) 99876-5432"
                cpf:
                  type: string
                  minLength: 11
                  maxLength: 14
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                dataDeNascimento:
                  type: string
                  format: date-time
                  description: Data de nascimento em ISO-8601. O cliente precisa ter entre 18 e 75 anos.
                  example: "1990-05-20T00:00:00-03:00"
                email:
                  type: string
                  minLength: 1
                  description: Endereço de e-mail do cliente.
                  example: "maria.souza@exemplo.com.br"
                nome:
                  type: string
                  minLength: 1
                  description: Primeiro nome do cliente.
                  example: "Maria"
                sobrenome:
                  type: string
                  minLength: 1
                  description: Sobrenome do cliente.
                  example: "Souza"
                endereco:
                  type: object
                  required: ['rua', 'cidade', 'estado', 'bairro', 'cep']
                  properties:
                    rua:
                      type: string
                      example: "Av. Paulista"
                    cidade:
                      type: string
                      example: "São Paulo"
                    estado:
                      type: string
                      example: "SP"
                    bairro:
                      type: string
                      example: "Bela Vista"
                    cep:
                      type: string
                      example: "01311000"
                    numero:
                      type: string
                      example: "1578"
                    complemento:
                      type: string
                      example: "Bloco B, Apto 1203"
                dadosProfissionais:
                  type: object
                  required: ['tipoOcupacao', 'renda']
                  properties:
                    tipoOcupacao:
                      type: integer
                      format: int32
                      description: |
                        Tipo de ocupação do cliente.
                        Valores aceitos:
                          - 1 = aposentado
                          - 2 = pensionista
                          - 3 = assalariado
                          - 4 = autônomo
                          - 6 = freelancer
                          - 7 = proprietário
                      example: 1
                    renda:
                      type: number
                      format: double
                      description: Renda mensal do cliente em reais.
                      example: 6500.00
      responses:
        '200':
          description: Cliente criado ou atualizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  id_cliente:
                    type: string
                    format: uuid
                    description: Identificador único do cliente
                    example: 123e4567-e89b-12d3-a456-426614174000
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          description: Integração inativa (`Integration.Access.Inactive`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: CPF, e-mail ou celular já cadastrado na criação com Idempotency-Key, ou Idempotency-Key reutilizada com outro conteúdo
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v1/webhook:
    post:
      tags:
        - Webhook
      summary: Cadastrar um webhook
      description: |
        Cadastra um webhook ativo para o parceiro autenticado. É permitido mais de um webhook por tipo.
        A resposta traz o segredo de assinatura (`segredo_assinatura`) em claro, usado para validar o header
        `X-CrediCarro-Signature` das notificações. Ele não pode ser recuperado depois, então guarde-o nesse momento.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['tipo', 'url', 'tipo_autenticacao']
              additionalProperties: false
              properties:
                tipo:
                  type: integer
                  format: int32
                  description: |
                    Evento notificado pelo webhook.
                    Valores aceitos:
                      - 1 = Customer
                      - 2 = Simulation
                      - 3 = Proposal
                  example: 3
                url:
                  type: string
                  description: URL HTTPS pública, com até 2048 caracteres, que receberá as notificações (sem localhost, IP privado, usuário/senha ou fragmento).
                  example: https://parceiro.com.br/webhooks/credicarro
                tipo_autenticacao:
                  type: integer
                  format: int32
                  description: |
                    Autenticação enviada pela Credicarro ao chamar a URL. Não pode ser alterada depois da criação.
                    Valores aceitos:
                      - 1 = None (sem autenticação)
                      - 2 = Basic
                      - 3 = Jwt
                  example: 2
                credencial:
                  type: string
                  description: |
                    Credencial enviada no header `Authorization`. Obrigatória para Basic (valor em Base64 de `usuario:senha`,
                    enviado como `Basic {credencial}`) e Jwt (token enviado como `Bearer {credencial}`).
                  example: dXN1YXJpbzpzZW5oYQ==
      responses:
        '201':
          description: Webhook cadastrado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id_webhook:
                    type: string
                    format: uuid
                    description: Identificador único do webhook
                    example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  segredo_assinatura:
                    type: string
                    description: Segredo usado para validar a assinatura `X-CrediCarro-Signature`. Retornado somente nesta resposta.
                    example: "<segredo-de-assinatura>"
        '400':
          description: Erro na requisição (por exemplo, `Validation.Url.Invalid` para URL malformada, `Validation.Field.Required` para `credencial` ausente em Basic ou Jwt)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '422':
          description: "URL não aceita (`Organization.Webhook.InvalidEndpoint`: precisa ser HTTPS pública, sem localhost, IP privado, usuário/senha ou fragmento) ou integração inativa (`Organization.Webhook.ActivationIntegrationInactive`)"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '503':
          description: Não foi possível proteger a credencial agora (`Organization.Webhook.CredentialProtectionUnavailable`). Tente de novo.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
    get:
      tags:
        - Webhook
      summary: Consultar webhooks do parceiro
      description: Traz, de forma paginada, os webhooks cadastrados para o parceiro autenticado. A credencial e o segredo de assinatura não são retornados.
      security:
        - bearerAuth: []
      parameters:
        - name: pagina_inicial
          in: query
          description: Página inicial (mínimo 1)
          schema:
            type: integer
            format: int32
            example: 1
        - name: limite
          in: query
          description: Quantidade de itens por página (1 a 100)
          schema:
            type: integer
            format: int32
            example: 10
      responses:
        '200':
          description: Lista de webhooks retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  itens:
                    type: array
                    items:
                      $ref: "#/components/schemas/WebhookResponse"
                  pagina:
                    $ref: "#/components/schemas/Page"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
  /v1/webhook/{webhookId}:
    put:
      tags:
        - Webhook
      summary: Editar um webhook
      description: |
        Atualiza o tipo, a URL e o status de um webhook do parceiro autenticado. A autenticação (tipo e credencial)
        não pode ser alterada; para trocá-la, exclua o webhook e cadastre outro.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['tipo', 'url']
              additionalProperties: false
              properties:
                tipo:
                  type: integer
                  format: int32
                  description: |
                    Evento notificado pelo webhook.
                    Valores aceitos:
                      - 1 = Customer
                      - 2 = Simulation
                      - 3 = Proposal
                  example: 3
                url:
                  type: string
                  description: URL HTTPS pública, com até 2048 caracteres, que receberá as notificações (sem localhost, IP privado, usuário/senha ou fragmento).
                  example: https://parceiro.com.br/webhooks/credicarro
                status:
                  type: integer
                  format: int32
                  description: |
                    Status do webhook. Quando omitido, mantém o status atual.
                    Valores aceitos:
                      - 1 = Active
                      - 2 = Inactive
                  example: 1
      responses:
        '204':
          description: Webhook atualizado com sucesso. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: No Content
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Webhook não encontrado para este parceiro (`Webhook.Registration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: O webhook foi alterado ao mesmo tempo por outra requisição (`Organization.Webhook.ConcurrencyConflict`). Tente de novo.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: URL não aceita (`Organization.Webhook.InvalidEndpoint`) ou ativação com a integração inativa (`Organization.Webhook.ActivationIntegrationInactive`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
    delete:
      tags:
        - Webhook
      summary: Excluir um webhook
      description: Remove um webhook do parceiro autenticado; ele deixa de receber notificações.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      responses:
        '204':
          description: Webhook excluído com sucesso. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: No Content
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Webhook não encontrado para este parceiro (`Webhook.Registration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: O webhook foi alterado ao mesmo tempo por outra requisição (`Organization.Webhook.ConcurrencyConflict`). Tente de novo.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/simulation/range/financing:
    get:
      tags:
        - Simulação
      summary: Consultar valor mínimo de entrada por prazo para financiamento
      description: |
        Consulta o valor mínimo de entrada por prazo pela placa informada, selecionando a loja de integração pelo
        CNPJ (`cnpjLoja`). A loja precisa estar vinculada ao parceiro autenticado e não pode ter contrato de
        intermediação.
      security:
        - bearerAuth: []
      parameters:
        - name: placa
          in: query
          description: Placa do veículo para busca
          required: true
          schema:
            type: string
            minLength: 7
            example: ABC-1234
            description: Placa do veículo
        - name: cnpjLoja
          in: query
          description: CNPJ da loja de integração vinculada ao parceiro, formatado ou apenas números
          required: true
          schema:
            type: string
            example: 11.222.333/0001-81
      responses:
        '200':
          description: Faixa Financiável retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  opcoes_por_prazo:
                    type: array
                    items:
                      type: object
                      properties:
                        prazo:
                          type: integer
                          format: int32
                          description: Prazo em meses
                          example: 12
                        valor_minimo_entrada:
                          type: number
                          format: double
                          description: Valor mínimo de entrada para o prazo
                          example: 5000.00
                      additionalProperties: false
                additionalProperties: false
        '400':
          description: Erro na requisição (parâmetros inválidos ou ausentes)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Loja não encontrada ou não vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Loja com contrato de intermediação (`Store.Integration.Intermediation`) ou sem prazos disponíveis para o veículo (`Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/simulation/range/refinancing:
    get:
      tags:
        - Simulação
      summary: Consultar valor mínimo e máximo refinanciável
      description: |
        Consulta o valor mínimo e máximo refinanciável pela placa informada, selecionando a loja de integração pelo
        CNPJ (`cnpjLoja`). A loja precisa estar vinculada ao parceiro autenticado e não pode ter contrato de
        intermediação.
      security:
        - bearerAuth: []
      parameters:
        - name: placa
          in: query
          description: Placa do veículo para busca
          required: true
          schema:
            type: string
            minLength: 7
            example: ABC1D23
            description: Placa do veículo
        - name: cnpjLoja
          in: query
          description: CNPJ da loja de integração vinculada ao parceiro, formatado ou apenas números
          required: true
          schema:
            type: string
            example: 11.222.333/0001-81
      responses:
        '200':
          description: Faixa de valor refinanciavel
          content:
            application/json:
              schema:
                type: object
                properties:
                  opcoes_por_prazo:
                    type: array
                    items:
                      type: object
                      properties:
                        prazo:
                          type: integer
                          format: int32
                          description: Prazo
                          example: 6
                        valor_minimo_refinanciavel:
                          type: number
                          format: double
                          description: Mínimo valor refinanciavel
                          example: 12480
                        valor_maximo_refinanciavel:
                          type: number
                          format: double
                          description: Máximo valor refinanciavel
                          example: 35720
                      additionalProperties: false
                additionalProperties: false
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Loja não encontrada ou não vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Loja com contrato de intermediação (`Store.Integration.Intermediation`) ou sem prazos disponíveis para o veículo (`Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/simulation/financing:
    post:
      tags:
        - Simulação
      summary: Criar uma nova simulação de financiamento
      description: |
        Cria uma nova simulação de financiamento selecionando a loja de integração pelo CNPJ (`cnpjLoja`).
        A loja precisa estar vinculada ao parceiro autenticado e não pode ter contrato de intermediação.
        O cliente precisa estar cadastrado antes da simulação, pelas rotas de Cliente.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['cpf', 'placa', 'valorVeiculo', 'valorEntrada', 'uf', 'isVeiculoZeroKm', 'cnpjLoja']
              additionalProperties: false
              properties:
                cpf:
                  type: string
                  minLength: 11
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                placa:
                  type: string
                  description: Placa do veículo no padrão antigo (ABC-1234) ou Mercosul (ABC1D23)
                  example: ABC1D23
                valorVeiculo:
                  type: number
                  format: double
                  description: Valor total do veículo, em reais. Deve ser maior que zero.
                  example: 45000
                valorEntrada:
                  type: number
                  format: double
                  description: Valor de entrada, em reais. Informe zero quando não houver entrada; deve ser menor que o valor do veículo.
                  example: 5000
                uf:
                  type: string
                  description: UF do registro do veículo, com 2 letras (ex. SP, RJ, MG).
                  example: SP
                isVeiculoZeroKm:
                  type: boolean
                  description: Indica se o veículo é zero quilômetro. `true` para novo, `false` para usado.
                  example: false
                cnpjLoja:
                  type: string
                  description: CNPJ da loja de integração vinculada ao parceiro, formatado ou apenas números.
                  example: 11.222.333/0001-81
      responses:
        '201':
          description: Simulação criada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SimplifySimulationListResponse"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`) ou loja não encontrada ou não vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.SimulationIdempotencyConflict`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Loja com intermediação (`Store.Integration.Intermediation`) ou regra de negócio não atendida (por exemplo, `Proposal.DownPaymentInvalid`, `Proposal.RequestAmountInvalid`, `Simulation.Terms.Unavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/simulation/refinancing:
    post:
      tags:
        - Simulação
      summary: Criar uma nova simulação de refinanciamento
      description: |
        Cria uma nova simulação de refinanciamento selecionando a loja de integração pelo CNPJ (`cnpjLoja`).
        A loja precisa estar vinculada ao parceiro autenticado e não pode ter contrato de intermediação.
        O cliente precisa estar cadastrado com endereço, e o `valorSolicitado` precisa estar dentro da faixa refinanciável da placa.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['cpf', 'placa', 'valorSolicitado', 'cnpjLoja']
              additionalProperties: false
              properties:
                cpf:
                  type: string
                  minLength: 11
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                placa:
                  type: string
                  description: Placa do veículo no padrão antigo (ABC-1234) ou Mercosul (ABC1D23)
                  example: ABC1D23
                valorSolicitado:
                  type: number
                  format: double
                  description: Valor solicitado para refinanciamento, em reais. Deve estar dentro da faixa refinanciável da placa.
                  example: 25000
                cnpjLoja:
                  type: string
                  description: CNPJ da loja de integração vinculada ao parceiro, formatado ou apenas números.
                  example: 11.222.333/0001-81
      responses:
        '201':
          description: Simulação criada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SimplifySimulationListResponse"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente não encontrado (`Customer.Account.NotFound`) ou loja não encontrada ou não vinculada a este parceiro (`Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.SimulationIdempotencyConflict`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Loja com intermediação (`Store.Integration.Intermediation`) ou regra de negócio não atendida (por exemplo, `Proposal.RequestAmountInvalid`, `Simulation.Refinancing.AmountOutOfRange`, `Simulation.Terms.Unavailable` ou `Simulation.Refinancing.UfUnavailable`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal:
    post:
      tags:
        - Proposta
      summary: Criar uma nova proposta
      description: |
        Cria uma proposta a partir de uma simulação feita com `cnpjLoja`. A simulação precisa pertencer ao parceiro e ter
        sido feita em uma loja de integração vinculada a ele. O cliente precisa estar com o cadastro completo
        (endereço, tipo de ocupação e renda).
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['cpf', 'simulacaoId']
              additionalProperties: false
              properties:
                cpf:
                  type: string
                  minLength: 11
                  description: CPF do cliente, com ou sem pontuação (11 dígitos). Os dígitos verificadores são validados.
                  example: "12345678909"
                simulacaoId:
                  type: string
                  format: uuid
                  description: Identificador da simulação escolhida (retornado em `id_simulacao`)
                  example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
      responses:
        '201':
          description: Proposta criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id_proposta:
                    type: string
                    format: uuid
                    description: Identificador único da proposta
                    example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Cliente, simulação ou loja não encontrados para este parceiro (`Customer.Account.NotFound`, `Simulation.Access.NotFound`, `Store.Integration.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: A Idempotency-Key já foi usada com outro conteúdo (`Proposal.IdempotencyKeyReused`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra de negócio não atendida (`Customer.Account.Incomplete`, `Simulation.Access.NotFromStore`, `Store.Integration.Intermediation`, `Proposal.SimulationAlreadyExpired`, `Proposal.SimulationAlreadyActivated` ou `Proposal.BuyerAgeNotAllowed`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/{propostaId}:
    get:
      tags:
        - Proposta
      summary: Consultar proposta pelo ID.
      description: |
        Consulta o retrato atual de uma proposta, com status, link de biometria e as etapas e os
        documentos do comprador, da loja e, quando houver, do vendedor.

        Em `documentos`, o comprador e a loja listam só os documentos exigidos na proposta: os enviados
        com o status real e os que faltam com `PENDENTE` (5). O vendedor lista todos os documentos enviados.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/ProposalId"
      responses:
        '200':
          description: Proposta retornada com sucesso
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProposalV2Response"
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Proposta não encontrada para este parceiro (`Proposal.Access.NotFound`) ou cliente da proposta não encontrado (`Proposal.Customer.ProfileNotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Proposta não disponível nesta rota (`Proposal.Access.NotIntegrationV2`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/{propostaId}/vehicle-detail:
    post:
      tags:
        - Proposta
      summary: Incluir os dados do veículo
      description: |
        Inclui ou atualiza placa, Renavam, chassi e cor do veículo de uma proposta. Aceito somente
        enquanto a etapa `DADOS_VEICULO` (8) estiver ativa: na loja, no financiamento; no comprador, no refinanciamento.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/ProposalId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['renavam', 'chassi', 'placa', 'cor']
              additionalProperties: false
              properties:
                renavam:
                  type: string
                  description: Renavam do veículo, com até 11 dígitos e dígito verificador válido.
                  example: "12345678900"
                chassi:
                  type: string
                  description: Chassi do veículo, com 17 caracteres, sem as letras I, O e Q.
                  example: 9BWZZZ377VT004251
                placa:
                  type: string
                  description: Placa do veículo (ABC-1234, ABC1234 ou ABC1D23).
                  example: ABC1D23
                cor:
                  type: string
                  description: Cor do veículo, sem números, com até 30 caracteres.
                  example: PRATA
      responses:
        '204':
          description: Dados do veículo registrados. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: No Content
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Proposta não encontrada para este parceiro (`Proposal.Access.NotFound`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Etapa não permite o envio (`Proposal.InvalidStatus`) ou proposta não disponível nesta rota (`Proposal.Access.NotIntegrationV2`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/{propostaId}/deposit-account:
    post:
      tags:
        - Proposta
      summary: Incluir a conta de recebimento
      description: |
        Inclui ou substitui a conta de recebimento de uma proposta de **refinanciamento**, enquanto a
        etapa ativa for `CONTA_RECEBIMENTO` (5). O titular deve ser o cliente da proposta. Propostas de financiamento
        não são aceitas. Enviar novamente substitui a conta anterior.
      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/ProposalId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['cpfTitular', 'codigoBanco', 'agencia', 'digitoAgencia', 'conta', 'digitoConta', 'tipoConta']
              additionalProperties: false
              properties:
                cpfTitular:
                  type: string
                  description: CPF do titular da conta, formatado ou apenas números. Deve ser o CPF do cliente da proposta.
                  example: "12345678909"
                codigoBanco:
                  type: string
                  description: Código do banco (COMPE) com 3 dígitos.
                  example: "001"
                agencia:
                  type: string
                  description: Número da agência com até 4 dígitos, sem o dígito verificador.
                  example: "1234"
                digitoAgencia:
                  type: string
                  description: Dígito verificador da agência (número ou X).
                  example: "5"
                conta:
                  type: string
                  description: Número da conta, de 4 a 13 dígitos, sem o dígito verificador.
                  example: "123456"
                digitoConta:
                  type: string
                  description: Dígito verificador da conta (número ou X).
                  example: "7"
                tipoConta:
                  type: string
                  description: Tipo da conta.
                  enum: ['CORRENTE', 'POUPANCA', 'PAGAMENTO']
                  example: CORRENTE
      responses:
        '204':
          description: Conta de recebimento registrada. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: No Content
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Proposta não encontrada para este parceiro
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra não atendida — `Proposal.DepositAccount.OnlyRefinancing`, `Proposal.DepositAccount.HolderNotBuyer`, `Proposal.ProposalIsNotInDepositAccountStatus` ou `Proposal.Access.NotIntegrationV2`
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
  /v2/proposal/{propostaId}/document:
    post:
      tags:
        - Proposta
      summary: Enviar documento de participante
      description: |
        Envia um documento do comprador, do vendedor ou da loja em Base64 (até 10 MiB decodificado; PDF, JPG/JPEG ou PNG).
        Aceito quando a etapa ativa do participante for `ENVIO_DOCUMENTOS` (6) com a proposta aprovada, ou
        `CORRECAO_DOCUMENTOS` (7) para reenviar um tipo atualmente recusado (`INVALIDO`). O header `Idempotency-Key` é obrigatório.

      security:
        - bearerAuth: []
      parameters:
        - $ref: "#/components/parameters/ProposalId"
        - name: Idempotency-Key
          in: header
          required: true
          description: Chave única por envio (1 a 200 caracteres). Com a mesma chave e o mesmo conteúdo, um envio bem-sucedido nas últimas 24 horas não é processado de novo.
          schema:
            type: string
            example: doc-7f3c2a10-comprador-cnh
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: ['participante', 'tipoDocumento', 'nomeArquivo', 'conteudoBase64']
              additionalProperties: false
              properties:
                participante:
                  type: string
                  description: Participante dono do documento.
                  enum: ['COMPRADOR', 'VENDEDOR', 'LOJA']
                  example: COMPRADOR
                tipoDocumento:
                  type: integer
                  format: int32
                  description: |
                    Código do tipo de documento. Tipos aceitos por participante:
                      - COMPRADOR: 1, 4, 5, 6, 7, 9, 57
                      - VENDEDOR: 1, 2, 3, 5, 6, 7, 8, 9, 11
                      - LOJA: 6, 8

                    Códigos: 1 = CNH, 2 = CPF, 3 = RG, 4 = Comprovante de renda, 5 = Comprovante de residência,
                    6 = Documento do veículo, 7 = CNH digital, 8 = Laudo ECV, 9 = Laudo de vistoria, 11 = Cartão CNPJ, 57 = ATPV.
                  example: 1
                nomeArquivo:
                  type: string
                  maxLength: 255
                  description: Nome do arquivo com extensão `.pdf`, `.jpg`, `.jpeg` ou `.png`, sem caminho. A extensão precisa corresponder ao conteúdo real do arquivo.
                  example: cnh-comprador.pdf
                conteudoBase64:
                  type: string
                  description: Conteúdo do arquivo em Base64 puro (sem prefixo `data:`), até 10 MiB depois de decodificado.
                  example: JVBERi0xLjcKJcOkw7zDtsOfCjIgMCBvYmoK...
      responses:
        '204':
          description: Documento recebido. A resposta não tem corpo.
          content:
            text/plain:
              schema:
                type: string
                description: Resposta sem corpo
              example: No Content
        '400':
          description: Erro na requisição
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '403':
          $ref: "#/components/responses/IntegrationInactive"
        '404':
          description: Proposta não encontrada para este parceiro
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '422':
          description: Regra não atendida — `Document.InvalidProposalStage`, `Document.NotPendingCorrection`, `Document.InvalidContent`, `Document.InvalidProposalModality` ou `Proposal.Access.NotIntegrationV2`
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '409':
          description: Idempotency-Key reutilizada com outro conteúdo (`Idempotency.KeyConflict`)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
        '502':
          description: Falha ao armazenar o documento (`Document.UploadFailed`). Repita com a mesma Idempotency-Key.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProblemDetails"
components:
  responses:
    IntegrationInactive:
      description: Integração do parceiro inativa ou não encontrada (`Integration.Access.Inactive`, `Integration.Access.OrganizationNotFound`)
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetails"
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      description: |
        Chave opcional (1 a 200 caracteres) para repetir a requisição com segurança. Reenviar a mesma chave com o mesmo
        conteúdo devolve o resultado original sem duplicar o registro; reutilizá-la com outro conteúdo retorna erro.
      schema:
        type: string
        maxLength: 200
        example: 6f1c9a2e-3b7d-4e2a-9c51-0d8f3a7b2e10
    ProposalId:
      name: propostaId
      in: path
      required: true
      description: Identificador único da proposta (UUID) retornado na criação da proposta
      schema:
        type: string
        format: uuid
        example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
    WebhookId:
      name: webhookId
      in: path
      required: true
      description: Identificador único do webhook (UUID) retornado no cadastro
      schema:
        type: string
        format: uuid
        example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
  schemas:
    SimplifySimulationListResponse:
      type: object
      properties:
        simulacoes:
          type: array
          description: Uma simulação por prazo disponível
          items:
            type: object
            properties:
              id_simulacao:
                type: string
                format: uuid
                description: Identificador da simulação (use em `simulacaoId` ao criar a proposta)
                example: 123e4567-e89b-12d3-a456-426614174000
              valor_solicitado:
                type: number
                format: double
                example: 40000
              prazo:
                type: integer
                format: int32
                description: Prazo em meses
                example: 36
              valor_parcela:
                type: number
                format: double
                example: 2042.42
              valor_tac:
                type: number
                format: double
                example: 1500
              valor_boleto:
                type: number
                format: double
                example: 3.5
              valor_seguro:
                type: number
                format: double
                example: 0
              valor_iof:
                type: number
                format: double
                example: 872
              percentual_iof:
                type: number
                format: double
                example: 1.92
              valor_credito_total:
                type: number
                format: double
                example: 42722
              valor_divida_total:
                type: number
                format: double
                example: 73527.12
              percentual_cet_mensal:
                type: number
                format: double
                example: 3.62
              percentual_cet_anual:
                type: number
                format: double
                example: 53.25
              percentual_juros_mensal:
                type: number
                format: double
                example: 3.29
              percentual_juros_anual:
                type: number
                format: double
                example: 47.53
              valor_retencao_diaria_aproximado:
                type: number
                format: double
                description: Valor aproximado de retenção diária. Omitido quando não se aplica.
    ProposalV2Response:
      type: object
      description: Retrato atual da proposta
      properties:
        id_proposta:
          type: string
          format: uuid
          example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        numero:
          type: integer
          format: int64
          description: Número único da proposta
          example: 171020250001
        id_simulacao:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        enum_status:
          type: integer
          format: int32
          description: Código do status da proposta (veja "Etapas e status")
          example: 2
        status:
          type: string
          description: Nome do status da proposta
          enum: ['EM_ANALISE', 'APROVADA', 'RECUSADA', 'CANCELADA', 'ANALISE_MANUAL', 'FINALIZADA', 'EM_NEGOCIACAO', 'EXPIRADA', 'PENDENTE']
          example: APROVADA
        tipo:
          type: string
          description: Modalidade da proposta
          enum: ['Financing', 'Refinancing']
          example: Refinancing
        data_criacao:
          type: string
          format: date-time
          example: 2026-10-12T14:05:08.984-03:00
        motivo_recusa:
          type: string
          nullable: true
          description: Motivo da recusa, quando houver. Omitido quando vazio.
          example: Restrição cadastral
        link_biometria:
          type: string
          nullable: true
          description: Link para o cliente realizar a biometria, quando disponível. Omitido quando vazio.
          example: https://onboarding.exemplo.com/sessao/abc123
        comprador:
          $ref: "#/components/schemas/ProposalV2Participant"
        vendedor:
          $ref: "#/components/schemas/ProposalV2Participant"
        loja:
          $ref: "#/components/schemas/ProposalV2Store"
    ProposalV2Participant:
      type: object
      properties:
        cpf:
          type: string
          example: "12345678909"
        enum_biometria:
          type: integer
          format: int32
          description: Código da situação da biometria
          example: 3
        biometria:
          type: string
          enum: ['NAO_INICIADA', 'SESSAO_CRIADA', 'EM_ANALISE', 'APROVADA', 'REPROVADA']
          example: APROVADA
        status_ativo:
          $ref: "#/components/schemas/ProposalV2ActiveStep"
        etapas_concluidas:
          type: array
          items:
            $ref: "#/components/schemas/ProposalV2CompletedStep"
        documentos:
          type: array
          items:
            $ref: "#/components/schemas/ProposalV2Document"
    ProposalV2Store:
      type: object
      description: Etapas da loja de integração. Presente quando a proposta foi feita em loja.
      properties:
        cnpj:
          type: string
          example: "11222333000181"
        status_ativo:
          $ref: "#/components/schemas/ProposalV2ActiveStep"
        etapas_concluidas:
          type: array
          items:
            $ref: "#/components/schemas/ProposalV2CompletedStep"
        documentos:
          type: array
          items:
            $ref: "#/components/schemas/ProposalV2Document"
    ProposalV2ActiveStep:
      type: object
      description: Etapa em que o participante está agora, a situação dela e quem precisa agir
      properties:
        enum_etapa:
          type: integer
          format: int32
          example: 6
        etapa:
          type: string
          enum: ['INDEFINIDO', 'PROPOSTA_CRIADA', 'PROPOSTA_APROVADA', 'NOTIFICACAO_VENDEDOR', 'ANALISE_BIOMETRIA', 'CONTA_RECEBIMENTO', 'ENVIO_DOCUMENTOS', 'CORRECAO_DOCUMENTOS', 'DADOS_VEICULO', 'VISTORIA', 'ASSINATURA', 'PAGAMENTO', 'PROPOSTA_FINALIZADA']
          example: ENVIO_DOCUMENTOS
        enum_situacao:
          type: integer
          format: int32
          example: 1
        situacao:
          type: string
          enum: ['AGUARDANDO_ENVIO', 'AGUARDANDO_CLIENTE', 'EM_PROCESSAMENTO', 'PENDENTE_CORRECAO', 'BLOQUEADA', 'CONCLUIDA', 'CANCELADA']
          example: AGUARDANDO_ENVIO
        enum_responsavel_acao:
          type: integer
          format: int32
          example: 2
        responsavel_acao:
          type: string
          enum: ['NENHUM', 'CLIENTE', 'INTEGRADOR', 'CREDICARRO']
          example: INTEGRADOR
    ProposalV2CompletedStep:
      type: object
      properties:
        enum_etapa:
          type: integer
          format: int32
          example: 4
        etapa:
          type: string
          example: ANALISE_BIOMETRIA
        data:
          type: string
          format: date-time
          description: Data da última passagem pela etapa
          example: 2026-10-12T14:20:00-03:00
    ProposalV2Document:
      type: object
      properties:
        enum_tipo:
          type: integer
          format: int32
          example: 1
        tipo:
          type: string
          example: CNH
        enum_status:
          type: integer
          format: int32
          description: Código do status do documento. `5` (`PENDENTE`) indica documento exigido ainda não enviado
          example: 2
        status:
          type: string
          enum: ['RECEBIDO', 'VALIDO', 'INVALIDO', 'EM_ANALISE', 'EXCLUIDO', 'PENDENTE']
          example: INVALIDO
        motivo:
          type: string
          nullable: true
          description: Motivo da recusa do documento. Omitido quando vazio
          example: Documento ilegível
    WebhookResponse:
      type: object
      properties:
        id_webhook:
          type: string
          format: uuid
          example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        tipo:
          type: string
          example: Proposal
        url:
          type: string
          example: https://parceiro.com.br/webhooks/credicarro
        tipo_autenticacao:
          type: string
          example: Basic
        status:
          type: string
          example: Active
    SimulationResponse:
      type: object
      description: Os dados da sua simulação
      properties:
        id_simulacao:
          type: string
          format: uuid
          description: Identificador único da simulação
          example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        prazo:
          type: integer
          format: int64
          description: Prazo da simulação
          example: 24
        valor_parcela:
          type: number
          format: double
          description: Valor da parcela
          example: 2356
        valor_solicitado:
          type: number
          format: double
          description: Valor solicitado
          example: 37908
        valor_entrada:
          type: number
          format: double
          description: Valor de entrada
          example: 9786
        valor_bem:
          type: number
          format: double
          description: Valor do bem
          example: 47694
        valor_tac:
          type: number
          format: double
          description: Valor da taxa de cadastro
          example: 1500
        taxa_juros_negociada:
          type: number
          format: double
          description: Valor da taxa de juros
          example: 2.79
        valor_registro:
          type: number
          format: double
          description: Valor do registro
          example: 487
        uf:
          type: string
          maxLength: 2
          description: Estado da simulação
          example: "SP"
        tipo:
          type: string
          description: Tipo da proposta utilizada
          enum: ['Financing', 'Refinancing', 'AmountSimulation']
          example: Refinancing
        transacao:
          $ref: "#/components/schemas/Transaction"
        juros:
          $ref: "#/components/schemas/Interest"
        cet:
          $ref: "#/components/schemas/Cet"
        iof:
          $ref: "#/components/schemas/Iof"
        veiculo:
          $ref: "#/components/schemas/Vehicle"
        cliente:
          $ref: "#/components/schemas/Customer"
        data_criacao:
          type: string
          format: date-time
          example: 2025-10-17T19:05:08.984Z
          description: Data de criaçao da simulação
      additionalProperties: false
    Customer:
      type: object
      properties:
        cpf:
          type: string
          description: Documento de identificação do comprador
          example: 123.456.789-01
      additionalProperties: false
    Vehicle:
      type: object
      properties:
        marca:
          type: string
          description: Marca do Veículo
          example: "Honda"
        modelo:
          type: string
          description: Modelo do Veículo
          example: "Civic"
        versao:
          type: string
          description: Versão do Veículo
          example: "Turing"
        ano:
          type: integer
          format: int32
          nullable: true
          description: Ano do Veículo
          example: 2024
        valor:
          type: number
          format: double
          nullable: true
          description: Valor do Veículo
          example: 124654
        placa:
          type: string
          description: Placa do Veículo
          example: "MWO-3910"
        veiculo_zero_km:
          type: boolean
          nullable: true
          description: Indicador se veículo é 0KM
          example: false
        chassi:
          type: string
          description: Chassi do Veículo
          example: "1Y5Ye4U8kydsr4828"
        renavam:
          type: string
          description: Renavam do Veículo
          example: "70502561697"
        cor:
          type: string
          description: Cor do Veículo
          example: "Prata"
      additionalProperties: false
    Iof:
      type: object
      properties:
        valor:
          type: number
          format: double
          description: Valor de IOF
          example: 872
        percentual:
          type: number
          format: double
          description: Percentual de IOF
          example: 1.92
      additionalProperties: false
    Cet:
      type: object
      properties:
        percentual_mensal:
          type: number
          format: double
          description: Percentual mensal
          example: 3.62
        percentual_anual:
          type: number
          format: double
          description: Percentual anual
          example: 43.44
      additionalProperties: false
    Transaction:
      type: object
      properties:
        valor_total_credito:
          type: number
          format: double
          description: Valor total do credito
          example: 78495
        valor_total_debito:
          type: number
          format: double
          description: Valor total do debito
          example: 78495
      additionalProperties: false
    Interest:
      type: object
      properties:
        percentual_juros_mensal:
          type: number
          format: double
          description: Percentual de juros mensal
          example: 3.29
        percentual_juros_anual:
          type: number
          format: double
          description: Percentual de juros anual
          example: 39.48
      additionalProperties: false
    authenticationResponse:
      type: object
      properties:
        token_de_acesso:
          type: string
          description: Token de acesso para autenticação nas requisições
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
        tipo_de_token:
          type: string
          description: Tipo do token de acesso
          example: Bearer
        expira_em_segundos:
          type: integer
          format: int32
          description: Tempo em segundos para expiração do token
          example: 3600
        expira_em:
          type: string
          format: date-time
          description: Data e hora (UTC) até quando reaproveitar o token. Já vem com 60 segundos de margem antes da expiração real.
          example: 2025-10-22T12:57:21.948+00:00
        escopo:
          type: string
          description: Escopo do token de acesso
          example: credicarro.integration.access/full
      additionalProperties: false
    ProposalResponse:
      type: object
      description: Os dados da sua proposta
      properties:
        id_proposta:
          type: string
          format: uuid
          description: Identificador único da proposta
          example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        numero:
          type: integer
          format: int64
          description: Número único da proposta
          example: 171020250001
        id_simulacao:
          type: string
          format: uuid
          description: Identificador único da simulação
          example: bea8d060-f93d-48eb-b6c4-45f64483cdd9
        tipo:
          type: string
          description: Tipo da proposta utilizada
          enum: ['Financing', 'Refinancing']
          example: Financing
        status:
          type: string
          description: Status atual da proposta
          enum: ['Analysing', 'Approved', 'Refused', 'Canceled', 'ManualAnalysis', 'Completed', 'InNegotiation', 'Expired', 'Pending']
          example: Approved
        comprador:
          $ref: "#/components/schemas/Buyer"
        vendedor:
          description: Omitido quando a proposta não tem vendedor
          allOf:
            - $ref: "#/components/schemas/Seller"
        data_criacao:
          type: string
          format: date-time
          example: 2025-10-17T19:05:08.984Z
          description: Data de criaçao da proposta
      additionalProperties: false
    Buyer:
      type: object
      properties:
        cpf:
          type: string
          description: Documento de identificação do comprador
          example: 123.456.789-01
      additionalProperties: false
    Seller:
      type: object
      properties:
        cpf:
          type: string
          description: Documento de identificação do vendedor
          example: 123.456.789-01
      additionalProperties: false
    Page:
      type: object
      properties:
        tem_proximo:
          type: boolean
          description: Identificador se existe uma próxima página
          example: true
        tem_anterior:
          type: boolean
          description: Identificador se existe uma página anterior
          example: false
        numero:
          type: integer
          format: int32
          description: Página atual.
          example: 2
        tamanho:
          type: integer
          format: int32
          description: Quantidade de dados por página
          example: 15
        total:
          type: integer
          format: int64
          description: Total de dados encontrados
          example: 45
      additionalProperties: false
    ProblemDetails:
      type: object
      properties:
        tipo:
          type: string
          description: Tipo de problema encontrado
          example: Validation.Cpf.Invalid
        titulo:
          type: string
          description: Título do erro
          example: Requisição inválida
        status:
          type: integer
          format: int32
          description: Status Code do erro
          example: 400
        detalhe:
          type: string
          description: Descrição do erro
          example: O CPF informado em 'cpf' é inválido.
        campo:
          type: string
          nullable: true
          description: Campo da requisição relacionado ao erro, quando houver
          example: cpf
        erros:
          type: array
          description: Lista de erros. Presente só quando o JSON enviado está malformado ou tem um valor de tipo errado.
          items:
            type: object
            properties:
              codigo:
                type: string
                description: Código estável do erro
                example: Validation.InvalidFormat
              mensagem:
                type: string
                description: Mensagem em português
                example: O valor informado para 'valorVeiculo' não é um número válido.
              campo:
                type: string
                nullable: true
                description: Campo inválido, quando houver
                example: cpf
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Cabeçalho de autenticação Bearer no formato `Bearer <token>` onde `<token>` é seu TOKEN de autenticação
