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

# Calcula a revisão de RMC/RCC (cartão consignado)

> Revisa contratos de RMC (Reserva de Margem Consignável) / RCC (Reserva de Cartão de Crédito). O input é uma **union discriminada** por `refund_total`, com dois fluxos e dois formatos de resposta:

- **`refund_total: false`** (diferenças): converte o empréstimo, apura as diferenças por parcela e o refinanciamento. Exige **pelo menos uma** parcela com `amount > 0`; caso contrário a resposta é `422`.
- **`refund_total: true`** (restituição total): devolve tudo que foi pago (opcionalmente em dobro via `double_refund`); contrato e juros são opcionais.

O índice de correção (`correction_differences_index_id`) usa o `id` de `/indices-correcao` (ou `null`).



## OpenAPI

````yaml /openapi/legado.json post /api/calculadoras/rmc
openapi: 3.0.0
info:
  title: Calculadoras Jusfy API
  description: >-
    Rotas sem versão (`/api/...`). Continuam funcionando, mas a versão atual

    da API é a v1 (`/api/v1`): para integrações novas, use a v1 e siga o [guia
    de
    migração](https://api.jusfy.dev/calculators/api/reference/fundamentos/migracao-do-legado).


    A política de versionamento e depreciação está na [política de
    versionamento](https://api.jusfy.dev/calculators/api/reference/fundamentos/migracao-do-legado#pol%C3%ADtica-de-versionamento).
  version: legacy
  contact: {}
servers:
  - url: https://api.jusfy.dev/calculators
security: []
tags:
  - name: Calculadoras
    description: >-
      Execução das calculadoras jurídicas e consulta dos índices de correção.
      Cada cálculo recebe um payload, retorna o resultado processado e exige API
      key no header `x-api-key`.
  - name: Consultas
    description: >-
      Consultas de dados (veículos, condutores e documentos). Cada consulta
      recebe o documento, retorna os dados encontrados e exige API key no header
      `x-api-key`. A maioria responde na mesma requisição; o **rastreamento
      veicular** e o **buscador processual** são assíncronos — devolvem `202`
      com um protocolo e entregam o resultado por webhook e/ou pelo `GET` do
      protocolo.
  - name: JusScore
    description: >-
      Consulta de processos judiciais por CPF/CNPJ, com score de risco
      consolidado e a lista detalhada dos processos. É assíncrona: o POST inicia
      a consulta e o GET devolve o resultado quando pronto. Exige API key no
      header `x-api-key`.
  - name: Consumo
    description: >-
      Consumo da própria API key: quantas chamadas cada produto recebeu num
      período, separando as cobradas das não cobradas. Não exige escopo; exige
      API key no header `x-api-key`.
  - name: Health
    description: >-
      Verificações de disponibilidade do serviço (liveness e readiness). Rotas
      abertas, sem autenticação.
paths:
  /api/calculadoras/rmc:
    post:
      tags:
        - Calculadoras
      summary: Calcula a revisão de RMC/RCC (cartão consignado)
      description: >-
        Revisa contratos de RMC (Reserva de Margem Consignável) / RCC (Reserva
        de Cartão de Crédito). O input é uma **union discriminada** por
        `refund_total`, com dois fluxos e dois formatos de resposta:


        - **`refund_total: false`** (diferenças): converte o empréstimo, apura
        as diferenças por parcela e o refinanciamento. Exige **pelo menos uma**
        parcela com `amount > 0`; caso contrário a resposta é `422`.

        - **`refund_total: true`** (restituição total): devolve tudo que foi
        pago (opcionalmente em dobro via `double_refund`); contrato e juros são
        opcionais.


        O índice de correção (`correction_differences_index_id`) usa o `id` de
        `/indices-correcao` (ou `null`).
      operationId: CalculatorsController_rmc[0]
      parameters: []
      requestBody:
        required: true
        description: Payload da calculadora de RMC/RCC (uma das duas variantes).
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  description: >-
                    Fluxo de **diferenças** (`refund_total: false`): revisão do
                    contrato — converte o empréstimo, apura as diferenças por
                    parcela e o refinanciamento. Exige pelo menos uma parcela
                    com `amount > 0`.
                  required:
                    - refund_total
                    - contract
                    - double_refund
                    - not_apply_negative_differences
                    - installments
                    - correction_differences_index_id
                  properties:
                    refund_total:
                      type: boolean
                      enum:
                        - false
                      description: Discriminador — `false` para o fluxo de diferenças.
                    contract:
                      type: object
                      description: Dados do contrato de RMC/RCC.
                      required:
                        - date
                        - amount_lending
                      properties:
                        date:
                          type: string
                          description: Data do contrato, formato `YYYY-MM-DD`.
                        amount_lending:
                          type: number
                          description: Valor emprestado (positivo).
                        number:
                          type: string
                          description: Número do contrato. Opcional.
                        financial_institution:
                          type: object
                          description: Instituição financeira do contrato. Opcional.
                          required:
                            - id
                            - name
                          properties:
                            id:
                              type: number
                              description: Identificador (inteiro positivo).
                            name:
                              type: string
                              description: Nome (mínimo 2 caracteres).
                    double_refund:
                      type: boolean
                      description: Restituir em dobro as diferenças.
                    not_apply_negative_differences:
                      type: boolean
                      description: Não aplicar diferenças negativas (a favor do banco).
                    installments:
                      type: array
                      description: Parcelas pagas (pelo menos uma com `amount > 0`).
                      items:
                        type: object
                        description: Parcela paga do contrato de RMC/RCC.
                        required:
                          - id
                          - date
                          - amount
                        properties:
                          id:
                            type: number
                            description: Identificador da parcela (inteiro positivo).
                          date:
                            type: string
                            description: Competência da parcela, formato `YYYY-MM-DD`.
                          amount:
                            type: number
                            description: Valor pago na parcela.
                    correction_differences_index_id:
                      type: number
                      nullable: true
                      description: >-
                        Índice de correção das diferenças (`id` de
                        `/indices-correcao`) ou `null`.
                    interest_differences:
                      type: number
                      description: Taxa de juros aplicada às diferenças (`>= 0`). Opcional.
                    own_average_interest:
                      type: boolean
                      nullable: true
                      description: >-
                        Usar o juros médio informado em `average_interest`.
                        Opcional.
                    average_interest:
                      type: number
                      nullable: true
                      description: Juros médio de mercado. Opcional.
                - type: object
                  description: >-
                    Fluxo de **restituição total** (`refund_total: true`):
                    devolução de tudo que foi pago (opcionalmente em dobro).
                    Contrato e juros são opcionais.
                  required:
                    - refund_total
                    - double_refund
                    - installments
                    - correction_differences_index_id
                  properties:
                    refund_total:
                      type: boolean
                      enum:
                        - true
                      description: >-
                        Discriminador — `true` para o fluxo de restituição
                        total.
                    contract:
                      type: object
                      description: Dados do contrato. Opcional neste fluxo.
                      properties:
                        date:
                          type: string
                          description: Data do contrato, formato `YYYY-MM-DD`. Opcional.
                        amount_lending:
                          type: number
                          description: Valor emprestado (`>= 0`). Opcional.
                        number:
                          type: string
                          description: Número do contrato. Opcional.
                        financial_institution:
                          type: object
                          description: Instituição financeira do contrato. Opcional.
                          required:
                            - id
                            - name
                          properties:
                            id:
                              type: number
                              description: Identificador (inteiro positivo).
                            name:
                              type: string
                              description: Nome (mínimo 2 caracteres).
                    double_refund:
                      type: boolean
                      description: Restituir em dobro.
                    not_apply_negative_differences:
                      type: boolean
                      description: Não aplicar diferenças negativas. Opcional neste fluxo.
                    installments:
                      type: array
                      description: Parcelas pagas (pelo menos uma).
                      items:
                        type: object
                        description: Parcela paga do contrato de RMC/RCC.
                        required:
                          - id
                          - date
                          - amount
                        properties:
                          id:
                            type: number
                            description: Identificador da parcela (inteiro positivo).
                          date:
                            type: string
                            description: Competência da parcela, formato `YYYY-MM-DD`.
                          amount:
                            type: number
                            description: Valor pago na parcela.
                    correction_differences_index_id:
                      type: number
                      nullable: true
                      description: >-
                        Índice de correção (`id` de `/indices-correcao`) ou
                        `null`.
                    interest_differences:
                      type: number
                      description: Taxa de juros das diferenças. Opcional.
                    own_average_interest:
                      type: boolean
                      nullable: true
                      description: Usar juros médio próprio. Opcional neste fluxo.
                    average_interest:
                      type: number
                      nullable: true
                      description: Juros médio de mercado. Opcional neste fluxo.
            examples:
              diferencas:
                summary: 'Fluxo de diferenças (refund_total: false)'
                value:
                  refund_total: false
                  contract:
                    date: '2020-01-01'
                    amount_lending: 1000
                  double_refund: false
                  not_apply_negative_differences: false
                  installments:
                    - id: 1
                      date: '2020-02-01'
                      amount: 200
                    - id: 2
                      date: '2020-03-01'
                      amount: 200
                    - id: 3
                      date: '2020-04-01'
                      amount: 200
                  correction_differences_index_id: null
                  own_average_interest: true
                  average_interest: 2
              restituicao_total:
                summary: 'Fluxo de restituição total (refund_total: true)'
                value:
                  refund_total: true
                  double_refund: false
                  installments:
                    - id: 1
                      date: '2020-02-01'
                      amount: 100
                    - id: 2
                      date: '2020-03-01'
                      amount: 100
                    - id: 3
                      date: '2020-04-01'
                      amount: 100
                  correction_differences_index_id: null
      responses:
        '200':
          description: >-
            Resultado da revisão. O formato depende de `refund_total`:
            diferenças (empréstimo convertido, diferenças por parcela e
            refinanciamento) ou restituição total (valor a restituir e parcelas
            de devolução). O exemplo ilustra o fluxo de diferenças.
          content:
            application/json:
              schema:
                type: object
                example:
                  statusCode: 200
                  message: Cálculo concluído com sucesso
                  timestamp: '2026-06-22T18:00:00.000Z'
                  path: /api/calculadoras/rmc
                  result:
                    converted_loan:
                      amount: 1000
                      bacen_rate: 2
                      installments_quantity: 6
                      total_payable: 1064.54
                    refund_amount: -464.54
                    refinance_loan:
                      quantity: 2
                      value: 449.13
                      total_payable: 462.64
                      installment_value: 231.32
                    difference_installments:
                      - dueDate: '2020-02-01'
                        paymentDate: '2020-02-01'
                        contractAmount: 200
                        paidAmount: 200
                        differenceAmount: 0
                        differenceAdjustedAmount: 0
                        interests: 0
                        number: 1
                        adjustedPercentage: 0
                        total: 0
                      - dueDate: '2020-05-01'
                        paymentDate: null
                        contractAmount: 200
                        paidAmount: 0
                        differenceAmount: -200
                        differenceAdjustedAmount: -200
                        interests: 0
                        number: 4
                        adjustedPercentage: 0
                        total: -200
                      - dueDate: '2020-07-01'
                        paymentDate: null
                        contractAmount: 64.54
                        paidAmount: 0
                        differenceAmount: -64.54
                        differenceAdjustedAmount: -64.54
                        interests: 0
                        number: 6
                        adjustedPercentage: 0
                        total: -64.54
                    total_difference: -464.54
        '401':
          description: >-
            API key ausente ou que não pertence a nenhum cliente (`code:
            invalid_api_key`). A `message` diz qual dos dois.
          content:
            application/json:
              examples:
                missing:
                  summary: Key ausente
                  value:
                    statusCode: 401
                    message: Missing API key
                    code: invalid_api_key
                    requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                    timestamp: '2026-10-14T18:00:00.000Z'
                    path: /api/calculadoras/trabalhista
                invalid:
                  summary: Key inválida
                  value:
                    statusCode: 401
                    message: Invalid API key
                    code: invalid_api_key
                    requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                    timestamp: '2026-10-14T18:00:00.000Z'
                    path: /api/calculadoras/trabalhista
        '403':
          description: >-
            Acesso negado. Dois motivos, distinguidos pelo `code`: o cliente não
            está ativo (`inactive_client`), ou a API key não tem o escopo deste
            produto (`insufficient_scope`, com o escopo na `message`). A
            liberação de produtos é feita pela equipe Jusfy.
          content:
            application/json:
              examples:
                inactive_client:
                  summary: Cliente não ativo
                  value:
                    statusCode: 403
                    message: Client is not active
                    code: inactive_client
                    requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                    timestamp: '2026-10-14T18:00:00.000Z'
                    path: /api/calculadoras/trabalhista
                insufficient_scope:
                  summary: Sem o escopo do produto
                  value:
                    statusCode: 403
                    message: 'Missing scope: <escopo>'
                    code: insufficient_scope
                    requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                    timestamp: '2026-10-14T18:00:00.000Z'
                    path: /api/calculadoras/trabalhista
        '422':
          description: Payload inválido. `message` indica o campo e o motivo.
          content:
            application/json:
              schema:
                example:
                  statusCode: 422
                  code: payload_rejected
                  message: 'Expected number, received null (property: fine)'
                  requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                  timestamp: '2026-06-22T18:00:00.000Z'
                  path: /api/calculadoras/rmc
        '429':
          description: >-
            Limite de requisições por minuto do cliente neste produto excedido.
            `Retry-After` diz em quantos segundos a janela vira. Toda resposta
            traz `X-RateLimit-Limit`, `X-RateLimit-Remaining` e
            `X-RateLimit-Reset`.
          content:
            application/json:
              schema:
                example:
                  statusCode: 429
                  code: rate_limit_exceeded
                  message: >-
                    Rate limit exceeded for calculadoras.trabalhista:execute: 60
                    requests per minute. Retry in 42s.
                  requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                  timestamp: '2026-06-22T18:00:00.000Z'
                  path: /api/calculadoras/trabalhista
        '502':
          description: Erro no motor de cálculo da Jusfy.
          content:
            application/json:
              schema:
                example:
                  statusCode: 502
                  code: upstream_error
                  message: Calculation backend error
                  requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                  timestamp: '2026-06-22T18:00:00.000Z'
                  path: /api/calculadoras/rmc
        '504':
          description: Tempo limite ao falar com o motor de cálculo.
          content:
            application/json:
              schema:
                example:
                  statusCode: 504
                  code: upstream_timeout
                  message: Calculation backend timed out
                  requestId: 9f1c2b7e-4d3a-4f8b-a6e2-1c0d9e8f7a65
                  timestamp: '2026-06-22T18:00:00.000Z'
                  path: /api/calculadoras/rmc
      security:
        - api-key: []
components:
  securitySchemes:
    api-key:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.