DICT API (1.0.0-RC2)

Download OpenAPI specification:Download

O Diretório de Identificadores de Contas Transacionais - DICT - é o serviço do arranjo PIX que permite buscar detalhes de contas transacionais com chaves de endereçamento mais convenientes para quem faz um pagamento. Entre os tipos de chave atualmente disponíveis estão CPF, CNPJ, telefone, e-mail e EVP. As informações retornadas pelo DICT permitem ao pagador confirmar a identidade do recebedor, proporcionando uma experiência mais fácil e segura. Permitem também ao PSP do pagador criar a mensagem de instrução de pagamento a ser enviada para o sistema de liquidação com os detalhes de conta do recebedor.

Segurança

Autenticação

O DICT utiliza autenticação mútua TLS.

As definições de autenticação para essa API estão especificados no manual de segurança PIX

Assinatura digital

Requisições que incluam ou alterem informações no DICT devem ser assinadas com XML Digital Signature pelo participante que envia a requisição. Requisições de consulta não precisam ser assinadas. Respostas retornadas pelo DICT serão assinadas digitalmente. As assinaturas devem ser validadas pelos clientes da API.

A assinatura será colocada no elemento Signature das requisições e respostas. O Signature será envelopado pelo XML que está sendo assinado (assinatura é um elemento filho).

Para mais detalhes sobre a forma de construir a assinatura, consulte o manual de segurança PIX.

Limitação de requisições

Para previnir ataques de enumeração, há mecanismo de limitação da quantidade de consultas que podem ser feitas num espaço de tempo (rate-limiting). A limitação atua em dois níveis, para usuários individuais e para um participante como um todo.

Para cada um desses níveis, há limite para o número de consultas que não resultam em pagamento.

Quando algum desses limites for atingido, o serviço retornará status 429, especificando a causa. Cabeçalhos indicando os parâmetros de rate-limiting serão retornados nas requisições. Ver, por exemplo, os cabeçalhos retornados ao consultar vínculo.

Evolução da API

As seguintes mudanças são esperadas e consideradas retro-compatíveis (backwards-compatibility):

  • Adição de novos recursos na API.
  • Adição de novos parâmetros opcionais a requisições.
  • Adição de novos campos em respostas da API.
  • Alteração da ordem de campos.
  • Adição de novos elementos em enumerações

Mudanças compatíveis não geram nova versão da API. Clientes devem estar preparados para lidar com essas mudanças sem quebrar.

Mudanças incompatíveis geram nova versão da API.

Tratamento de erros

O DICT retorna códigos de status HTTP para indicar sucesso ou falhas das requisições. Códigos 2xx indicam sucesso. Códigos 4xx indicam falhas causadas pelas informações enviadas pelo cliente ou pelo estado atual das entidades. Códigos 5xx indicam problemas no serviço no lado do DICT.

As respostas de erro incluem no corpo detalhes do erro seguindo o schema da RFC Problem Details for HTTP APIs. O campo type identifica o tipo de erro e no DICT segue o padrão: https://dict.pi.rsfn.net.br/api/v1/error/<TipoErro>

Abaixo estão listados os tipos de erro do DICT.

Gerais

  • Forbidden

    • Requisição de participante autenticado que viola alguma regra de autorização. Ver rfc7231.
  • BadRequest

    • Requisição com formato inválido. Ver rfc7231
  • NotFound

    • Entidade não encontrada. Ver rfc7231
  • RateLimited

  • ServiceUnavailable

    • Serviço não está disponível no momento. Serviço solicitado pode estar em manutenção ou fora da janela de funcionamento.
  • RequestSignatureInvalid

    • Assinatura digital da requisição enviada é inválida.
  • RequestOnBehalfUnauthorized

    • Participante direto envia requisição em nome de participante indireto para o qual não tem autorização.
  • RequestIdAlreadyUsed

    • Requisição foi feita com mesmo RequestId de requisição feita anteriormente, mas com parâmetros diferentes.

