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

# Cadastro de dispositivo Pix

> O módulo pix_device transforma o cadastro de dispositivo de acesso da Resolução BCB 403/2024 num cadastro verificado por biometria.

## Cadastro de dispositivo Pix

O módulo `pix_device` transforma o **cadastro de dispositivo de acesso** que o Regulamento do Pix (art. 89, §6º a §9º, incluídos pela Resolução BCB nº 403/2024) obriga o PSP a manter num cadastro **verificado por biometria**. No ato de cadastrar um aparelho novo, o titular passa pelo face match e pela prova de vida do mesmo fluxo, que são o segundo fator que a Instrução Normativa BCB nº 491/2024 aceita, e o aparelho só é vinculado ao titular quando a verificação inteira aprova.

> [!WARNING]
>
> **Somos fornecedor da tecnologia do cadastro, não participante do Pix.** As diretrizes de cadastro de dispositivo valem para o participante provedor de conta (IN BCB nº 491/2024, art. 2º), que responde pelas falhas do mecanismo de identificação (art. 4º, § 2º) e não transfere essa responsabilidade ao fornecedor que contrata (Regulamento do Pix, art. 90, § 3º). O registro regulatório do dispositivo, o motor de limites e a resposta ao Banco Central continuam sendo do PSP. O que entregamos são três coisas: o fator biométrico do cadastro, o vínculo verificado entre aparelho e titular com a verificação que o aprovou como evidência, e o aviso assinado quando um aparelho é revogado.

O módulo exige `liveness` e um 1:1 do rosto contra uma referência do titular no mesmo flow, e a exigência vem da norma, não de preferência nossa: sem eles, o vínculo seria com quem **digitou**, e não com quem **é**. O 1:1 tem duas formas. A preferida é `face_reauth`, que compara a selfie com a **matrícula** daquela conta, sem pedir documento; ela pede que o titular tenha passado uma vez pelo onboarding com matrícula, e em produção a sessão sem matrícula é recusada com `enrollment_not_found` (o sandbox não confere matrícula). A outra é `face`, que compara com o documento apresentado no mesmo flow (`cpf_ocr` ou `doc_global`); nessa forma, confira o CPF lido do documento contra o do seu correntista, porque quem está na câmera pode apresentar o próprio documento. A identidade do aparelho chega pelo seu servidor, com a chave secreta, nunca pelo navegador do titular: quem está do outro lado da câmera é o adversário do produto e não pode escolher o próprio identificador de dispositivo.

```
// criação de sessão com o bloco pix_device (obrigatório quando o flow tem o módulo)
POST /v1/verification-sessions
{ "flow_id": "flow_...", "reference_id": "usr_1207",
  "pix_device": { "fingerprint": "id-estavel-do-aparelho-no-seu-app",
                  "platform": "ios",                 // ios | android | web
                  "label": "iPhone de Maria" } }      // opcional, guardado cifrado
```

```
// pix_device no check_details: o cadastro verificado do aparelho
{ "module": "pix_device", "passed": true, "outcome": "approved", "score": 92,
  "data": { "device_id": "pxd_01H…",              // id estável do aparelho, e a chave da revogação
            "status": "active",                   // active | pending_verification | verification_failed
            "platform": "ios",                    // o que você declarou na criação da sessão
            "activated_at": "2026-06-17T14:31:52.114Z",  // só quando ativou
            "limits_advisory": { "unregistered_max_per_tx_cents": 20000,
                                 "unregistered_max_daily_cents": 100000 } } }
```

O `limits_advisory` carrega os limites da IN BCB nº 491/2024, art. 9º, para dispositivo **não** cadastrado (duzentos reais por transação e mil reais por dia), em centavos. Ele é **informativo por contrato**: quem aplica limite é o seu motor, nunca o nosso. O campo existe para o seu motor carregar os números certos sem alguém ter que reescrevê-los à mão a cada mudança de norma.

No resumo `checks` o módulo sai como `"pix_device": "active"` (o vínculo nasceu), `"review"` (há uma pergunta esperando gente) ou `"pending"` (ainda sem desfecho do aparelho). **Nunca** leia `pending` como "cadastrado".

> [!WARNING]
>
> **Aparelho compartilhado nunca reprova sozinho.** Um celular já ativo para outro titular vira `review` com a evidência, e não recusa automática: família dividindo um aparelho é comum e legítimo, e a quantidade de aparelhos e de titulares é decisão do PSP (IN BCB nº 491/2024, art. 5º). Se o seu operador aprovar a revisão, o aparelho fica ativo para os dois titulares; sem essa aprovação, o vínculo automático nunca passa de um titular por aparelho. O titular, na tela, vê apenas "revisão manual", nunca "este aparelho já pertence a outra pessoa".

**O que nunca sai no payload:** a impressão digital do aparelho (você já tem o valor que enviou, e devolver o nosso derivado dele só serviria para alguém testar palpites contra ele) e o apelido do aparelho, que é dado do usuário final, guardado cifrado em repouso e nunca devolvido em resposta de API.

**Revogação.** Quando um aparelho é revogado, no bloqueio reversível ou na exclusão definitiva da IN BCB nº 491/2024 (art. 7º, com o recadastro obrigatório da IN BCB nº 594/2025), o seu backend recebe no mesmo endpoint de webhook de sempre, com a mesma assinatura, um evento `pix_device.revoked`. É por ele que o seu motor de limites fica sabendo que um aparelho roubado saiu do cadastro. A exclusão é terminal: recadastrar exige uma sessão de verificação nova. **Quem revoga é o painel**, em Dispositivos PIX: é lá que se bloqueia, desbloqueia ou exclui um aparelho, e o evento acima sai desse ato.

```
// evento pix_device.revoked no seu endpoint de webhook
{ "id": "evt_pxd_01H…_pix_device_revoked_1",
  "schema_version": 4,
  "event": "pix_device.revoked",
  "livemode": true,
  "created": "2026-06-18T09:02:44.120Z",
  "data": { "object": "pix_device",
            "device_id": "pxd_01H…",
            "verification_id": "ver_01H…",   // pode ser null: revogado antes de a verificação decidir
            "reference_id": "usr_1207",
            "status": "blocked",             // blocked (reversível) | removed (terminal)
            "reason": "stolen",              // stolen | compromised | user_request | admin
            "revoked_at": "2026-06-18T09:02:43.900Z" } }
```


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