> ## 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.

# Triagem avulsa de PEP e sanções por documento (CPF com o nome ou CNPJ com a razão social)

> Triagem de UM documento nas listas de PEP (CGU) e de sanções (CGU, OFAC, ONU, Reino Unido), sem sessão de verificação. Exige uma chave secreta criada COM o escopo screening:write (chaves sem restrição não o têm) e com lista de IPs permitidos. Preço: o da linha pep_sanctions. A chave unifokal_test_ responde pelo simulador determinístico e nunca lê lista real. Idempotency-Key opcional: a repetição com o mesmo corpo em 24 horas devolve o mesmo query.id, reavalia as listas e não cobra de novo; com outro corpo é 422 idempotency_key_reuse.



## OpenAPI

````yaml /api-reference/openapi.json post /screening-checks
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:
  /screening-checks:
    post:
      summary: >-
        Triagem avulsa de PEP e sanções por documento (CPF com o nome ou CNPJ
        com a razão social)
      description: >-
        Triagem de UM documento nas listas de PEP (CGU) e de sanções (CGU, OFAC,
        ONU, Reino Unido), sem sessão de verificação. Exige uma chave secreta
        criada COM o escopo screening:write (chaves sem restrição não o têm) e
        com lista de IPs permitidos. Preço: o da linha pep_sanctions. A chave
        unifokal_test_ responde pelo simulador determinístico e nunca lê lista
        real. Idempotency-Key opcional: a repetição com o mesmo corpo em 24
        horas devolve o mesmo query.id, reavalia as listas e não cobra de novo;
        com outro corpo é 422 idempotency_key_reuse.
      operationId: createScreeningCheck
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 255
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScreeningCheckRequest'
      responses:
        '200':
          description: >-
            Repetição da mesma Idempotency-Key: o mesmo query.id, replayed true,
            sem novo débito.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScreeningCheckResponse'
        '201':
          description: Triagem feita. A resposta não é gravada e não volta por nenhum GET.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScreeningCheckResponse'
        '400':
          description: >-
            Códigos estáveis: invalid_json, validation_error, invalid_cpf,
            invalid_cnpj. Ramifique pelo campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_json
                          - validation_error
                          - invalid_cpf
                          - invalid_cnpj
        '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
        '402':
          description: >-
            Códigos estáveis: insufficient_credit. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - insufficient_credit
        '403':
          description: >-
            Códigos estáveis: credential_type_not_allowed,
            organization_suspended, test_key_used_in_production,
            insufficient_scope, ip_not_allowed, screening_requires_ip_allowlist,
            onboarding_required, account_under_review. 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
                          - screening_requires_ip_allowlist
                          - onboarding_required
                          - account_under_review
        '409':
          description: >-
            Códigos estáveis: lookup_in_progress. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - lookup_in_progress
        '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: idempotency_key_reuse, module_not_priced,
            screening_name_invalid, screening_name_too_long,
            screening_birth_date_invalid, screening_birth_date_not_supported.
            Ramifique pelo campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - idempotency_key_reuse
                          - module_not_priced
                          - screening_name_invalid
                          - screening_name_too_long
                          - screening_birth_date_invalid
                          - screening_birth_date_not_supported
        '429':
          description: >-
            Códigos estáveis: lookup_daily_cap, lookup_distinct_daily_cap,
            module_quota_reached, rate_limited. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - lookup_daily_cap
                          - lookup_distinct_daily_cap
                          - module_quota_reached
                          - rate_limited
      security:
        - secretKey: []