Vínculos

  • EntryInvalid

    • Existem campos inválidos ao tentar criar novo vínculo.
  • EntryLimitExceeded

    • Número de vínculos associados a conta transacional excedeu o limite máximo.
  • EntryAlreadyExists

    • Já existe vínculo para essa chave com o mesmo participante e dono.
  • EntryCannotBeQueriedForBookTransfer

    • Vínculo consultado está custodiado no mesmo PSP do usuário pagador para quem está sendo feita a consulta. Quando o pagador e o recebedor estão no mesmo PSP, não deve ser feita consulta ao DICT.
  • EntryKeyOwnedByDifferentPerson

    • Já existe vínculo para essa chave mas ela é possuída por outra pessoa. Indica-se que seja feita uma reivindicação de posse.
  • EntryKeyInCustodyOfDifferentParticipant

    • Já existe vínculo para essa chave com o mesmo dono, mas ela encontra-se associada a outro participante. Indica-se que seja feita uma reivindicação de portabilidade.
  • EntryLockedByClaim

    • Existe uma reivindicação com status diferente de concluída ou cancelada para a chave do vínculo. Enquanto estiver nessa situação, o vínculo não pode ser excluído.

Reivindicações

  • ClaimInvalid

    • Existem campos inválidos ao tentar criar nova reivindicação.
  • ClaimTypeInconsistent

    • Tipo de reivindicação pedida é inconsistente. Esse erro ocorre nas situações em que se tenta criar a) reivindicação de posse, mas vínculo existente tem como dona a mesma pessoa que reivindica ou b) reinvidicação de portabilidade, mas vínculo existente tem como dona pessoa diferente da que reivindica.
  • ClaimKeyNotFound

    • Não existe vínculo registrado com a chave que está sendo reivindicada.
  • ClaimAlreadyExistsForKey

    • Existe uma reivindicação com status diferente de concluída ou cancelada para a chave reivindicada. Nova reivindicação para a chave só pode ser criada se a atual foi concluída ou cancelada.
  • ClaimResultingEntryAlreadyExists

    • Vínculo que resultaria ao processar reivindicação já existe, com mesma chave, participante e dono.
  • ClaimOperationInvalid

    • Status atual da reivindicação não permite que operação seja feita.
  • ClaimResolutionPeriodNotEnded

    • Para reivindicação de posse, PSP doador não pode confirmar antes do término do período resolução. Para portabilidade, PSP doador não pode cancelar por fim de prazo antes do término do período resolução.
  • ClaimCompletionPeriodNotEnded

    • Para reivindicação de posse, se PSP reivindicador tenta encerrar antes do término do período encerramento.

Diretório

O diretório de identificadores de contas transacionais é um conjunto de vínculos. Um vínculo é uma associação entre uma chave de endereçamento, uma conta transacional e seu dono. O dono pode ser uma pessoa física ou uma pessoa jurídica. A chave de endereçamento é usada identificar um vínculo.

Os tipos de chave suportadas atualmente são as seguintes:

Tipo Exp. regular Exemplo Comentário
CPF ^[0-9]{11}$ 12345678901
CNPJ ^[0-9]{14}$ 12345678901234
PHONE ^\+[1-9][0-9]\d{1,14}$ +5510998765432
EMAIL e-mails válidos W3C HTML5 pix@bcb.gov.br E-mail deve possuir no máximo 77 caracteres e deve ser em minúsculo
EVP [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} 123e4567-e89b-12d3-a456-426655440000 Endereço Virtual de Pagamento é um tipo de chave é gerado pelo DICT

Novos tipos de chave poderão vir a ser adicionados no futuro. Logo, é importante que a implementação de clientes seja flexível, permitindo a adição de novos tipos de chave.

Criar Vínculo

Cria um novo vínculo de chave com conta transacional.

Idempotência

A operação de criação de vínculo é idempotente. Isso significa que é seguro realizar uma nova tentativa em caso de falhas temporárias, como erros de conexão ou término abrupto de processos. A resposta retornada para uma requisição repetida é equivalente à resposta dada à primeira requisição processada.

Para garantir a idempotência da operação, a requisição tem um campo RequestId. Esse campo é um UUID versão 4 e deve ser único no contexto de um mesmo participante. O RequestId fica associado ao vínculo criado e é usado no cálculo do seu CID (ver seção de reconciliação).

Uma requisição de criação é considerada repetida quando o CID do vínculo contido na requisição já existe no DICT. Caso seja feita uma requisição com um RequestId previamente usado, mas com parâmetros diferentes para o vínculo, será retornado o erro RequestIdAlreadyUsed.

