openapi: 3.0.0
info:
  title: Recepção - Vínculo de Conta
  description: >-
    Documentação referente ao vínculo de conta (Enrollment) para autenticação
    FIDO e autorização de pagamentos e pagamentos recorrentes — a "Jornada Sem
    Redirecionamento" (JSR) do Open Finance Brasil.


    ## Fluxo


    O vínculo de conta é criado uma única vez por usuário/conta e, depois de
    autorizado, permite autorizar quantos consentimentos de pagamento forem
    necessários sem nenhum redirecionamento adicional ao aplicativo da
    instituição detentora — apenas o passo 3 abaixo envolve redirecionamento, e
    só acontece uma vez (na criação do vínculo).


    1. **POST /enrollments** — cria o vínculo de conta, informando as permissões
    desejadas (`PAYMENTS_INITIATE` e/ou `RECURRING_PAYMENTS_INITIATE`).

    2. **POST /enrollments/{id}/risk-signals** — envia os sinais de risco do
    dispositivo e recebe a `authorisationUrl`.

    3. **Redirecionamento único** — o usuário é redirecionado à
    `authorisationUrl` para autorizar o vínculo na instituição detentora (login
    + confirmação da conta/limites) e retorna ao `callbackUrl` configurado.

    4. **POST /enrollments/{id}/fido-registration-options** — obtém o challenge
    de registro FIDO.

    5. **Resolver o challenge no dispositivo** — ver seção "Resolvendo os
    desafios FIDO" abaixo.

    6. **POST /enrollments/{id}/fido-registration** — envia a credencial FIDO
    registrada. O vínculo passa a `AUTHORISED`.

    7. Para cada pagamento: criar o consentimento normalmente (`POST /consents`
    ou `POST /automatic-payments/.../recurring-consents`), depois:
       - **POST /enrollments/{id}/fido-sign-options** — informando o `consentId`/`recurringConsentId`, obtém o challenge de assinatura.
       - **Resolver o challenge no dispositivo** — gera o `fidoAssertion`.
       - **POST /enrollments/consents/{consentId}/authorise** (ou `/recurring-consents/{recurringConsentId}/authorise`) — autoriza o consentimento com o `fidoAssertion`, sem redirecionamento.
    8. **Iniciar o pagamento** normalmente (`POST /payments/.../pix/payments` ou
    `POST /automatic-payments/.../pix/recurring-payments`) — o apps/tpp preenche
    `authorisationFlow` e o vínculo com o consentimento automaticamente.


    ## Resolvendo os desafios FIDO (WebAuthn)


    Os endpoints `fido-registration-options` e `fido-sign-options` devolvem,
    respectivamente, as opções de `PublicKeyCredentialCreationOptions` e
    `PublicKeyCredentialRequestOptions` do padrão WebAuthn — com os campos
    binários (`challenge`, `user.id`, os `id` de
    `excludeCredentials`/`allowCredentials`) codificados em Base64URL em vez de
    `ArrayBuffer`.


    O cliente (app ou navegador do usuário) precisa:

    1. Decodificar esses campos de Base64URL para binário.

    2. Chamar `navigator.credentials.create({ publicKey })` (registro) ou
    `navigator.credentials.get({ publicKey })` (assinatura) — ou o equivalente
    nativo da API de autenticadores da plataforma (Android/iOS), usando essas
    opções.

    3. Re-codificar os campos binários do resultado (`rawId`,
    `response.clientDataJSON`, `response.attestationObject` no registro;
    `response.clientDataJSON`, `response.authenticatorData`,
    `response.signature`, `response.userHandle` na assinatura) de volta para
    Base64URL.

    4. Enviar esse objeto como corpo de `fido-registration` ou como
    `fidoAssertion` do endpoint de `authorise` correspondente.


    Esse passo acontece inteiramente no dispositivo do usuário (é a própria
    autenticação biométrica/PIN do autenticador), fora da comunicação
    servidor-a-servidor com o apps/tpp — o backend do TPP apenas repassa o
    challenge recebido da instituição detentora e, depois, a assinatura
    resultante.
  version: 1.0.0
servers:
  - url: https://{domain}
    description: Preencha seu dominío tpp
    variables:
      domain:
        default: tpp.exemplo.com
