> ## Documentation Index
> Fetch the complete documentation index at: https://docs.extat.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Paga uma fatura de cartão de crédito, total ou parcialmente.

> O pagamento é por LISTA de lançamentos: envie em installment_ids os `installment_id` que GET /credit-card-invoices/{id} devolve em entries[], e o valor é derivado deles no servidor (não há campo amount). Lista ausente ou vazia paga a fatura inteira. Os lançamentos pagos ganham data de pagamento — a movimentação vinculada de cada parcela passa a "pago". Os lançamentos NÃO selecionados são realocados para a fatura seguinte, com o vencimento da movimentação acertado para o dela; nunca viram despesa nova e nunca alteram o DRE. include_previous_balance=false deixa o saldo anterior rolar de novo para a fatura seguinte (RN5). Envie idempotency_key para tornar retries seguros: replay da mesma chave devolve o pagamento original com 200, sem debitar a conta de novo.



## OpenAPI

````yaml /openapi/extat-openapi.json post /companies/credit-card-invoices/{id}/pay
openapi: 3.0.0
info:
  contact:
    email: contato@cernedigital.io
    name: Cerne Digital
    url: https://cernedigital.io
  description: >-
    API REST da Extat Plataforma usada pelo painel web. Artefato OpenAPI 3.0
    para a documentação Mintlify (tags em PT-BR).
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  termsOfService: http://swagger.io/terms/
  title: Extat Plataforma - API REST
  version: '1.0'
servers:
  - url: https://golang-api-vgnqx.ondigitalocean.app/v1
security: []
tags:
  - name: Autenticação
  - name: Bancos
  - name: Contas Bancárias
  - name: Plano e Assinaturas
  - name: Empresa
  - name: Centros de Custo
  - name: Painel
  - name: Demonstrativos
  - name: Saúde
  - name: Convites
  - name: Membros
  - name: Onboarding
  - name: Fornecedores
  - name: Usuário
paths:
  /companies/credit-card-invoices/{id}/pay:
    post:
      tags:
        - Empresa
      summary: Paga uma fatura de cartão de crédito, total ou parcialmente.
      description: >-
        O pagamento é por LISTA de lançamentos: envie em installment_ids os
        `installment_id` que GET /credit-card-invoices/{id} devolve em
        entries[], e o valor é derivado deles no servidor (não há campo amount).
        Lista ausente ou vazia paga a fatura inteira. Os lançamentos pagos
        ganham data de pagamento — a movimentação vinculada de cada parcela
        passa a "pago". Os lançamentos NÃO selecionados são realocados para a
        fatura seguinte, com o vencimento da movimentação acertado para o dela;
        nunca viram despesa nova e nunca alteram o DRE.
        include_previous_balance=false deixa o saldo anterior rolar de novo para
        a fatura seguinte (RN5). Envie idempotency_key para tornar retries
        seguros: replay da mesma chave devolve o pagamento original com 200, sem
        debitar a conta de novo.
      parameters:
        - description: company uuid
          in: header
          name: x-company-id
          required: true
          schema:
            type: string
        - description: Invoice ID
          in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/credit_card.PayInvoiceRequestDTO'
        description: Payment data
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/credit_card.PayInvoiceResponseDTO'
          description: replay idempotente — nenhum dinheiro se moveu nesta chamada
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/credit_card.PayInvoiceResponseDTO'
          description: pagamento registrado
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: >-
            corpo malformado, x-company-id inválido, bank_account_id inválido,
            ou installment_id malformado
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: fatura ou conta bancária não encontrada (CC-6)
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: fatura já paga
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: >-
            conta bancária inativa, cartão inativo, lançamento que não pertence
            à fatura, ou seleção sem valor a pagar
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: Internal Server Error
      security:
        - ApiKeyAuth: []