Request Body schema: application/xml
Signature
object
Entry
required
object (Entry)

Vínculo entre uma chave de endereçamento, conta transacional e seu dono.

Reason
required
string
Enum: "USER_REQUESTED" "ACCOUNT_CLOSURE" "BRANCH_TRANSFER" "ENTRY_INACTIVITY" "RECONCILIATION"

Valores válidos: USER_REQUESTED e RECONCILIATION

RequestId
required
string <uuid> (RequestId)

Chave de idempotência da requisição. UUID versão 4.

Responses

201

Created

400

Entry Invalid

403

Forbidden

503

Service Unavailable

post /entries/

Servidor de Produção

https://dict.pi.rsfn.net.br/api/v1/entries/

Servidor de Homologação

https://dict-h.pi.rsfn.net.br/api/v1/entries/

Request samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<CreateEntryRequest>
    <Signature></Signature>
    <Entry>
        <Key>+5561988880000</Key>
        <KeyType>PHONE</KeyType>
        <Account>
            <Participant>12345678</Participant>
            <Branch>00001</Branch>
            <AccountNumber>0007654321</AccountNumber>
            <AccountType>CACC</AccountType>
        </Account>
        <Owner>
            <Type>NATURAL_PERSON</Type>
            <TaxIdNumber>11122233300</TaxIdNumber>
            <Name>João Silva</Name>
        </Owner>
    </Entry>
    <Reason>USER_REQUESTED</Reason>
    <RequestId>a946d533-7f22-42a5-9a9b-e87cd55c0f4d</RequestId>
</CreateEntryRequest>

Response samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<CreateEntryResponse>
    <Signature></Signature>
    <Entry>
        <Key>11122233300</Key>
        <KeyType>CPF</KeyType>
        <Account>
            <Participant>12345678</Participant>
            <Branch>00001</Branch>
            <AccountNumber>0007654321</AccountNumber>
            <AccountType>CACC</AccountType>
        </Account>
        <Owner>
            <Type>NATURAL_PERSON</Type>
            <TaxIdNumber>11122233300</TaxIdNumber>
            <Name>João Silva</Name>
        </Owner>
        <CreationDate>2019-11-18</CreationDate>
        <KeyOwnershipDate>2019-11-18</KeyOwnershipDate>
    </Entry>
</CreateEntryResponse>

Consultar Vínculo

Obtém um vínculo contendo os detalhes de conta transacional associados a uma chave de endereçamento.

Limitação de requisições

A política de limitação (rate-limiting) funciona com base em cabeçalhos enviados na requisição.

O parâmetro PI-PayerId é o identificador pseudonimizado do usuário final, vinculado a um participante. Requisições vindas de um mesmo usuário, para um mesmo participante, devem usar o mesmo identificador. Como sugestão de implementação, pode ser utilizado o valor hexadecimal da aplicação de HMAC-SHA-256 a um identificador do usuário, com chave de conhecimento restrito ao participante.

Cache

Consultas a vínculos podem ter suas respostas cacheadas no PSP, devendo seguir as diretivas contidas no header Cache-Control.

Importante: Para fazer uso de cache, clientes HTTP geralmente precisam ser configurados. Não é comum que tenham essa funcionalidade habilitada por padrão.

path Parameters
Key
required
string (Key) <= 77 characters
Example: 12345678901

Chave de endereçamento

header Parameters
PI-PayerAccountServicer
required
string ^[0-9]{8}
Example: 12345678

Identificador SPB do participante onde o pagador possui conta. Usado para rate-limiting.

PI-PayerId
required
string [0-9a-z]{64}

Identificador pseudonimizado do pagador que originou a requisição. Usado para rate-limiting.

PI-EndToEndId
required
string

Identificador fim-a-fim do pagamento associado a essa requisição. Corresponde ao campo EndToEndId na mensagem pacs.008. Usado para rate-limiting.

Responses

200

OK

404

Not found

429

Rate-Limited

get /entries/{Key}

Servidor de Produção

https://dict.pi.rsfn.net.br/api/v1/entries/{Key}

Servidor de Homologação

https://dict-h.pi.rsfn.net.br/api/v1/entries/{Key}

