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

# Informa o desfecho de pagamento por mês das análises de crédito do programa de desfecho

> O programa de desfecho do flow com análise de crédito: você informa, por mês, se o crédito foi liberado, o maior atraso, a baixa a prejuízo e a quitação antecipada, e a análise vira rótulo do modelo de decisão de crédito da SUA organização (nunca de outro cliente). Só vale para análise vigente feita com o programa ligado no flow, nos 24 meses a partir do mês da análise (calendário de Brasília). Sem CPF, nome ou documento: a chave é o par analysis_id e period. Exige uma chave secreta criada COM o escopo credit:outcomes:write (chaves sem restrição não o têm) e com lista de IPs permitidos. Até 1000 itens por chamada. Tudo ou nada: um item com erro recusa o envio com 422 credit_outcomes_invalid e a lista de erros por item, e nada é gravado. Idempotente pelo par analysis_id e period, sem Idempotency-Key: repetir é seguro, o mesmo valor volta unchanged e um valor novo corrige o mês. Não cobra.



## OpenAPI

````yaml /api-reference/openapi.json post /credit-outcomes
openapi: 3.1.0
info:
  title: UNIFOKAL API
  version: v1
  summary: >-
    Verificação de identidade: sessão criada no servidor, jornada no widget,
    resultado no webhook.
  description: >-
    A versão vive no caminho (/v1); não existe header de versão. Adição
    compatível (campo, módulo ou chave nova) NÃO sobe a versão: ignore o que não
    conhecer. Todo erro tem a forma { error, message }: o código é estável, a
    mensagem não. Ids são prefixo + ULID. Webhooks são assinados (HMAC SHA-256
    no header X-IDSAAS-Signature, janela de 300s; o segredo é SEU, mínimo 32
    caracteres) e o header x-idsaas-event carrega o tipo do evento.
  termsOfService: https://unifokal.com/termos
  contact:
    name: UNIFOKAL
    url: https://docs.unifokal.com/
servers:
  - url: https://api.unifokal.com/v1
security: []
externalDocs:
  description: >-
    Documentação completa em https://docs.unifokal.com/. Briefing para agentes
    de IA em https://unifokal.com/llms.txt.
  url: https://docs.unifokal.com/
paths:
  /credit-outcomes:
    post:
      summary: >-
        Informa o desfecho de pagamento por mês das análises de crédito do
        programa de desfecho
      description: >-
        O programa de desfecho do flow com análise de crédito: você informa, por
        mês, se o crédito foi liberado, o maior atraso, a baixa a prejuízo e a
        quitação antecipada, e a análise vira rótulo do modelo de decisão de
        crédito da SUA organização (nunca de outro cliente). Só vale para
        análise vigente feita com o programa ligado no flow, nos 24 meses a
        partir do mês da análise (calendário de Brasília). Sem CPF, nome ou
        documento: a chave é o par analysis_id e period. Exige uma chave secreta
        criada COM o escopo credit:outcomes:write (chaves sem restrição não o
        têm) e com lista de IPs permitidos. Até 1000 itens por chamada. Tudo ou
        nada: um item com erro recusa o envio com 422 credit_outcomes_invalid e
        a lista de erros por item, e nada é gravado. Idempotente pelo par
        analysis_id e period, sem Idempotency-Key: repetir é seguro, o mesmo
        valor volta unchanged e um valor novo corrige o mês. Não cobra.
      operationId: recordCreditOutcomes
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordCreditOutcomesRequest'
      responses:
        '200':
          description: 'Nenhum par novo: todos atualizados ou iguais.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecordCreditOutcomesResponse'
        '201':
          description: Ao menos um par novo gravado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecordCreditOutcomesResponse'
        '400':
          description: >-
            Códigos estáveis: invalid_json, validation_error. Ramifique pelo
            campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_json
                          - validation_error
        '401':
          description: >-
            Códigos estáveis: invalid_api_key. Ramifique pelo campo error, nunca
            pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_api_key
        '403':
          description: >-
            Códigos estáveis: credential_type_not_allowed,
            organization_suspended, test_key_used_in_production,
            insufficient_scope, ip_not_allowed,
            credit_outcomes_requires_ip_allowlist. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - credential_type_not_allowed
                          - organization_suspended
                          - test_key_used_in_production
                          - insufficient_scope
                          - ip_not_allowed
                          - credit_outcomes_requires_ip_allowlist
        '413':
          description: >-
            Códigos estáveis: payload_too_large. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - payload_too_large
        '422':
          description: >-
            Códigos estáveis: credit_outcomes_invalid (com errors por item),
            credit_outcome_program_authorized_institution. Ramifique pelo campo
            error, nunca pela mensagem.
          content:
            application/json:
              schema:
                oneOf:
                  - allOf:
                      - $ref: '#/components/schemas/CreditOutcomesInvalidError'
                      - properties:
                          error:
                            enum:
                              - credit_outcomes_invalid
                  - allOf:
                      - $ref: '#/components/schemas/ErrorEnvelope'
                      - properties:
                          error:
                            enum:
                              - credit_outcome_program_authorized_institution
        '429':
          description: >-
            Códigos estáveis: rate_limited. Ramifique pelo campo error, nunca
            pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - rate_limited
      security:
        - secretKey: []