components:
  schemas:
    credit_card.PayInvoiceRequestDTO:
      properties:
        bank_account_id:
          type: string
        idempotency_key:
          description: |-
            IdempotencyKey é opcional — sem ela, duplo clique registra dois
            pagamentos parciais legítimos e indistinguíveis (plan.md).
          type: string
        include_previous_balance:
          description: >-
            IncludePreviousBalance decide se o saldo anterior (o remanescente
            que

            rolou de uma fatura passada) entra neste pagamento. Ausente ⇒ true.


            Ponteiro para distinguir "não enviado" de "false" — a diferença
            entre

            pagar a fatura inteira e deixar o saldo anterior rolar de novo.
          type: boolean
        installment_ids:
          description: >-
            InstallmentIDs é a lista de lançamentos da fatura que este pagamento

            liquida — os `installment_id` que GET /credit-card-invoices/{id}
            devolve

            em `entries[]` (plan-parcelamento.md §3.2, item 13 da lista de
            testes).


            AUSENTE ou VAZIA ⇒ a fatura inteira. É o caso comum e o
            comportamento

            de antes desta mudança.


            ── Por que a lista substituiu `amount`
            ─────────────────────────────────


            O valor agora é DERIVADO da seleção, no servidor: soma das parcelas

            escolhidas mais, se incluído, o saldo anterior. Com isso somem de
            vez o

            "valor não bate com a fatura" e a pergunta que o modelo antigo não
            sabia

            responder — QUAIS lançamentos esse dinheiro pagou. É o que permite

            baixar as movimentações vinculadas (item 11).


            Seleção por LANÇAMENTO e não por movimentação: parcela de dívida
            legada

            não tem `transaction_id` e ainda assim precisa ser pagável.
          items:
            type: string
          type: array
        payment_date:
          type: string
      required:
        - bank_account_id
        - payment_date
      type: object
    credit_card.PayInvoiceResponseDTO:
      properties:
        bank_account_balance:
          type: number
        invoice:
          $ref: '#/components/schemas/credit_card.InvoiceSummaryResponseDTO'
        moved_amount:
          type: number
        moved_installment_ids:
          description: >-
            MovedInstallmentIDs são os lançamentos NÃO selecionados, realocados
            para

            NextInvoice com o vencimento da movimentação acertado para o dela.
            Vazio

            quando a fatura foi paga inteira.
          items:
            type: string
          type: array
        next_invoice:
          allOf:
            - $ref: '#/components/schemas/credit_card.InvoiceSummaryResponseDTO'
          description: >-
            NextInvoice é a fatura que recebeu a rolagem — nil quando o
            pagamento

            quitou a fatura sem sobra.
        partial:
          type: boolean
        payment:
          $ref: '#/components/schemas/credit_card.CreditCardInvoicePaymentResponseDTO'
        replayed:
          type: boolean
        rolled_amount:
          type: number
        settled_amount:
          type: number
        settled_installment_ids:
          description: >-
            SettledInstallmentIDs são os lançamentos que ESTE pagamento liquidou
            —

            os mesmos ids que o cliente enviou em installment_ids, ou todos os
            da

            fatura quando a lista veio vazia. A movimentação vinculada a cada um

            passou a "pago".
          items:
            type: string
          type: array
      type: object
    handler.ErrorResponseDTO:
      properties:
        error:
          type: string
        message:
          type: string
      type: object
    credit_card.InvoiceSummaryResponseDTO:
      properties:
        credit_card_account_id:
          type: string
        due_date:
          type: string
        id:
          type: string
        paid_at:
          type: string
        period_end:
          type: string
        period_start:
          type: string
        previous_balance:
          type: number
        reference_month:
          type: string
      type: object
    credit_card.CreditCardInvoicePaymentResponseDTO:
      properties:
        amount:
          type: string
        amount_value:
          type: number
        bank_account_id:
          type: string
        created_at:
          type: string
        credit_card_invoice_id:
          type: string
        id:
          type: string
        idempotency_key:
          type: string
        payment_date:
          type: string
        reversal_reason:
          type: string
        reversed_at:
          description: ReversedAt/ReversalReason só aparecem preenchidos depois do RN6.
          type: string
        rolled_amount:
          type: number
        rolled_to_invoice_id:
          type: string
      type: object
  securitySchemes:
    ApiKeyAuth:
      description: >-
        Token da sessão no cabeçalho Authorization, no formato Bearer (mesmo
        esquema ApiKeyAuth do contrato).
      in: header
      name: Authorization
      type: apiKey

````