Response samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<GetEntryResponse>
    <Signature></Signature>
    <Entry>
        <Key>11122233300</Key>
        <KeyType>CPF</KeyType>
        <Account>
            <Participant>12345678</Participant>
            <Branch>00001</Branch>
            <AccountNumber>0007654321</AccountNumber>
            <AccountType>CACC</AccountType>
        </Account>
        <Owner>
            <Type>NATURAL_PERSON</Type>
            <TaxIdNumber>11122233300</TaxIdNumber>
            <Name>João Silva</Name>
        </Owner>
        <CreationDate>2019-11-18</CreationDate>
        <KeyOwnershipDate>2019-11-18</KeyOwnershipDate>
    </Entry>
</GetEntryResponse>

Atualizar Vínculo

Atualiza um vínculo.

A ser utilizado no cenário de atualização da informação da conta de um cliente, permanecendo este no mesmo PSP. Somente pode ser atualizada a informação de conta do vínculo. Outras atualizações do vínculo devem ser feitas por exclusão/inclusão do vínculo, portabilidade ou reivindicação de posse, a depender da situação.

path Parameters
Key
required
string (Key) <= 77 characters
Example: 12345678901

Chave de endereçamento

Request Body schema: application/xml
Signature
object
Key
required
string (Key) <= 77 characters

Chave de endereçamento

Account
required
object (BrazilianAccount)

Dados de conta transacional no Brasil.

Reason
required
string
Enum: "USER_REQUESTED" "ACCOUNT_CLOSURE" "BRANCH_TRANSFER" "ENTRY_INACTIVITY" "RECONCILIATION"

Valores válidos: USER_REQUESTED, BRANCH_TRANSFER e RECONCILIATION

Responses

200

OK

400

Bad Request

403

Forbidden

404

Not found

503

Service Unavailable

put /entries/{Key}

Servidor de Produção

https://dict.pi.rsfn.net.br/api/v1/entries/{Key}

Servidor de Homologação

https://dict-h.pi.rsfn.net.br/api/v1/entries/{Key}

Request samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<UpdateEntryRequest>
    <Signature></Signature>
    <Key>+5561988887777</Key>
    <Account>
        <Participant>12345678</Participant>
        <Branch>00001</Branch>
        <AccountNumber>0007654321</AccountNumber>
        <AccountType>CACC</AccountType>
    </Account>
    <Reason>USER_REQUESTED</Reason>
</UpdateEntryRequest>

Response samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<UpdateEntryResponse>
    <Signature></Signature>
    <Entry>
        <Key>11122233300</Key>
        <KeyType>CPF</KeyType>
        <Account>
            <Participant>12345678</Participant>
            <Branch>00001</Branch>
            <AccountNumber>0007654321</AccountNumber>
            <AccountType>CACC</AccountType>
        </Account>
        <Owner>
            <Type>NATURAL_PERSON</Type>
            <TaxIdNumber>11122233300</TaxIdNumber>
            <Name>João Silva</Name>
        </Owner>
        <CreationDate>2019-11-18</CreationDate>
        <KeyOwnershipDate>2019-11-18</KeyOwnershipDate>
    </Entry>
</UpdateEntryResponse>

Remover Vínculo

Remove um vínculo de chave com conta.

path Parameters
Key
required
string (Key) <= 77 characters
Example: 12345678901

Chave de endereçamento

Request Body schema: application/xml
Signature
object
Key
required
string (Key) <= 77 characters

Chave de endereçamento

Reason
required
string
Enum: "USER_REQUESTED" "ACCOUNT_CLOSURE" "BRANCH_TRANSFER" "ENTRY_INACTIVITY" "RECONCILIATION"

Valores válidos: USER_REQUESTED, ACCOUNT_CLOSURE, ENTRY_INACTIVITY e RECONCILIATION

Responses

200

OK

403

Forbidden

404

Not found

503

Service Unavailable

post /entries/{Key}/delete

Servidor de Produção

https://dict.pi.rsfn.net.br/api/v1/entries/{Key}/delete

Servidor de Homologação

https://dict-h.pi.rsfn.net.br/api/v1/entries/{Key}/delete

Request samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<DeleteEntryRequest>
    <Signature></Signature>
    <Key>+5561988887777</Key>
    <Reason>ACCOUNT_CLOSURE</Reason>