components:
  schemas:
    RecordCreditOutcomesRequest:
      type: object
      additionalProperties: false
      required:
        - outcomes
      properties:
        outcomes:
          type: array
          minItems: 1
          maxItems: 1000
          description: >-
            Um item por análise e mês. Campo fora da lista é recusado na linha
            (nunca envie CPF, nome ou documento).
          items:
            type: object
            additionalProperties: false
            required:
              - analysis_id
              - period
            properties:
              analysis_id:
                type: string
                pattern: ^cda_[0-9A-HJKMNP-TV-Z]{26}$
                description: O analysis_id (cda_) que o check credit_decision entregou.
              period:
                type: string
                pattern: ^[0-9]{4}-(0[1-9]|1[0-2])$
                description: >-
                  O mês observado, AAAA-MM, no calendário de Brasília: um mês
                  nos 24 meses a partir do mês da análise, já começado e não
                  posterior ao da quitação antecipada.
              released:
                type: boolean
                default: true
                description: >-
                  O crédito foi liberado. Com false, o mês não tem atraso, baixa
                  nem quitação.
              max_days_past_due:
                type: integer
                minimum: 0
                maximum: 9999
                description: >-
                  O maior atraso do mês, em dias (0 sem atraso). Obrigatório com
                  released true.
              written_off:
                type: boolean
                default: false
                description: Baixa a prejuízo no mês.
              prepaid:
                type: boolean
                default: false
                description: Quitação antecipada no mês.
    RecordCreditOutcomesResponse:
      type: object
      required:
        - received
        - created
        - updated
        - unchanged
        - items
      properties:
        received:
          type: integer
        created:
          type: integer
        updated:
          type: integer
          description: Pares que já existiam com outro valor (a correção vale).
        unchanged:
          type: integer
          description: 'Pares reenviados com o mesmo valor: nada mudou.'
        items:
          type: array
          items:
            type: object
            required:
              - position
              - analysis_id
              - period
              - status
            properties:
              position:
                type: integer
                description: O índice do item no corpo, a partir de 0.
              analysis_id:
                type: string
                pattern: ^cda_[0-9A-HJKMNP-TV-Z]{26}$
              period:
                type: string
              status:
                type: string
                enum:
                  - created
                  - updated
                  - unchanged
    ErrorEnvelope:
      type: object
      description: >-
        Todo erro da API tem exatamente esta forma. O campo error é um código
        estável (contrato); message é texto livre e pode mudar sem aviso.
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Código estável do erro. Ramifique por ele.
        message:
          type: string
          description: Texto explicativo. NÃO é contrato.
      additionalProperties: false
    CreditOutcomesInvalidError:
      type: object
      description: >-
        A recusa do envio de desfecho: nada foi gravado. errors lista até 200
        erros por item (errors_total diz quantos são); corrija e envie de novo.
      required:
        - error
        - message
        - errors_total
        - errors
      additionalProperties: false
      properties:
        error:
          type: string
          enum:
            - credit_outcomes_invalid
        message:
          type: string
          description: Texto explicativo. NÃO é contrato.
        errors_total:
          type: integer
          minimum: 1
        errors:
          type: array
          maxItems: 200
          items:
            type: object
            additionalProperties: false
            required:
              - position
              - field
              - code
              - message
            properties:
              position:
                type: integer
                description: O índice do item no corpo, a partir de 0.
              field:
                type:
                  - string
                  - 'null'
                enum:
                  - analysis_id
                  - period
                  - released
                  - max_days_past_due
                  - written_off
                  - prepaid
                  - null
              code:
                type: string
                enum:
                  - unknown_field
                  - analysis_id_invalid
                  - period_invalid
                  - released_invalid
                  - max_days_past_due_required
                  - max_days_past_due_invalid
                  - written_off_invalid
                  - prepaid_invalid
                  - written_off_and_prepaid
                  - performance_without_release
                  - duplicate_pair
                  - analysis_not_found
                  - analysis_outside_program
                  - analysis_superseded
                  - period_before_analysis
                  - period_after_retention
                  - period_in_future
                  - days_past_due_exceeds_elapsed
                  - period_after_prepayment
              message:
                type: string
                description: Texto em pt-BR. NÃO é contrato.
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: >-
        Chave secreta (unifokal_live_ em produção, unifokal_test_ no sandbox: 64
        hex mais CRC-32) no Authorization: Bearer. Só no seu servidor: nunca no
        browser ou app (o widget monta apenas com o id vs_ da sessão). Não
        existe chave publishable.

````

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