openapi: 3.0.1
info:
  title: WebIntegration
  description: Este documento descreve os endpoints disponíveis da API.
  version: "1.0"
servers:
  - url: https://api.parcelemais.com.br/integration
    description: Servidor para o ambiente de produção
  - url: https://api.staging.parcelemais.com.br/integration
    description: Servidor para o ambiente de staging
paths:
  /v1/order/simulate-installments:
    get:
      operationId: listSimulateInstallments
      tags:
        - Pedido
      summary: Simular parcelas.
      description: Retorna as opções de parcelamento disponíveis para o valor informado. O parceiro e a rede de lojas são identificados automaticamente pelo token de acesso.
      parameters:
        - name: valorSolicitado
          in: query
          description: Valor de referência para a simulação. Deve ser igual ou superior a R$ 250,00. O significado depende de `tipoValorCalculo`.
          required: true
          schema:
            type: number
            format: double
            minimum: 250
          example: 1500.00
        - name: tipoValorCalculo
          in: query
          description: |
            Define o valor de referência do cálculo:
            - `1` — A partir do valor da venda. `valorSolicitado` representa o valor bruto da venda.
            - `2` — A partir do valor líquido. `valorSolicitado` representa o valor líquido que o estabelecimento deseja receber.

            Opcional. Quando omitido, o padrão é `1` (valor bruto).
          required: false
          schema:
            type: integer
            format: int32
            enum: [1, 2]
            default: 1
          example: 1
      responses:
        "200":
          description: Opções de parcelamento calculadas com sucesso.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Integration.Shared.Responses.Order.ListSimulateInstallmentsSimplifiedIntegrationResponse"
              example:
                - valorTotalDebito: 1632.48
                  prazo: 12
                  valorParcela: 136.04
        "400":
          description: Parâmetros inválidos.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "404":
          description: Parceiro, estabelecimento ou rede de lojas não encontrado.
        "500":
          description: Internal Server Error
  /v1/order/simulate-values:
    get:
      operationId: getSimulationValues
      tags:
        - Pedido
      summary: Simular repasse.
      description: Calcula os valores da venda para o estabelecimento e para o cliente. O parceiro e a rede de lojas são identificados automaticamente pelo token de acesso.
      parameters:
        - name: valor
          in: query
          description: Valor de referência da simulação. O significado depende de `tipoValorCalculo`.
          required: true
          schema:
            type: number
            format: double
          example: 1500.00
        - name: prazo
          in: query
          description: |
            Quantidade de parcelas da simulação. Deve estar dentro do intervalo de prazos configurado para a rede de lojas do parceiro.
            Fora desse intervalo, a API retorna `400` com o erro `Order.TermOutOfRange`.
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
          example: 12
        - name: modeloJuros
          in: query
          description: |
            Define quem paga os juros. Por enquanto, use apenas `1`.
            - `1` — Cliente (disponível).
            - `2` — Estabelecimento (em breve; ainda não disponível).
          required: true
          schema:
            type: integer
            format: int32
            enum: [1]
          example: 1
        - name: tipoValorCalculo
          in: query
          description: |
            Define o valor de referência do cálculo:
            - `1` — A partir do valor da venda. `valor` representa o valor bruto da venda.
            - `2` — A partir do valor líquido. `valor` representa o valor líquido que o estabelecimento deseja receber.
          required: true
          schema:
            type: integer
            format: int32
            enum: [1, 2]
          example: 1
      responses:
        "200":
          description: Valores calculados com sucesso.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Integration.Shared.Responses.Order.SimulationValuesIntegrationResponse"
              example:
                valoresEstabelecimento:
                  valorVenda: 7054.673721340388
                  valorDesembolso: 5959.26
                valoresCliente:
                  valorParcela: 718.46
        "400":
          description: Parâmetros inválidos.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "404":
          description: Parceiro, estabelecimento ou rede de lojas não encontrado.
        "500":
          description: Internal Server Error
  /v1/order/start-cdc-sale:
    post:
      operationId: startCdcSale
      tags:
        - Pedido
      summary: Iniciar venda CDC.
      description: Inicia o processo de venda de um pedido CDC.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WebIntegration.Endpoints.Order.Requests.StartCDCSaleContest"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Payment.Shared.Responses.LinkPaymentResponse"
              example:
                linkPagamento: "https://pagamento.parcelemais.com.br/checkout/3c90c3cc-0d44-4b50-8888-8dd25736052a"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "409":
          description: Conflito de `Idempotency-Key` — a chave já foi usada com um corpo de requisição diferente, ou uma requisição com a mesma chave ainda está em processamento.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/order:
    post:
      operationId: createOrder
      tags:
        - Pedido
      summary: Criar pedido.
      description: Cria um novo pedido CDC com os dados do cliente e as informações da venda.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WebIntegration.Endpoints.Order.Requests.CreateOrderRequestContent"
            example:
              cpf: "12345678901"
              celular: "+55 (11) 91234-5678"
              documentoEstabelecimento: "12345678000195"
              valorSolicitado: 1500.00
              nome: "João da Silva"
              email: "joao.silva@email.com"
              dataDeNascimento: "1990-05-15T00:00:00Z"
              endereco:
                logradouro: "Av. Paulista"
                numero: "1578"
                complemento: "Bloco B, Apto 1203"
                bairro: "Bela Vista"
                cidade: "São Paulo"
                estado: "SP"
                cep: "01311000"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Customer.Shared.Responses.IdentifierResponse"
              example:
                pedidoId: "3c90c3cc-0d44-4b50-8888-8dd25736052a"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "409":
          description: Conflito de `Idempotency-Key` — a chave já foi usada com um corpo de requisição diferente, ou uma requisição com a mesma chave ainda está em processamento.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/order/invoice:
    post:
      operationId: importOrderInvoice
      tags:
        - Pedido
      summary: Importar nota fiscal.
      description: Importa a nota fiscal de um pedido CDC a partir de um arquivo em base64.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WebIntegration.Endpoints.Order.Requests.ImportOrderInvoiceFromBase64Content"
            example:
              pedidoId: "00000000-0000-0000-0000-000000000000"
              arquivoBase64: "JVBERi0xLjQKJeLjz9MKMSAwIG9iago..."
              nomeArquivo: "nota-fiscal.pdf"
      responses:
        "204":
          description: Nota fiscal importada com sucesso.
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "409":
          description: Conflito de `Idempotency-Key` — a chave já foi usada com um corpo de requisição diferente, ou uma requisição com a mesma chave ainda está em processamento.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/authentication/accesstoken:
    post:
      operationId: generateAccessToken
      tags:
        - Autenticação
      summary: Gerar token de acesso.
      description: Gera um token de acesso (access_token) para o parceiro utilizando as credenciais do cliente (client_id e client_secret).
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WebIntegration.Endpoints.Authentication.Requests.GenerateAccessTokenRequest"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Common.Services.Cognito.AccessTokenResult"
              example:
                token_de_acesso: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
                expira_em_segundos: 3600
                expira_em: "2025-01-15T11:30:00-03:00"
                tipo_de_token: "Bearer"
                escopo: "parcelemais.integration.access/full"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/order/{pedidoId}:
    get:
      operationId: getOrder
      tags:
        - Pedido
      summary: Obter pedido.
      description: Retorna os detalhes de um pedido pelo identificador.
      parameters:
        - name: pedidoId
          in: path
          description: Identificador único do pedido.
          required: true
          schema:
            type: string
            format: uuid
            example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
          example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Integration.Shared.Responses.Order.OrderIntegrationResponse"
              example:
                id: "3c90c3cc-0d44-4b50-8888-8dd25736052a"
                numero: 1001
                status:
                  valor: 2
                  descricao: "Aprovado"
                total: 1500.00
                nomeCliente: "João da Silva"
                documentoCliente: "12345678901"
                prazo: 12
                razaoSocialEstabelecimento: "Loja Exemplo LTDA"
                documentoEstabelecimento: "12345678000195"
                descricao: "Compra de eletrônicos"
                valorAprovado: 1500.00
                desembolsado: true
                criadoEm: "2025-01-15T10:30:00-03:00"
                desembolsadoEm: "2025-01-16T09:00:00-03:00"
                valorSolicitado: 1500.00
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/order/paged:
    get:
      operationId: pagedOrders
      tags:
        - Pedido
      summary: Listar pedidos.
      description: Retorna uma lista paginada de pedidos do parceiro com filtros opcionais.
      parameters:
        - name: status
          in: query
          description: |
            Filtrar por status do pedido. Campo opcional.

            Valores possíveis:
            - 0 - Indefinido
            - 1 - Em análise
            - 2 - Aprovado
            - 3 - Saldo indisponível
            - 4 - Análise expirada
            - 5 - Pagamento pendente
            - 6 - Biometria recusada
            - 7 - Biometria aprovada
            - 8 - Pagamento recusado
            - 9 - Comprado
            - 10 - Não autorizado
            - 11 - Autorização pendente
            - 12 - Aguardando cadastro
            - 13 - Venda não iniciada
            - 14 - Cancelado
            - 15 - Faturamento
            - 16 - Concluído
            - 17 - Congelado
            - 18 - Confirmação de pagamento pendente
          schema:
            type: integer
            format: int32
        - name: documentoCliente
          in: query
          description: CPF do cliente. Campo opcional. Aceita com ou sem máscara (ex. `123.456.789-01` ou `12345678901`).
          schema:
            type: string
            example: "12345678901"
          example: "12345678901"
        - name: dataInicio
          in: query
          description: Data de início do filtro no formato ISO-8601. Campo opcional.
          schema:
            type: string
            format: date-time
            example: "2025-01-01T00:00:00-03:00"
          example: "2025-01-01T00:00:00-03:00"
        - name: dataFim
          in: query
          description: Data de fim do filtro no formato ISO-8601. Campo opcional.
          schema:
            type: string
            format: date-time
            example: "2025-12-31T23:59:59-03:00"
          example: "2025-12-31T23:59:59-03:00"
        - name: numero
          in: query
          description: Número do pedido. Campo opcional.
          schema:
            type: integer
            format: int64
            example: 1001
          example: 1001
        - name: documentoLoja
          in: query
          description: CNPJ do estabelecimento. Campo opcional. Aceita com ou sem máscara (ex. `12.345.678/0001-95` ou `12345678000195`).
          schema:
            type: string
            example: "12345678000195"
          example: "12345678000195"
        - name: descricao
          in: query
          description: Filtrar por descrição do pedido. Campo opcional.
          schema:
            type: string
        - name: pagina
          in: query
          description: "Número da página. Padrão: 1."
          schema:
            type: integer
            format: int32
            example: 1
          example: 1
        - name: tamanhoPagina
          in: query
          description: "Quantidade de itens por página. Padrão: 10."
          schema:
            type: integer
            format: int32
            example: 10
          example: 10
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Core.Domain.Primitives.IPagedResult_OrderIntegrationResponse"
              example:
                itens:
                  - id: "3c90c3cc-0d44-4b50-8888-8dd25736052a"
                    numero: 1001
                    status:
                      valor: 2
                      descricao: "Aprovado"
                    total: 1500.00
                    nomeCliente: "João da Silva"
                    documentoCliente: "12345678901"
                    prazo: 12
                    razaoSocialEstabelecimento: "Loja Exemplo LTDA"
                    documentoEstabelecimento: "12345678000195"
                    descricao: "Compra de eletrônicos"
                    valorAprovado: 1500.00
                    desembolsado: true
                    criadoEm: "2025-01-15T10:30:00-03:00"
                    desembolsadoEm: "2025-01-16T09:00:00-03:00"
                    valorSolicitado: 1500.00
                pagina:
                  tem_proximo: true
                  tem_anterior: false
                  numero: 2
                  tamanho: 15
                  total: 45
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/customer/{clienteId}:
    get:
      operationId: getCustomer
      tags:
        - Cliente
      summary: Obter cliente.
      description: Retorna os detalhes de um cliente pelo identificador.
      parameters:
        - name: clienteId
          in: path
          description: Identificador único do cliente.
          required: true
          schema:
            type: string
            format: uuid
            example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
          example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Integration.Shared.Responses.Customer.CustomerIntegrationResponse"
              example:
                id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
                nome: "Maria Souza"
                documento: "98765432100"
                endereco:
                  rua: "Av. Paulista"
                  cidade: "São Paulo"
                  estado: "SP"
                  bairro: "Bela Vista"
                  cep: "01310-100"
                  pais: "BR"
                  numero: "1578"
                  complemento: "Apto 42"
                dataDeNascimento: "1990-03-22T00:00:00Z"
                email: "maria.souza@email.com"
                celular: "+55 (11) 91234-5678"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/customer/paged:
    get:
      operationId: pagedCustomers
      tags:
        - Cliente
      summary: Listar clientes.
      description: Retorna uma lista paginada de clientes vinculados ao parceiro com filtros opcionais.
      parameters:
        - name: nome
          in: query
          description: Filtrar por nome do cliente. Campo opcional.
          schema:
            type: string
            example: "Maria Souza"
          example: "Maria Souza"
        - name: documento
          in: query
          description: Filtrar por CPF do cliente. Campo opcional. Aceita com ou sem máscara (ex. `123.456.789-01` ou `12345678901`).
          schema:
            type: string
            example: "12345678901"
          example: "12345678901"
        - name: pagina
          in: query
          description: "Número da página. Padrão: 1."
          schema:
            type: integer
            format: int32
            example: 1
          example: 1
        - name: tamanhoPagina
          in: query
          description: "Quantidade de itens por página. Padrão: 10."
          schema:
            type: integer
            format: int32
            example: 10
          example: 10
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Core.Domain.Primitives.IPagedResult_CustomerIntegrationResponse"
              example:
                itens:
                  - id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
                    nome: "Maria Souza"
                    documento: "98765432100"
                    endereco:
                      rua: "Av. Paulista"
                      cidade: "São Paulo"
                      estado: "SP"
                      bairro: "Bela Vista"
                      cep: "01310-100"
                      pais: "BR"
                      numero: "1578"
                      complemento: "Apto 42"
                    dataDeNascimento: "1990-03-22T00:00:00Z"
                    email: "maria.souza@email.com"
                    celular: "+55 (11) 91234-5678"
                pagina:
                  tem_proximo: true
                  tem_anterior: false
                  numero: 2
                  tamanho: 15
                  total: 45
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "500":
          description: Internal Server Error
  /v1/webhooks:
    post:
      operationId: createWebHook
      tags:
        - Webhook
      summary: Criar webhook.
      description: Cadastra um webhook para o parceiro identificado automaticamente pelo token de acesso. Cliente e Simulação podem ser configurados, mas seus fluxos de envio ainda estão em roadmap. Atualmente, os disparos estão disponíveis para Pedido.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWebHookRequest"
            example:
              tipo: 3
              url: "https://parceiro.exemplo.com/webhooks/pedidos"
              tipoAutenticacao: 3
              credencial: "seu-token-jwt"
      responses:
        "200":
          description: Webhook criado com sucesso.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateWebHookResponse"
              example:
                chaveAssinatura: "3f2e1a9c8b7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f"
        "400":
          description: Dados inválidos.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Microsoft.AspNetCore.Mvc.ProblemDetails"
        "404":
          description: Parceiro não encontrado.
        "409":
          description: Já existe um webhook cadastrado para o tipo informado.
        "500":
          description: Internal Server Error
    get:
      operationId: listWebHooks
      tags:
        - Webhook
      summary: Listar webhooks.
      description: |
        Retorna os webhooks cadastrados pelo parceiro, como uma lista simples (sem paginação — um parceiro tem no máximo 3 webhooks, um por tipo: Cliente, Simulação, Pedido). As credenciais de autenticação nunca são retornadas. Configurações de Cliente e Simulação podem aparecer na lista, embora esses fluxos ainda não realizem disparos.
      responses:
        "200":
          description: Webhooks retornados com sucesso.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WebHookIntegrationResponse"
              example:
                - tipo: 3
                  url: "https://parceiro.exemplo.com/webhooks/pedidos"
                  tipoAutenticacao: 3
        "404":
          description: Parceiro não encontrado.
        "500":
          description: Internal Server Error
  /v1/webhooks/{tipo}:
    put:
      operationId: updateWebHook
      tags:
        - Webhook
      summary: Editar webhook.
      description: Atualiza o webhook do tipo informado. Se a credencial for omitida, a credencial atual será preservada. Cliente e Simulação podem ser configurados, mas seus fluxos de envio ainda estão em roadmap.
      parameters:
        - $ref: "#/components/parameters/WebHookType"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateWebHookRequest"
            example:
              url: "https://parceiro.exemplo.com/webhooks/pedidos"
              tipoAutenticacao: 2
              credencial: "usuario:senha"
      responses:
        "200":
          description: Webhook atualizado com sucesso.
        "400":
          description: Dados inválidos.
        "404":
          description: Parceiro ou webhook não encontrado.
        "500":
          description: Internal Server Error
    delete:
      operationId: deleteWebHook
      tags:
        - Webhook
      summary: Excluir webhook.
      description: Exclui o webhook do tipo informado para o parceiro identificado pelo token.
      parameters:
        - $ref: "#/components/parameters/WebHookType"
      responses:
        "200":
          description: Webhook excluído com sucesso.
        "400":
          description: Tipo de webhook inválido.
        "404":
          description: Parceiro ou webhook não encontrado.
        "500":
          description: Internal Server Error
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      description: |
        Chave de idempotência para requisições de criação/alteração (`POST`). Recomendada para `/v1/order`, `/v1/order/invoice` e `/v1/order/start-cdc-sale`.

        Use um identificador único por tentativa lógica de operação (ex.: um UUID gerado pelo seu sistema antes de chamar a API). Reenviar a mesma chave com o mesmo corpo de requisição, dentro de 24 horas, retorna a resposta original em vez de repetir a operação — útil para reintentar com segurança após timeout ou erro de rede.

        Reenviar a mesma chave com um corpo de requisição diferente retorna `409 Conflict`. Uma segunda requisição com a mesma chave enquanto a primeira ainda está em processamento também retorna `409 Conflict`.
      schema:
        type: string
        format: uuid
      example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    CorrelationId:
      name: CorrelationId
      in: header
      required: false
      description: |
        Identificador de correlação da requisição, usado para rastreamento em logs e suporte. Se não for enviado, a API gera um novo automaticamente.

        O valor é sempre devolvido no cabeçalho de resposta `CorrelationId` e também no campo `correlationId` do corpo, em respostas de erro (`ProblemDetails`).
      schema:
        type: string
      example: "0HN7E4B8Q9K3D:00000001"
    WebHookType:
      name: tipo
      in: path
      required: true
      description: |
        Tipo do webhook:
        - `1` — Cliente: configuração disponível; fluxo de envio em roadmap.
        - `2` — Simulação: configuração disponível; fluxo de envio em roadmap.
        - `3` — Pedido: envio disponível para os eventos suportados.
      schema:
        type: integer
        format: int32
        enum: [1, 2, 3]
  schemas:
    CreateWebHookRequest:
      required: [tipo, url, tipoAutenticacao]
      type: object
      properties:
        tipo:
          type: integer
          format: int32
          enum: [1, 2, 3]
          description: "1: Cliente (fluxo em roadmap); 2: Simulação (fluxo em roadmap); 3: Pedido (envio disponível)."
        url:
          type: string
          format: uri
          description: URL HTTP ou HTTPS que receberá as notificações.
        tipoAutenticacao:
          type: integer
          format: int32
          enum: [1, 2, 3]
          description: "1: Nenhuma; 2: Basic; 3: JWT."
        credencial:
          type: string
          nullable: true
          description: Obrigatória para Basic e JWT. Não deve ser enviada quando não houver autenticação.
      additionalProperties: false
    UpdateWebHookRequest:
      required: [url, tipoAutenticacao]
      type: object
      properties:
        url:
          type: string
          format: uri
          description: URL HTTP ou HTTPS que receberá as notificações.
        tipoAutenticacao:
          type: integer
          format: int32
          enum: [1, 2, 3]
          description: "1: Nenhuma; 2: Basic; 3: JWT."
        credencial:
          type: string
          nullable: true
          description: Quando omitida, mantém a credencial atual. É removida quando o tipo de autenticação é Nenhuma.
      additionalProperties: false
    CreateWebHookResponse:
      type: object
      properties:
        chaveAssinatura:
          type: string
          description: |
            Chave secreta usada para assinar (HMAC-SHA256) as notificações enviadas a este webhook. É exibida apenas nesta resposta — guarde-a com segurança, pois não é possível consultá-la novamente.

            Consulte [Webhooks → Verificando a assinatura](/pages/webhooks#verificando-a-assinatura) para o algoritmo de verificação.
      additionalProperties: false
    WebHookIntegrationResponse:
      type: object
      properties:
        tipo:
          type: integer
          format: int32
          enum: [1, 2, 3]
          description: "1: Cliente (fluxo em roadmap); 2: Simulação (fluxo em roadmap); 3: Pedido (envio disponível)."
        url:
          type: string
          format: uri
        tipoAutenticacao:
          type: integer
          format: int32
          enum: [1, 2, 3]
          description: "1: Nenhuma; 2: Basic; 3: JWT."
      additionalProperties: false
    Integration.Shared.Responses.Order.ListSimulateInstallmentsSimplifiedIntegrationResponse:
      type: object
      properties:
        valorTotalDebito:
          type: number
          format: double
          description: Valor total que será pago pelo cliente.
        prazo:
          type: integer
          format: int32
          description: Quantidade de parcelas.
        valorParcela:
          type: number
          format: double
          description: Valor de cada parcela.
      additionalProperties: false
    Integration.Shared.Responses.Order.EstablishmentSimulationValuesIntegrationResponse:
      type: object
      properties:
        valorVenda:
          type: number
          format: double
          description: Valor bruto da venda calculado na simulação.
        valorDesembolso:
          type: number
          format: double
          description: Valor líquido que será desembolsado ao estabelecimento.
      additionalProperties: false
    Integration.Shared.Responses.Order.CustomerSimulationValuesIntegrationResponse:
      type: object
      properties:
        valorParcela:
          type: number
          format: double
          description: Valor de cada parcela que será paga pelo cliente.
      additionalProperties: false
    Integration.Shared.Responses.Order.SimulationValuesIntegrationResponse:
      type: object
      properties:
        valoresEstabelecimento:
          $ref: "#/components/schemas/Integration.Shared.Responses.Order.EstablishmentSimulationValuesIntegrationResponse"
        valoresCliente:
          $ref: "#/components/schemas/Integration.Shared.Responses.Order.CustomerSimulationValuesIntegrationResponse"
      additionalProperties: false
    Common.Services.Cognito.AccessTokenResult:
      type: object
      properties:
        token_de_acesso:
          type: string
        expira_em_segundos:
          type: integer
          format: int32
        expira_em:
          type: string
          format: date-time
          readOnly: true
        tipo_de_token:
          type: string
        escopo:
          type: string
      additionalProperties: false
    Core.Domain.Primitives.IPagedResult_CustomerIntegrationResponse:
      type: object
      properties:
        itens:
          type: array
          items:
            $ref: "#/components/schemas/Integration.Shared.Responses.Customer.CustomerIntegrationResponse"
          readOnly: true
        pagina:
          $ref: "#/components/schemas/Core.Domain.Primitives.Pagina"
      additionalProperties: false
    Core.Domain.Primitives.IPagedResult_OrderIntegrationResponse:
      type: object
      properties:
        itens:
          type: array
          items:
            $ref: "#/components/schemas/Integration.Shared.Responses.Order.OrderIntegrationResponse"
          readOnly: true
        pagina:
          $ref: "#/components/schemas/Core.Domain.Primitives.Pagina"
      additionalProperties: false
    Core.Domain.Primitives.Pagina:
      type: object
      properties:
        tem_proximo:
          type: boolean
        tem_anterior:
          type: boolean
        numero:
          type: integer
          format: int32
        tamanho:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
      additionalProperties: false
    Customer.Shared.Responses.IdentifierResponse:
      type: object
      properties:
        pedidoId:
          type: string
          format: uuid
      additionalProperties: false
    Integration.Shared.Responses.Customer.Address:
      type: object
      properties:
        rua:
          type: string
          nullable: true
        cidade:
          type: string
          nullable: true
        estado:
          type: string
          nullable: true
        bairro:
          type: string
          nullable: true
        cep:
          type: string
          nullable: true
        pais:
          type: string
          nullable: true
        numero:
          type: string
          nullable: true
        complemento:
          type: string
          nullable: true
      additionalProperties: false
    Integration.Shared.Responses.Customer.CustomerIntegrationResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
        nome:
          type: string
        documento:
          type: string
        endereco:
          $ref: "#/components/schemas/Integration.Shared.Responses.Customer.Address"
        dataDeNascimento:
          type: string
          format: date-time
        email:
          type: string
          nullable: true
        celular:
          type: string
          nullable: true
      additionalProperties: false
    Integration.Shared.Responses.Order.OrderStatus:
      type: object
      description: |
        Status do pedido. Consulte os valores enviados em [Webhooks → Status enviados pelo webhook](/pages/webhooks#status-enviados-pelo-webhook).
      properties:
        valor:
          type: integer
          format: int32
        descricao:
          type: string
      additionalProperties: false
    Integration.Shared.Responses.Order.OrderIntegrationResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
        numero:
          type: integer
          format: int64
        status:
          $ref: "#/components/schemas/Integration.Shared.Responses.Order.OrderStatus"
        total:
          type: number
          format: double
          nullable: true
        nomeCliente:
          type: string
          nullable: true
        documentoCliente:
          type: string
        prazo:
          type: integer
          format: int32
          nullable: true
        razaoSocialEstabelecimento:
          type: string
        documentoEstabelecimento:
          type: string
        descricao:
          type: string
          nullable: true
        valorAprovado:
          type: number
          format: double
          nullable: true
        desembolsado:
          type: boolean
          nullable: true
        criadoEm:
          type: string
          format: date-time
        desembolsadoEm:
          type: string
          format: date-time
          nullable: true
        valorSolicitado:
          type: number
          format: double
          nullable: true
      additionalProperties: false
    Microsoft.AspNetCore.Mvc.ProblemDetails:
      type: object
      properties:
        tipo:
          type: string
          nullable: true
        titulo:
          type: string
          nullable: true
        status:
          type: integer
          format: int32
          nullable: true
        detalhe:
          type: string
          nullable: true
        instancia:
          type: string
          nullable: true
        erros:
          type: object
          nullable: true
          description: Detalhamento por campo, presente quando o erro é de validação de payload. Ausente (`null`) para erros de regra de negócio, que trazem a explicação apenas em `detalhe`.
          additionalProperties:
            type: array
            items:
              type: string
        correlationId:
          type: string
          nullable: true
          description: Identificador de correlação da requisição (ver cabeçalho `CorrelationId`), útil para localizar logs ao abrir um chamado de suporte.
      example:
        tipo: "https://tools.ietf.org/html/rfc7231#section-6.5.1"
        titulo: "Requisição inválida."
        status: 400
        detalhe: "O campo 'cpf' é obrigatório."
        instancia: "/v1/order"
        erros:
          cpf: ["O campo 'cpf' é obrigatório."]
        correlationId: "0HN7E4B8Q9K3D:00000001"
    Payment.Shared.Responses.LinkPaymentResponse:
      type: object
      properties:
        linkPagamento:
          type: string
          nullable: true
      additionalProperties: false
    WebIntegration.Endpoints.Authentication.Requests.GenerateAccessTokenRequest:
      required:
        - clientId
        - clientSecret
      type: object
      properties:
        clientId:
          minLength: 1
          type: string
        clientSecret:
          minLength: 1
          type: string
      additionalProperties: false
    WebIntegration.Endpoints.Order.Requests.AddressRequestContent:
      required:
        - logradouro
        - cidade
        - estado
        - bairro
        - cep
        - numero
      type: object
      properties:
        logradouro:
          minLength: 1
          type: string
          example: "Av. Paulista"
        cidade:
          minLength: 1
          type: string
          example: "São Paulo"
        estado:
          minLength: 2
          maxLength: 2
          type: string
          description: "Sigla da UF (ex.: SP, RJ, MG)."
          example: "SP"
        bairro:
          minLength: 1
          type: string
          example: "Bela Vista"
        cep:
          minLength: 1
          type: string
          description: CEP com 8 dígitos. Aceita com ou sem máscara (ex. `01311-000` ou `01311000`).
          example: "01311000"
        numero:
          minLength: 1
          type: string
          example: "1578"
        complemento:
          type: string
          nullable: true
          example: "Bloco B, Apto 1203"
      additionalProperties: false
    WebIntegration.Endpoints.Order.Requests.ImportOrderInvoiceFromBase64Content:
      required:
        - pedidoId
        - arquivoBase64
        - nomeArquivo
      type: object
      properties:
        pedidoId:
          type: string
          format: uuid
          description: Identificador do pedido.
          example: "00000000-0000-0000-0000-000000000000"
        arquivoBase64:
          minLength: 1
          type: string
          description: Conteúdo do arquivo da nota fiscal codificado em base64.
          example: "JVBERi0xLjQKJeLjz9MKMSAwIG9iago..."
        nomeArquivo:
          minLength: 1
          type: string
          description: "Nome do arquivo com extensão (ex: nota-fiscal.pdf)."
          example: "nota-fiscal.pdf"
      additionalProperties: false
    WebIntegration.Endpoints.Order.Requests.StartCDCSaleContest:
      required:
        - pedidoId
      type: object
      properties:
        pedidoId:
          type: string
          format: uuid
      additionalProperties: false
    WebIntegration.Endpoints.Order.Requests.CreateOrderRequestContent:
      required:
        - celular
        - cpf
        - dataDeNascimento
        - documentoEstabelecimento
        - email
        - endereco
        - nome
        - valorSolicitado
      type: object
      properties:
        cpf:
          minLength: 1
          type: string
          description: CPF válido do cliente. Aceita com ou sem máscara (ex. `123.456.789-01` ou `12345678901`).
          example: "12345678901"
        celular:
          minLength: 1
          type: string
          description: Telefone celular do cliente, com código do país. Aceita com ou sem máscara (ex. `+55 (11) 91234-5678` ou `+5511912345678`).
          example: "+55 (11) 91234-5678"
        documentoEstabelecimento:
          minLength: 1
          type: string
          description: CNPJ válido do estabelecimento. Aceita com ou sem máscara (ex. `12.345.678/0001-95` ou `12345678000195`).
          example: "12345678000195"
        valorSolicitado:
          type: number
          format: double
          description: Valor bruto da venda.
          example: 1500.00
        nome:
          minLength: 1
          type: string
          example: "João da Silva"
        email:
          minLength: 1
          type: string
          example: "joao.silva@email.com"
        dataDeNascimento:
          type: string
          format: date-time
          example: "2023-11-07T05:31:56Z"
        endereco:
          $ref: "#/components/schemas/WebIntegration.Endpoints.Order.Requests.AddressRequestContent"
      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
security:
  - bearerAuth: []
