Antes de começar
Você conversa com três serviços, e confundi-los é o erro inicial mais comum.- Um bearer token para o ledger, um para o CRM e um para o plugin. Eles podem vir de audiences diferentes.
- A permissão
systemplane:writeno token do plugin. Sem ela as escritas de configuração respondem403. SYSTEMPLANE_ENABLED=trueno plugin. Sem esse valor, o grupo de rotas/systemsequer é montado e toda escrita de configuração responde404.- O ISPB da sua instituição: o identificador de 8 dígitos com que você foi credenciado no BACEN.
Provisione o ledger e os registros de titular
Estes passos rodam contra o Midaz e o CRM. Eles criam as contas em que o trilho lança e os registros de titular a partir dos quais ele resolve as contrapartes.Crie a organização e o ledger
201 sem id no corpo não é sucesso: nada consegue endereçar o que foi criado, nem você nem a limpeza depois. Pare aí em vez de levar um id vazio para o passo seguinte.Crie o ativo BRL e espere ele aparecer
BRL.201 quanto 409 são boas respostas. Um ativo é endereçado pelo código dele dentro de um ledger, então “já existe” é indistinguível de sucesso.Duas coisas acontecem aqui, e a segunda passa fácil despercebida:- O ledger começa a aceitar contas naquele ativo. Antes disso, ele recusa toda conta com
0034 Asset Code Not Found. - O Midaz cria a conta
@external/BRLjunto. Ela é a única conta em um livro que pode ser debitada sem ter sido creditada antes, então é de onde vem o saldo inicial e é a contraparte de toda liquidação com o mundo externo.
Crie uma conta por papel
accountId de toda chamada de negócio que você faz contra o plugin. O alias (@payer) é o nome curto pelo qual o livro é lido e recebe lançamentos, e ele reaparece no passo seguinte no lugar menos provável.Crie o titular no CRM
typesegue o tamanho do documento.NATURAL_PERSONpara um CPF (11 dígitos),LEGAL_PERSONpara um CNPJ (14). O plugin converte esse tipo no número que vai na mensagem para a JD, então errar aqui registra a parte como o tipo errado de pessoa.externalIdtem que ser o alias da conta no ledger (@payer), e o nome do campo esconde isso. O CRM o descreve como um identificador externo de correlação, o que soa opcional. Para este trilho não é: é ali que o plugin lê qual conta do livro pertence ao titular. Um titular semexternalIdproduz uma conta que resolve, parece completa e falha em todo pagamento.addresses.primary.cityé obrigatório para QR codes e Pix Automático. É a cidade do recebedor impressa no código, e o plugin se recusa a gerar um QR sem ela, respondendo422 PIX-0033e apontando parapayee.city. Nenhum caminho de pagamento lê o campo, e é por isso que a ausência dele passa despercebida até alguém gerar um QR.
Vincule o titular à conta
Coloque saldo nas contas
@external/BRL, criada junto com o ativo no passo 2.@external/BRL pode ser nomeada no corpo, mas nunca em um caminho. O alias contém uma barra e a rota do ledger não a decodifica, então ler o saldo dela por caminho responde 404 ou um 200 vazio. Lançar a partir dela é normal; lê-la desse jeito não é.Crie as vinte rotas contábeis
{"id": "..."}, e esse id é o que as chaves de roteamento abaixo guardam.Procure uma rota pelo título antes de criá-la. Duas rotas com o mesmo título fazem a busca seguinte escolher qualquer uma das duas, então se você provisiona o mesmo livro mais de uma vez, liste primeiro.Configure o trilho
A configuração viva do plugin fica no systemplane dele: valores que você escreve pela API de administração, que passam a valer sem um novo deploy e sem um reinício. Toda escrita é umPUT para /system/<namespace>/<key> com um corpo {"value": ...}, e 204 No Content é o sucesso — o plano não retorna corpo em uma escrita.
O tenant vem do bearer validado, nunca da URL nem do corpo.
GET /system/-/catalog lista cada chave com o tipo e a descrição dela, e GET /system/-/catalog/<namespace>/<key> descreve uma. O catálogo é a fonte da verdade; esta página é uma cópia dele, e cópias envelhecem.Escreva o vínculo de integração com a JD — o seu ISPB
tenancy/jd_integration_binding, e não existe fallback por ambiente. Enquanto a chave está vazia o plugin sobe, responde à health probe dele, parece saudável — e recusa todo pagamento em toda rota de dinheiro.O que quebra sem ele. 409 PIX-0092, “Tenant Pix integration not provisioned”. Uma bateria de ponta a ponta juntou 86 recusas desse único valor vazio; o código seguinte mais frequente na mesma execução apareceu 6 vezes. O texto da resposta pede que você contate o suporte e não nomeia a chave, então o código é o que você procura.A armadilha: o valor é uma string que contém JSON. O corpo é sempre {"value": ...}, e aqui value não é um objeto. É uma string cujo conteúdo é um documento JSON. É assim que ele é armazenado, com as aspas internas escapadas:jq fazer o escaping:organizationId nem ledgerId desta chave — o livro em que ele lança continua vindo de MIDAZ_ORGANIZATION_ID e MIDAZ_LEDGER_ID. O validador de escrita pede os três mesmo assim. Preencha os dois UUIDs com os mesmos valores que essas variáveis carregam.Duas fontes da verdade para o mesmo fato poderiam divergir sem ninguém perceber, e é por isso que a resposta em tempo de execução fica com os valores de deploy.value volta como um objeto em vez de uma string entre aspas, você escreveu a forma errada. Se volta "", a escrita não aconteceu — confira o código de status do PUT. A confirmação real é comportamental: as rotas de dinheiro que respondiam 409 PIX-0092 param de responder isso.Um ISPB malformado não pode ser armazenado por esta rota. O validador de escrita é o mesmo decodificador que a leitura usa, então um ISPB de 7 dígitos ou um UUID quebrado é recusado na hora com 400 validation_error em vez de ser descoberto no primeiro pagamento.409 PIX-0121 — “Tenant Pix integration ISPB invalid” — seguindo esta página. É o código de um vínculo que está provisionado e cujo ispb não tem 8 dígitos, e esta rota não consegue criar esse estado. Ele aparece apenas quando um valor chegou à chave por outro caminho: uma escrita direta no banco de dados do plugin ou uma escrita feita antes de o validador existir. Ele está documentado porque, se você chegar a vê-lo, a mensagem dele é a que nomeia tanto a chave quanto o campo a corrigir.409 PIX-0092, então não faça isso em um ambiente que está pagando.Escreva as vinte chaves de roteamento
tenant_policy, todas guardam uma string e todas guardam um UUID de rota que já existe no Midaz.409 PIX-0105. Isso é deliberado — recusar uma transação é melhor do que lançá-la contra uma rota indefinida. Se um fluxo específico “não funciona” e os outros funcionam, este é o primeiro lugar para olhar.204. Um perfil que o seu produto nunca exercita pode ficar vazio — aquele fluxo então recusa, que é o que você quer em vez de um lançamento em uma rota indefinida.Defina o ativo de lançamento e a conta de compensação
204 pode enganar você:O ativo de lançamento vem de MIDAZ_ASSET_ID e a conta de compensação vem de MIDAZ_EXTERNAL_ID — as duas variáveis de deploy.Os dois nomes mentem sobre o formato. Apesar do _ID:PIX-4011 e não nomeia nenhuma conta.O que quebra sem isso. 409 PIX-0106, “Tenant ledger configuration missing”. A resposta nomeia as duas metades e os dois lugares onde defini-las, então ela diz qual delas está faltando. É um código diferente de PIX-0105: um tenant pode ter todas as vinte pernas de rota corretas e ainda recusar todo lançamento porque o ativo ou a conta de compensação está sem valor.Defina a janela diária
400 em vez de ser silenciosamente ajustado ao limite.Declare se este deploy hospeda participantes indiretos
plugin-br-pix-jd.indirects/enabled declara o que o tenant é. Um participante direto simples define o valor como false.{"value":"true"} responde 400. Se este deploy liquida Pix em nome de outras instituições, defina o valor como true e siga Hospedagem de participantes indiretos — há mais um valor a provisionar antes de você poder registrar alguém, e sem ele todo registro recusa.Materialize os limites de transação com um pagamento pequeno
GET /v1/limits/available responde 404 PIX-0063, “The specified transaction limit was not found in the system. Please verify the identifier and try again.”, e GET /v1/limits responde {"data":[]}. Parece uma conta quebrada. Não é: é o estado inicial normal de uma conta que nunca transacionou.PIX-0063 nomeia o que quer que tenha sido consultado, então a lista de erros imprime a forma genérica dele — “The specified entity was not found in the system” — e esta rota preenche com transaction limit. Mesmo código, mesmo 404.Por que você não conserta isso criando algo. Não existe rota de criação. PATCH /v1/limits atualiza uma linha que já precisa existir. As linhas são materializadas por exatamente uma coisa: a verificação prévia de limite de um pagamento de saída. Na primeira vez que a conta envia um pagamento, o plugin percebe que ela não tem linhas, cria os padrões, lê de novo e segue.Então o passo é: envie um pagamento pequeno de saída. Um centavo basta, e é o que o provisionamento automatizado faz.Como conferir. GET /v1/limits vai de {"data":[]} para uma lista, e /v1/limits/available vai de 404 para 200.Este passo depende de as chaves de roteamento estarem escritas antes: ele materializa as linhas fazendo um pagamento real, e sem rota o pagamento é recusado com PIX-0105. Todo o resto desta página pode ser feito em qualquer ordem.Hospedagem de participantes indiretos
Um deploy que liquida Pix em nome de outras instituições adiciona três passos de provisionamento sobre a cadeia acima: a chave de criptografia do segredo de entrega, a postura de hospedagem e o registro de cada participante indireto. Eles estão em Hospedagem de participantes indiretos, e a numeração deles continua a desta página — passos 7 a 9. Se o seu deploy liquida apenas o Pix dos próprios clientes, o seu provisionamento acaba aqui.Como é cada passo pulado
Toda recusa abaixo é um409, menos a de limites, e nenhuma delas se resolve esperando. Elas se resolvem provisionando o valor ausente.
PIX-0092 parar de aparecer não significa que os pagamentos passam. Ele é a primeira barreira, não a última: com o vínculo no lugar, uma rota contábil vazia ainda recusa com PIX-0105, e um ativo ou uma conta de compensação ausente ainda recusa com PIX-0106. Três códigos, três causas, três correções diferentes.Não repita um 409. Repita o irmão 503 dele
Esta é a distinção que diz se o problema é a sua configuração ou a indisponibilidade de alguém, e o status a carrega.
Um 409 acima é conhecimento positivo de ausência: o trilho leu a sua configuração com sucesso e não encontrou nada ali. Apenas um operador pode fornecer o valor, então repetir a requisição não pode mudar a resposta — um cliente que respeita a semântica de nova tentativa entraria em loop para sempre contra uma condição que nunca se resolve sozinha. Cada uma dessas respostas nomeia o que definir.
A maior parte dessas condições tem um irmão 503 para o caso em que o trilho não conseguiu ler a configuração. Nada foi estabelecido sobre o que você provisionou, a resposta nomeia a dependência com falha, e repetir é o movimento certo.
PIX-0121 é um caso especial de outro jeito: você não consegue provocá-lo pela API de administração, porque o validador de escrita recusa um ispb malformado antes de ele ser armazenado. Ele aparece apenas quando um valor chegou à chave por outro caminho — veja o passo do vínculo acima.detail exato que cada código carrega, é a lista de erros do Pix JD.
Prove que a configuração está completa
Rode estas verificações em ordem. Cada uma falha por um motivo diferente, e é isso que faz a sequência valer mais do que um único teste de fumaça.- O ledger aceita uma conta. Crie uma conta descartável e apague-a. Se o livro recusar, a recusa nomeia o elo ausente. Pule isto e o mesmo problema volta depois como “conta não encontrada” dentro de um fluxo de pagamento, três camadas longe da causa. Nunca coloque saldo na conta de teste: o Midaz se recusa a apagar uma conta com saldo.
- O vínculo volta na leitura como uma string entre aspas carregando o seu ISPB, como mostrado acima.
- A consulta de alias retorna a sua conta, filtrada por documento, agência e número da conta.
- Uma rota de dinheiro para de responder
409 PIX-0092. Esta é a mesma chamada que você já estava fazendo — não é preciso nenhum aparato de teste. GET /v1/limitsretorna uma lista para uma conta que enviou o primeiro pagamento dela.
Para onde ir agora
Variáveis de ambiente
Participantes indiretos
Pix Direto via JD
Lista de erros do Pix JD
PIX-NNNN, o status dele e o texto detail que a resposta carrega.