components:
  schemas: {}
  parameters: {}
paths:
  /enrollments/v2/enrollments:
    post:
      description: >-
        Cria um vínculo de conta (enrollment) para autenticação FIDO e
        autorização de pagamentos sem redirecionamento
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    loggedUser:
                      type: object
                      properties:
                        document:
                          type: object
                          properties:
                            identification:
                              type: string
                              maxLength: 11
                            rel:
                              type: string
                              enum: &ref_0
                                - CPF
                                - CNPJ
                          required:
                            - identification
                            - rel
                      required:
                        - document
                    businessEntity:
                      type: object
                      properties:
                        document:
                          type: object
                          properties:
                            identification:
                              type: string
                              pattern: ^[0-9A-Z]{12}[0-9]{2}$
                            rel:
                              type: string
                              enum: *ref_0
                          required:
                            - identification
                            - rel
                      required:
                        - document
                    permissions:
                      type: array
                      items:
                        type: string
                        enum: &ref_1
                          - PAYMENTS_INITIATE
                          - RECURRING_PAYMENTS_INITIATE
                      minItems: 1
                    debtorAccount:
                      type: object
                      properties:
                        ispb:
                          type: string
                          pattern: ^[0-9A-Z]{8}$
                        issuer:
                          type: string
                          minLength: 1
                          maxLength: 4
                        number:
                          type: string
                          minLength: 1
                          maxLength: 20
                        accountType:
                          type: string
                          enum: &ref_2
                            - CACC
                            - SVGS
                            - TRAD
                            - DBNC
                            - OTHR
                      required:
                        - ispb
                        - number
                        - accountType
                    journey:
                      type: object
                      properties:
                        isLinked:
                          type: boolean
                        linkId:
                          type: string
                          maxLength: 256
                      required:
                        - isLinked
                        - linkId
                    enrollmentName:
                      type: string
                      maxLength: 140
                  required:
                    - loggedUser
                    - permissions
              required:
                - data
      responses:
        '201':
          description: Vínculo de conta criado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      enrollmentId:
                        type: string
                        maxLength: 256
                        pattern: >-
                          ^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$
                      status:
                        type: string
                        enum: &ref_3
                          - AWAITING_RISK_SIGNALS
                          - AWAITING_ACCOUNT_HOLDER_VALIDATION
                          - AWAITING_ENROLLMENT
                          - AUTHORISED
                          - REVOKED
                          - REJECTED
                      creationDateTime:
                        type: string
                        maxLength: 20
                      statusUpdateDateTime:
                        type: string
                        maxLength: 20
                      expirationDateTime:
                        type: string
                        maxLength: 20
                      loggedUser:
                        type: object
                        properties:
                          document:
                            type: object
                            properties:
                              identification:
                                type: string
                                maxLength: 11
                              rel:
                                type: string
                                enum: *ref_0
                            required:
                              - identification
                              - rel
                        required:
                          - document
                      businessEntity:
                        type: object
                        properties:
                          document:
                            type: object
                            properties:
                              identification:
                                type: string
                                pattern: ^[0-9A-Z]{12}[0-9]{2}$
                              rel:
                                type: string
                                enum: *ref_0
                            required:
                              - identification
                              - rel
                        required:
                          - document
                      permissions:
                        type: array
                        items:
                          type: string
                          enum: *ref_1
                      debtorAccount:
                        type: object
                        properties:
                          ispb:
                            type: string
                            pattern: ^[0-9A-Z]{8}$
                          issuer:
                            type: string
                            minLength: 1
                            maxLength: 4
                          number:
                            type: string
                            minLength: 1
                            maxLength: 20
                          accountType:
                            type: string
                            enum: *ref_2
                        required:
                          - ispb
                          - number
                          - accountType
                      enrollmentName:
                        type: string
                        maxLength: 140
                    required:
                      - enrollmentId
                      - status
                      - creationDateTime
                      - statusUpdateDateTime
                      - loggedUser
                      - permissions
                  links:
                    type: object
                    properties:
                      self:
                        type: string
                        maxLength: 2000
                    required:
                      - self
                  meta:
                    type: object
                    properties:
                      requestDateTime:
                        type: string
                        maxLength: 20
                        format: date-time
                    required:
                      - requestDateTime
                required:
                  - data
                  - links
                  - meta
  /enrollments/v2/enrollments/{enrollmentId}:
    get:
      description: Consultar vínculo de conta
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
      responses:
        '200':
          description: Dados do vínculo de conta obtidos com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      enrollmentId:
                        type: string
                        maxLength: 256
                        pattern: >-
                          ^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$
                      status:
                        type: string
                        enum: *ref_3
                      creationDateTime:
                        type: string
                        maxLength: 20
                      statusUpdateDateTime:
                        type: string
                        maxLength: 20
                      expirationDateTime:
                        type: string
                        maxLength: 20
                      loggedUser:
                        type: object
                        properties:
                          document:
                            type: object
                            properties:
                              identification:
                                type: string
                                maxLength: 11
                              rel:
                                type: string
                                enum: *ref_0
                            required:
                              - identification
                              - rel
                        required:
                          - document
                      businessEntity:
                        type: object
                        properties:
                          document:
                            type: object
                            properties:
                              identification:
                                type: string
                                pattern: ^[0-9A-Z]{12}[0-9]{2}$
                              rel:
                                type: string
                                enum: *ref_0
                            required:
                              - identification
                              - rel
                        required:
                          - document
                      permissions:
                        type: array
                        items:
                          type: string
                          enum: *ref_1
                      debtorAccount:
                        type: object
                        properties:
                          ispb:
                            type: string
                            pattern: ^[0-9A-Z]{8}$
                          issuer:
                            type: string
                            minLength: 1
                            maxLength: 4
                          number:
                            type: string
                            minLength: 1
                            maxLength: 20
                          accountType:
                            type: string
                            enum: *ref_2
                        required:
                          - ispb
                          - number
                          - accountType
                      journey:
                        type: object
                        properties:
                          isLinked:
                            type: boolean
                          linkId:
                            type: string
                            maxLength: 256
                        required:
                          - isLinked
                          - linkId
                      cancellation:
                        type: object
                        properties:
                          cancelledBy:
                            type: object
                            properties:
                              document:
                                type: object
                                properties:
                                  identification:
                                    type: string
                                    maxLength: 11
                                  rel:
                                    type: string
                                    enum: *ref_0
                                required:
                                  - identification
                                  - rel
                            required:
                              - document
                          reason:
                            anyOf:
                              - type: object
                                properties:
                                  rejectionReason:
                                    type: string
                                    enum: &ref_4
                                      - REJEITADO_TEMPO_EXPIRADO_RISK_SIGNALS
                                      - REJEITADO_TITULARIDADE_DIVERGENTE
                                      - >-
                                        REJEITADO_TEMPO_EXPIRADO_ACCOUNT_HOLDER_VALIDATION
                                      - REJEITADO_TEMPO_EXPIRADO_ENROLLMENT
                                      - REJEITADO_MAXIMO_CHALLENGES_ATINGIDO
                                      - REJEITADO_MANUALMENTE
                                      - REJEITADO_DISPOSITIVO_INCOMPATIVEL
                                      - REJEITADO_FALHA_INFRAESTRUTURA
                                      - REJEITADO_FALHA_HYBRID_FLOW
                                      - REJEITADO_FALHA_FIDO
                                      - REJEITADO_SEGURANCA_INTERNA
                                      - REJEITADO_OUTRO
                                required:
                                  - rejectionReason
                              - type: object
                                properties:
                                  revocationReason:
                                    type: string
                                    enum: &ref_5
                                      - REVOGADO_VALIDADE_EXPIRADA
                                      - REVOGADO_MANUALMENTE
                                      - REVOGADO_FALHA_INFRAESTRUTURA
                                      - REVOGADO_SEGURANCA_INTERNA
                                      - REVOGADO_OUTRO
                                required:
                                  - revocationReason
                          additionalInformation:
                            type: string
                            maxLength: 2048
                          cancelledFrom:
                            type: string
                            enum:
                              - INICIADORA
                              - DETENTORA
                          rejectedAt:
                            type: string
                            maxLength: 20
                        required:
                          - reason
                          - cancelledFrom
                      transactionLimit:
                        type: string
                        minLength: 4
                        maxLength: 19
                        pattern: ^((\d{1,16}\.\d{2}))$
                      dailyLimit:
                        type: string
                        minLength: 4
                        maxLength: 19
                        pattern: ^((\d{1,16}\.\d{2}))$
                      enrollmentName:
                        type: string
                        maxLength: 140
                    required:
                      - enrollmentId
                      - status
                      - creationDateTime
                      - statusUpdateDateTime
                      - loggedUser
                      - permissions
                  links:
                    type: object
                    properties:
                      self:
                        type: string
                        maxLength: 2000
                    required:
                      - self
                  meta:
                    type: object
                    properties:
                      requestDateTime:
                        type: string
                        maxLength: 20
                        format: date-time
                    required:
                      - requestDateTime
                required:
                  - data
                  - links
                  - meta
    patch:
      description: Rejeita ou revoga um vínculo de conta
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    cancellation:
                      type: object
                      properties:
                        reason:
                          anyOf:
                            - type: object
                              properties:
                                rejectionReason:
                                  type: string
                                  enum: *ref_4
                              required:
                                - rejectionReason
                            - type: object
                              properties:
                                revocationReason:
                                  type: string
                                  enum: *ref_5
                              required:
                                - revocationReason
                        additionalInformation:
                          type: string
                          maxLength: 2048
                      required:
                        - reason
                  required:
                    - cancellation
              required:
                - data
      responses:
        '204':
          description: Vínculo de conta cancelado com sucesso
  /enrollments/v2/enrollments/{enrollmentId}/fido-registration-options:
    post:
      description: >-
        Gera as opções (challenge) para registro de credencial FIDO do vínculo
        de conta. A resposta segue (com campos binários em Base64URL) o formato
        de PublicKeyCredentialCreationOptions do WebAuthn: decodifique
        `challenge`, `user.id` e os `id` de `excludeCredentials` de Base64URL
        para binário antes de chamar `navigator.credentials.create({ publicKey:
        {...} })` (ou o equivalente nativo, em app mobile) no dispositivo do
        usuário. O resultado dessa chamada é enviado no endpoint de
        fido-registration, logo abaixo.
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    rp:
                      type: string
                    platform:
                      type: string
                      enum: &ref_6
                        - ANDROID
                        - BROWSER
                        - CROSS_PLATFORM
                        - IOS
                  required:
                    - rp
                    - platform
              required:
                - data
      responses:
        '201':
          description: Opções de registro FIDO geradas com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      enrollmentId:
                        type: string
                        maxLength: 256
                        pattern: >-
                          ^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$
                      rp:
                        type: object
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                          - name
                      user:
                        type: object
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                          displayName:
                            type: string
                        required:
                          - id
                          - name
                          - displayName
                      challenge:
                        type: string
                      pubKeyCredParams:
                        type: array
                        items:
                          type: object
                          properties:
                            alg:
                              type: number
                            type:
                              type: string
                          required:
                            - alg
                            - type
                      timeout:
                        type: number
                      excludeCredentials:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            type:
                              type: string
                          required:
                            - id
                            - type
                      authenticatorSelection:
                        type: object
                        properties:
                          authenticatorAttachment:
                            type: string
                          userVerification:
                            type: string
                          requireResidentKey:
                            type: boolean
                          residentKey:
                            type: string
                      attestation:
                        type: string
                      attestationFormats:
                        type: array
                        items:
                          type: string
                      extensions:
                        type: object
                        additionalProperties:
                          nullable: true
                    required:
                      - enrollmentId
                      - rp
                      - user
                      - challenge
                      - pubKeyCredParams
                  meta:
                    type: object
                    properties:
                      requestDateTime:
                        type: string
                        maxLength: 20
                        format: date-time
                    required:
                      - requestDateTime
                required:
                  - data
                  - meta
  /enrollments/v2/enrollments/{enrollmentId}/fido-registration:
    post:
      description: >-
        Confirma o registro da credencial FIDO (attestation) do vínculo de
        conta. O corpo é o retorno de `navigator.credentials.create()` (chamado
        com as opções obtidas em fido-registration-options), com `rawId`,
        `response.clientDataJSON` e `response.attestationObject` re-codificados
        de binário para Base64URL. Com sucesso (204), o vínculo fica pronto para
        autorizar consentimentos de pagamento sem nenhum redirecionamento
        adicional — basta repetir o par fido-sign-options/authorise (abaixo)
        para cada consentimento.
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    id:
                      type: string
                      minLength: 1
                    rawId:
                      type: string
                      minLength: 1
                    response:
                      type: object
                      properties:
                        clientDataJSON:
                          type: string
                          minLength: 1
                        attestationObject:
                          type: string
                          minLength: 1
                      required:
                        - clientDataJSON
                        - attestationObject
                    authenticatorAttachment:
                      type: string
                    type:
                      type: string
                    clientExtensionResults:
                      type: object
                      additionalProperties:
                        nullable: true
                  required:
                    - id
                    - rawId
                    - response
                    - type
              required:
                - data
      responses:
        '204':
          description: Credencial FIDO registrada com sucesso
  /enrollments/v2/enrollments/{enrollmentId}/fido-sign-options:
    post:
      description: >-
        Gera as opções de assinatura FIDO (challenge de autenticação) para
        autorizar um consentimento de pagamento ou pagamento recorrente
        vinculados ao enrollment. Informe no corpo o `consentId` (pagamento
        avulso) ou `recurringConsentId` (pagamento recorrente) que será
        autorizado. A resposta segue o formato de
        PublicKeyCredentialRequestOptions do WebAuthn: decodifique `challenge` e
        os `id` de `allowCredentials` de Base64URL para binário antes de chamar
        `navigator.credentials.get({ publicKey: {...} })` com a credencial
        registrada em fido-registration. O resultado (a assinatura/asserção
        FIDO) é enviado como `fidoAssertion` no endpoint de authorise
        correspondente.
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  anyOf:
                    - type: object
                      properties:
                        rp:
                          type: string
                        platform:
                          type: string
                          enum: *ref_6
                        consentId:
                          type: string
                      required:
                        - rp
                        - platform
                        - consentId
                      additionalProperties: false
                    - type: object
                      properties:
                        rp:
                          type: string
                        platform:
                          type: string
                          enum: *ref_6
                        recurringConsentId:
                          type: string
                      required:
                        - rp
                        - platform
                        - recurringConsentId
                      additionalProperties: false
              required:
                - data
      responses:
        '201':
          description: Opções de assinatura FIDO geradas com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      challenge:
                        type: string
                      timeout:
                        type: integer
                      rpId:
                        type: string
                      allowCredentials:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            type:
                              type: string
                          required:
                            - id
                            - type
                      userVerification:
                        type: string
                      extensions:
                        type: object
                        additionalProperties:
                          nullable: true
                    required:
                      - challenge
                  meta:
                    type: object
                    properties:
                      requestDateTime:
                        type: string
                        maxLength: 20
                        format: date-time
                    required:
                      - requestDateTime
                required:
                  - data
                  - meta
  /enrollments/v2/enrollments/{enrollmentId}/risk-signals:
    post:
      description: >-
        Envia os sinais de risco do dispositivo e obtém a URL de autorização do
        vínculo de conta
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do vínculo de conta
          required: true
          name: enrollmentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    deviceId:
                      type: string
                    isRootedDevice:
                      type: boolean
                    screenBrightness:
                      type: number
                      minimum: 0
                    elapsedTimeSinceBoot:
                      type: integer
                    osVersion:
                      type: string
                    userTimeZoneOffset:
                      type: string
                      pattern: ^[+-]\d{2}(:\d{2})?$
                    language:
                      type: string
                      minLength: 2
                      maxLength: 2
                    screenDimensions:
                      type: object
                      properties:
                        height:
                          type: integer
                        width:
                          type: integer
                      required:
                        - height
                        - width
                    accountTenure:
                      type: string
                      pattern: ^(\d{4})-(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])$
                    geolocation:
                      type: object
                      properties:
                        latitude:
                          type: number
                        longitude:
                          type: number
                        type:
                          type: string
                          enum: &ref_7
                            - COARSE
                            - FINE
                            - INFERRED
                    isCallInProgress:
                      type: boolean
                    isDevModeEnabled:
                      type: boolean
                    isMockGPS:
                      type: boolean
                    isEmulated:
                      type: boolean
                    isMonkeyRunner:
                      type: boolean
                    isCharging:
                      type: boolean
                    antennaInformation:
                      type: string
                    isUsbConnected:
                      type: boolean
                    integrity:
                      type: object
                      properties:
                        appRecognitionVerdict:
                          type: string
                        deviceRecognitionVerdict:
                          type: string
                  required:
                    - deviceId
                    - osVersion
                    - userTimeZoneOffset
                    - language
                    - screenDimensions
                    - accountTenure
              required:
                - data
      responses:
        '200':
          description: Sinais de risco enviados com sucesso, URL de autorização retornada
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      authorisationUrl:
                        type: string
                    required:
                      - authorisationUrl
                required:
                  - data
  /enrollments/v2/consents/{consentId}/authorise:
    post:
      description: >-
        Autoriza um consentimento de pagamento por meio do vínculo de conta,
        dispensando o redirecionamento ao aplicativo da instituição detentora. O
        corpo leva o `enrollmentId` do vínculo já autorizado (fido-registration
        concluído), os mesmos `riskSignals` coletados no dispositivo (mesmo
        formato do envio em risk-signals) e o `fidoAssertion` obtido a partir do
        `navigator.credentials.get()` chamado com o challenge de
        fido-sign-options para este `consentId`. Após o sucesso (204), o
        consentimento fica apto para iniciação de pagamento sem necessidade de
        redirecionamento adicional — o campo authorisationFlow no corpo do
        pagamento é preenchido automaticamente, não sendo necessário informá-lo.
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do consentimento de pagamento
          required: true
          name: consentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    enrollmentId:
                      type: string
                      maxLength: 256
                      pattern: >-
                        ^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$
                    riskSignals:
                      type: object
                      properties:
                        deviceId:
                          type: string
                        isRootedDevice:
                          type: boolean
                        screenBrightness:
                          type: number
                          minimum: 0
                        elapsedTimeSinceBoot:
                          type: integer
                        osVersion:
                          type: string
                        userTimeZoneOffset:
                          type: string
                          pattern: ^[+-]\d{2}(:\d{2})?$
                        language:
                          type: string
                          minLength: 2
                          maxLength: 2
                        screenDimensions:
                          type: object
                          properties:
                            height:
                              type: integer
                            width:
                              type: integer
                          required:
                            - height
                            - width
                        accountTenure:
                          type: string
                          pattern: ^(\d{4})-(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])$
                        geolocation:
                          type: object
                          properties:
                            latitude:
                              type: number
                            longitude:
                              type: number
                            type:
                              type: string
                              enum: *ref_7
                        isCallInProgress:
                          type: boolean
                        isDevModeEnabled:
                          type: boolean
                        isMockGPS:
                          type: boolean
                        isEmulated:
                          type: boolean
                        isMonkeyRunner:
                          type: boolean
                        isCharging:
                          type: boolean
                        antennaInformation:
                          type: string
                        isUsbConnected:
                          type: boolean
                        integrity:
                          type: object
                          properties:
                            appRecognitionVerdict:
                              type: string
                            deviceRecognitionVerdict:
                              type: string
                      required:
                        - deviceId
                        - osVersion
                        - userTimeZoneOffset
                        - language
                        - screenDimensions
                        - accountTenure
                    fidoAssertion:
                      type: object
                      properties:
                        id:
                          type: string
                        rawId:
                          type: string
                        type:
                          type: string
                        response:
                          type: object
                          properties:
                            clientDataJSON:
                              type: string
                            authenticatorData:
                              type: string
                            signature:
                              type: string
                            userHandle:
                              type: string
                          required:
                            - clientDataJSON
                            - authenticatorData
                            - signature
                            - userHandle
                        clientExtensionResults:
                          type: object
                          additionalProperties:
                            nullable: true
                      required:
                        - id
                        - rawId
                        - type
                        - response
                  required:
                    - enrollmentId
                    - riskSignals
                    - fidoAssertion
              required:
                - data
      responses:
        '204':
          description: Consentimento de pagamento autorizado com sucesso
  /enrollments/v2/recurring-consents/{recurringConsentId}/authorise:
    post:
      description: >-
        Autoriza um consentimento de pagamento recorrente por meio do vínculo de
        conta, dispensando o redirecionamento ao aplicativo da instituição
        detentora. O corpo leva o `enrollmentId` do vínculo já autorizado
        (fido-registration concluído), os mesmos `riskSignals` coletados no
        dispositivo (mesmo formato do envio em risk-signals) e o `fidoAssertion`
        obtido a partir do `navigator.credentials.get()` chamado com o challenge
        de fido-sign-options para este `recurringConsentId`. A instituição
        detentora exige que o `debtorAccount` do consentimento recorrente seja
        idêntico ao `debtorAccount` confirmado no vínculo durante a autorização
        (consultável via GET do enrollment) — divergência resulta em 422
        (CONTA_DEBITO_DIVERGENTE_CONSENTIMENTO_VINCULO). Após o sucesso (204), o
        consentimento fica apto para iniciação de pagamento sem necessidade de
        redirecionamento adicional — o campo authorisationFlow no corpo do
        pagamento é preenchido automaticamente, não sendo necessário informá-lo.
      tags:
        - Vínculo de Conta
      parameters:
        - schema:
            type: string
            description: ID do consentimento de pagamento recorrente
          required: true
          name: recurringConsentId
          in: path
        - schema:
            type: string
            description: Authorisation server que vai receber a requisição
          required: true
          description: Authorisation server que vai receber a requisição
          name: x-authorisation-server-id
          in: header
        - schema:
            type: string
            description: Token FCamara
          required: true
          description: Token FCamara
          name: authorization
          in: header
        - schema:
            type: string
            description: Indica o user-agent que o usuário utiliza
          required: true
          description: Indica o user-agent que o usuário utiliza
          name: x-customer-user-agent
          in: header
        - schema:
            type: string
            description: >-
              Identificador de solicitação exclusivo para suportar a
              idempotência
          required: true
          description: Identificador de solicitação exclusivo para suportar a idempotência
          name: x-idempotency-key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    enrollmentId:
                      type: string
                      maxLength: 256
                      pattern: >-
                        ^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$
                    riskSignals:
                      type: object
                      properties:
                        deviceId:
                          type: string
                        isRootedDevice:
                          type: boolean
                        screenBrightness:
                          type: number
                          minimum: 0
                        elapsedTimeSinceBoot:
                          type: integer
                        osVersion:
                          type: string
                        userTimeZoneOffset:
                          type: string
                          pattern: ^[+-]\d{2}(:\d{2})?$
                        language:
                          type: string
                          minLength: 2
                          maxLength: 2
                        screenDimensions:
                          type: object
                          properties:
                            height:
                              type: integer
                            width:
                              type: integer
                          required:
                            - height
                            - width
                        accountTenure:
                          type: string
                          pattern: ^(\d{4})-(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])$
                        geolocation:
                          type: object
                          properties:
                            latitude:
                              type: number
                            longitude:
                              type: number
                            type:
                              type: string
                              enum: *ref_7
                        isCallInProgress:
                          type: boolean
                        isDevModeEnabled:
                          type: boolean
                        isMockGPS:
                          type: boolean
                        isEmulated:
                          type: boolean
                        isMonkeyRunner:
                          type: boolean
                        isCharging:
                          type: boolean
                        antennaInformation:
                          type: string
                        isUsbConnected:
                          type: boolean
                        integrity:
                          type: object
                          properties:
                            appRecognitionVerdict:
                              type: string
                            deviceRecognitionVerdict:
                              type: string
                      required:
                        - deviceId
                        - osVersion
                        - userTimeZoneOffset
                        - language
                        - screenDimensions
                        - accountTenure
                    fidoAssertion:
                      type: object
                      properties:
                        id:
                          type: string
                        rawId:
                          type: string
                        type:
                          type: string
                        response:
                          type: object
                          properties:
                            clientDataJSON:
                              type: string
                            authenticatorData:
                              type: string
                            signature:
                              type: string
                            userHandle:
                              type: string
                          required:
                            - clientDataJSON
                            - authenticatorData
                            - signature
                            - userHandle
                        clientExtensionResults:
                          type: object
                          additionalProperties:
                            nullable: true
                      required:
                        - id
                        - rawId
                        - type
                        - response
                  required:
                    - enrollmentId
                    - riskSignals
                    - fidoAssertion
              required:
                - data
      responses:
        '204':
          description: Consentimento de pagamento recorrente autorizado com sucesso