</DeleteEntryRequest>

Response samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<DeleteEntryResponse>
    <Signature></Signature>
    <Key>+5561988887777</Key>
</DeleteEntryResponse>

Reivindicação

Conforme as chaves mudem de dono ou os usuários finais criem contas transacionais em outros PSPs, os seguintes cenários precisarão ser tratados:

  1. Houve troca de posse de uma chave (telefone ou email) e o novo dono deseja criar um vínculo para uma conta sua mas o dono anterior já possui vínculo registrado no DICT com essa chave.
  2. Um usuário deseja mudar a vinculação de uma chave sua para outra conta, que está domiciliada em um participante diferente do atual.

Para o cenário 1, deve ser criada uma reivindicação de posse. Já para o cenário 2, uma portabilidade. Em ambos cenários existirá a figura do PSP que irá ceder a chave (PSP Doador), e o PSP que irá receber a chave (PSP Reivindicador). No cenário de reivindicação de posse, o PSP doador e o reivindicador podem ser o mesmo.

Nessa especificação, reivindicação sem qualificador é usado como termo mais genérico para se referir tanto à reivindicação de posse quanto à (reivindicação de) portabilidade.

Os processos de reivindicação são sempre iniciados pelo PSP reivindicador. Uma reivindicação tem as seguintes situações:

  • OPEN - Aberta pelo reivindicador, mas ainda não recebida pelo doador.
  • WAITING_RESOLUTION - Já foi recebida pelo doador e está aguardando a resolução. Os critérios confirmação ou cancelamento da reivindicação seguem normas específicas a depender do tipo (posse ou portabilidade).
  • CONFIRMED - O doador confirmou a reivindicação. Isso implica a remoção da chave do DICT e da base interna do PSP doador. Está aguardando o reivindicador encerrar o processo.
  • CANCELLED - O doador ou reivindicador cancelou a reivindicação, mantendo o vínculo inalterado (conforme estava antes da reivindicação) tanto no DICT quanto na base interna do PSP.
  • COMPLETED - Tanto o DICT quanto o reivindicador atualizaram suas bases com o novo vínculo.

Diagrama de estados

( OPEN )------->( WAITING_RESOLUTION )------->( CONFIRMED )------->( COMPLETED )
                          |                        /                            
                          |                       /                             
                          |                      /                              
                          |                     /--Apenas para                  
                          v                    /   reivindicação                
                    ( CANCELLED )<------------v    de posse                      

Importante! Os participantes deverão monitorar as reivindicações fazendo polling períodico no endpoint de listar reivindicações. A periodicidade adequada dependerá das definições de nível de serviço.

Criar Reivindicação

Cria uma nova reivindicação.

Essa operação é feita pelo participante reivindicador a pedido do usuário final. O vínculo atual permanece inalterado, até que haja a confirmação pelo PSP doador.

Nem todo tipo de chave pode ser reivindicado ou portado. A tabela abaixo define as possibilidades:

compatível? OWNERSHIP PORTABILITY
CPF
CNPJ
PHONE
EMAIL
EVP
Request Body schema: application/xml
Signature
object
Claim
required
object (Claim)

Responses

201

Created

400

Claim Invalid

403

Forbidden

503

Service Unavailable

post /claims/

Servidor de Produção

https://dict.pi.rsfn.net.br/api/v1/claims/

Servidor de Homologação

https://dict-h.pi.rsfn.net.br/api/v1/claims/

Request samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<CreateClaimRequest>
    <Signature></Signature>
    <Claim>
        <Type>OWNERSHIP</Type>
        <Key>+5561988887777</Key>
        <KeyType>PHONE</KeyType>
        <ClaimerAccount>
            <Participant>12345678</Participant>
            <Branch>00001</Branch>
            <AccountNumber>0007654321</AccountNumber>
            <AccountType>CACC</AccountType>
        </ClaimerAccount>
        <Claimer>
            <Type>NATURAL_PERSON</Type>
            <TaxIdNumber>11122233300</TaxIdNumber>
            <Name>João Silva</Name>
        </Claimer>
    </Claim>
</CreateClaimRequest>

Response samples

Content type
application/xml
Copy
<?xml version="1.0" encoding="UTF-8" ?>
<CreateClaimResponse>