components:
  schemas:
    ScreeningCheckRequest:
      type: object
      properties:
        document:
          type: string
          minLength: 11
          maxLength: 24
          description: >-
            CPF (11 dígitos) ou CNPJ (14 caracteres), com ou sem pontuação. O
            dígito verificador é conferido antes de qualquer custo (400
            invalid_cpf ou invalid_cnpj). Nunca é gravado: a linha guarda uma
            impressão com pimenta, apagada em 24 horas.
        name:
          type: string
          minLength: 1
          maxLength: 300
          description: >-
            Obrigatório: o nome como está no documento (pessoa) ou a razão
            social (empresa). A triagem é por documento, nunca por nome solto.
            Na lista de PEP o nome confirma a máscara do CPF; nas listas
            internacionais é o nome que busca.
        birth_date:
          type: string
          maxLength: 10
          description: >-
            Opcional e só para CPF (AAAA-MM-DD, no passado): desempata homônimos
            nas listas internacionais. Com CNPJ é 422
            screening_birth_date_not_supported.
        purpose:
          type: string
          enum:
            - customer_onboarding
            - customer_review
            - customer_related_party
            - employee_partner_or_supplier
            - transaction_counterparty
          description: >-
            Finalidade de vocabulário fechado, que diz a sua relação com a
            pessoa: customer_onboarding, customer_review,
            customer_related_party, employee_partner_or_supplier ou
            transaction_counterparty. Fica na trilha da consulta.
      required:
        - document
        - name
        - purpose
    ScreeningCheckResponse:
      type: object
      description: >-
        A resposta volta UMA vez e não é gravada: não existe GET que a devolva.
        Hit por nome sai sem nome, documento, cargo ou texto do terceiro; o
        registro público só vem no hit forte por documento.
      required:
        - query
        - screening
        - billing
        - replayed
      properties:
        query:
          type: object
          description: >-
            A linha da trilha da consulta (sem documento e sem o resultado
            detalhado).
          properties:
            id:
              type: string
              pattern: ^lkq_[0-9A-HJKMNP-TV-Z]{26}$
            module:
              type: string
              const: pep_sanctions
            environment:
              type: string
              enum:
                - sandbox
                - production
            document_kind:
              type: string
              enum:
                - cpf
                - cnpj
            purpose:
              type: string
            channel:
              type: string
              const: api
            status:
              type: string
              enum:
                - delivered
                - failed
            screening_result:
              type:
                - string
                - 'null'
              enum:
                - match
                - possible_match
                - no_match
                - null
            price_cents:
              type:
                - integer
                - 'null'
            billed:
              type: boolean
            created_at:
              type: string
              format: date-time
        screening:
          type: object
          required:
            - result
            - pep
            - hits
            - hits_truncated
            - aggregates
            - dataset_versions
          properties:
            result:
              type: string
              enum:
                - match
                - possible_match
                - no_match
                - unavailable
              description: >-
                match: hit forte; possible_match: candidato a revisar (homônimo
                é o caso comum); no_match: nenhum hit nas listas consultadas;
                unavailable: uma lista estava vencida ou fora, a consulta falhou
                e não foi cobrada.
            pep:
              type: boolean
            pep_status:
              type:
                - object
                - 'null'
            hits:
              type: array
              items:
                type: object
            hits_truncated:
              type: boolean
            aggregates:
              type:
                - object
                - 'null'
            dataset_versions:
              type:
                - object
                - 'null'
              description: >-
                A versão e o frescor de cada lista consultada: a prova da sua
                diligência e o crédito da fonte oficial.
            coverage:
              type:
                - object
                - 'null'
              description: >-
                Aviso de cobertura pela causa, sobre a consulta que de fato
                rodou. complete quando todas as listas do catálogo foram
                consultadas; partial quando alguma estava desligada e não foi
                consultada (unavailable_sources). Convive com approved: não
                baixa a nota e não é evidência contra o titular. null quando a
                triagem não chegou a consultar as listas (pending no check,
                unavailable na triagem avulsa) e em verificação decidida antes
                do campo existir.
              required:
                - band
                - unavailable_sources
              properties:
                band:
                  type: string
                  enum:
                    - complete
                    - partial
                unavailable_sources:
                  type: array
                  items:
                    type: string
                  description: Id estável de cada lista não consultada.
        billing:
          type: object
        replayed:
          type: boolean
          description: >-
            true quando a resposta é a repetição da mesma Idempotency-Key
            (reavaliada, sem novo débito).
    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
  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.