Antes de empezar
Hablas con tres servicios, y confundirlos es el primer error más común.- Un Bearer token para el ledger, uno para el CRM y uno para el plugin. Pueden venir de audiencias distintas.
- El permiso
systemplane:writeen el token del plugin. Sin él, las escrituras de configuración responden403. SYSTEMPLANE_ENABLED=trueen el plugin. Si queda sin definir, el grupo de rutas/systemno se monta en absoluto y todas las escrituras de configuración responden404.- El ISPB de tu institución: el identificador de 8 dígitos con el que te acreditaron en BACEN.
Aprovisiona el ledger y los registros de titulares
Estos pasos se ejecutan contra Midaz y el CRM. Crean las cuentas en las que el riel registra los asientos y los registros de titulares desde los que resuelve las contrapartes.Crear la organización y el ledger
201 sin id en el cuerpo no es un éxito: nada puede referenciar lo que se creó, ni tú ni la limpieza posterior. Detente ahí en lugar de llevar un id vacío al paso siguiente.Crear el activo BRL y esperar a que aparezca
BRL.201 como 409 son buenas respuestas. Un activo se identifica por su código dentro de un ledger, así que “ya existe” es indistinguible del éxito.Aquí pasan dos cosas, y la segunda es fácil de pasar por alto:- El ledger empieza a aceptar cuentas en ese activo. Antes de esto, rechaza todas las cuentas con
0034 Asset Code Not Found. - Midaz crea la cuenta
@external/BRLjunto a él. Es la única cuenta de un libro que puede debitarse sin haber sido acreditada antes, así que de ahí sale el saldo de apertura y es la contraparte de cada liquidación con el mundo exterior.
Crear una cuenta por rol
accountId de cada llamada de negocio que haces contra el plugin. El alias (@payer) es el nombre corto con el que se lee el libro y se registra en él, y reaparece en el paso siguiente en el lugar menos esperado.Crear el titular en el CRM
typesigue la longitud del documento.NATURAL_PERSONpara un CPF (11 dígitos),LEGAL_PERSONpara un CNPJ (14). El plugin convierte este tipo en el número que se transmite a JD, así que equivocarse registra a la parte como el tipo de persona equivocado.externalIdtiene que ser el alias de la cuenta en el ledger (@payer), y el nombre del campo lo oculta. El CRM lo describe como un identificador externo de correlación, lo que se lee como opcional. Para este riel no lo es: es donde el plugin lee qué cuenta del libro pertenece al titular. Un titular sinexternalIdproduce una cuenta que se resuelve, se ve completa y falla en todos los pagos.addresses.primary.cityes obligatorio para los QR codes y Pix Automático. Es la ciudad del receptor que se imprime en el código, y el plugin se niega a generar un QR sin ella, responde422 PIX-0033y apunta apayee.city. Ninguna ruta de pago lee el campo, y por eso su ausencia pasa inadvertida hasta que alguien genera un QR.
Vincular el titular a la cuenta
Fondear las cuentas
@external/BRL, creada junto con el activo en el paso 2.@external/BRL se puede nombrar en el cuerpo pero nunca en una ruta. El alias contiene una barra y la ruta del ledger no la decodifica, así que leer su saldo por ruta responde 404 o un 200 vacío. Registrar asientos desde ella es normal; leerla de esa forma no lo es.Crear las veinte rutas contables
{"id": "..."}, y ese id es lo que guardan las claves de enrutamiento de abajo.Busca una ruta por título antes de crearla. Dos rutas con el mismo título hacen que la búsqueda siguiente tome cualquiera de las dos, así que si aprovisionas el mismo libro más de una vez, lista primero.Configura el riel
La configuración viva del plugin vive en su systemplane: valores que escribes por la API de administración y que toman efecto sin un redespliegue ni un reinicio. Cada escritura es unPUT a /system/<namespace>/<key> con un cuerpo {"value": ...}, y 204 No Content es el éxito — el plano no devuelve cuerpo en una escritura.
El tenant viene del bearer validado, nunca de la URL ni del cuerpo.
GET /system/-/catalog lista todas las claves con su tipo y descripción, y GET /system/-/catalog/<namespace>/<key> describe una. El catálogo es la fuente de verdad; esta página es una copia de él, y las copias envejecen.Escribir el vínculo de integración con JD — tu ISPB
tenancy/jd_integration_binding, y no hay fallback de entorno. Mientras la clave esté vacía el plugin arranca, responde a su sonda de salud, se ve sano — y rechaza todos los pagos en todas las rutas de dinero.Qué se rompe sin él. 409 PIX-0092, “Tenant Pix integration not provisioned”. Una batería de punta a punta juntó 86 rechazos por este único valor vacío; el código siguiente más frecuente en la misma corrida apareció 6 veces. El texto de la respuesta te pide que contactes a soporte y no nombra la clave, así que el código es lo que buscas.La trampa: el valor es una cadena que contiene JSON. El cuerpo siempre es {"value": ...}, y aquí value no es un objeto. Es una cadena cuyo contenido es un documento JSON. Así es como se guarda, con las comillas internas escapadas:jq haga el escapado:organizationId ni ledgerId de esta clave — el libro en el que registra sigue viniendo de MIDAZ_ORGANIZATION_ID y MIDAZ_LEDGER_ID. El validador de escritura pide los tres de todos modos. Completa los dos UUID con los mismos valores que llevan esas variables.Dos fuentes de verdad para el mismo hecho podrían discrepar sin que nadie lo note, y por eso la respuesta en tiempo de ejecución se queda con los valores del despliegue.value vuelve como un objeto en lugar de una cadena entre comillas, escribiste la forma equivocada. Si vuelve como "", la escritura no ocurrió — revisa el código de estado del PUT. La confirmación real es de comportamiento: las rutas de dinero que respondían 409 PIX-0092 dejan de responderlo.Un ISPB malformado no se puede guardar por esta ruta. El validador de escritura es el mismo decodificador que usa la lectura, así que un ISPB de 7 dígitos o un UUID roto se rechaza en el acto con 400 validation_error en lugar de descubrirse en el primer pago.409 PIX-0121 — “Tenant Pix integration ISPB invalid” — mientras sigues esta página. Es el código de un vínculo que sí está aprovisionado y cuyo ispb no tiene 8 dígitos, y esta ruta no puede crear ese estado. Aparece solo cuando un valor llegó a la clave por otra vía: una escritura directa a la base de datos del plugin, o una escritura hecha antes de que existiera el validador. Está documentado porque, si alguna vez lo ves, su mensaje es el que nombra tanto la clave como el campo a corregir.409 PIX-0092, así que no lo hagas en un entorno que está pagando.Escribir las veinte claves de enrutamiento
tenant_policy, todas guardan una cadena y todas guardan un UUID de ruta que ya existe en Midaz.409 PIX-0105. Eso es deliberado — rechazar una transacción es mejor que registrarla contra una ruta indefinida. Si un flujo específico “no funciona” y los demás sí, este es el primer lugar donde mirar.204. Un perfil que tu producto nunca ejercita puede quedar vacío — ese flujo entonces rechaza, que es lo que quieres en lugar de un asiento en una ruta indefinida.Definir el activo de registro y la cuenta de compensación
204 puede confundirte:El activo de registro viene de MIDAZ_ASSET_ID y la cuenta de compensación de MIDAZ_EXTERNAL_ID — las dos variables de despliegue.Los dos nombres mienten sobre su forma. A pesar del _ID:PIX-4011 y no nombra ninguna cuenta.Qué se rompe sin esto. 409 PIX-0106, “Tenant ledger configuration missing”. La respuesta nombra las dos mitades y los dos lugares donde definirlas, así que te dice cuál te falta. Es un código distinto de PIX-0105: un tenant puede tener las veinte patas de ruta correctas y aun así rechazar todos los asientos porque el activo o la cuenta de compensación están sin definir.Definir la ventana diaria
400 en lugar de recortarse en silencio al límite.Declarar si este despliegue aloja participantes indirectos
plugin-br-pix-jd.indirects/enabled declara lo que el tenant es. Un participante directo simple lo define en false.{"value":"true"} responde 400. Si este despliegue liquida Pix por cuenta de otras instituciones, defínelo en true y sigue Alojar participantes indirectos — hay un valor más para aprovisionar antes de poder registrar a alguien, y sin él todos los registros se rechazan.Materializar los límites de transacción con un pago pequeño
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.”, y GET /v1/limits responde {"data":[]}. Parece una cuenta rota. No lo es: es el estado inicial normal de una cuenta que nunca transaccionó.PIX-0063 nombra la cosa que se haya buscado, así que la lista de errores imprime su forma genérica — “The specified entity was not found in the system” — y esta ruta completa transaction limit. Mismo código, mismo 404.Por qué no puedes arreglarlo creando algo. No hay ruta de creación. PATCH /v1/limits actualiza una fila que ya tiene que existir. Las filas las materializa exactamente una cosa: la verificación previa de límites de un pago saliente. La primera vez que la cuenta envía un pago, el plugin nota que no tiene filas, crea los valores predeterminados, los vuelve a leer y sigue adelante.Así que el paso es: envía un pago saliente pequeño. Un centavo alcanza, y es lo que hace el aprovisionamiento automatizado.Cómo verificar. GET /v1/limits pasa de {"data":[]} a una lista, y /v1/limits/available pasa de 404 a 200.Este paso depende de que las claves de enrutamiento estén escritas primero: materializa las filas haciendo un pago real, y sin ruta el pago se rechaza con PIX-0105. Todo lo demás en esta página se puede hacer en cualquier orden.Alojar participantes indirectos
Un despliegue que liquida Pix por cuenta de otras instituciones agrega tres pasos de aprovisionamiento sobre la cadena de arriba: la clave de cifrado del secreto de entrega, la postura de alojamiento y el registro de cada participante indirecto. Están en Alojar participantes indirectos, y su numeración continúa la de esta página — pasos 7 a 9. Si tu despliegue liquida solo los Pix de sus propios clientes, tu aprovisionamiento termina aquí.Cómo se ve cada paso omitido
Cada rechazo de abajo es un409 salvo el de los límites, y ninguno se resuelve esperando. Se resuelven aprovisionando el valor que falta.
PIX-0092 deje de aparecer no significa que los pagos pasen. Es la primera barrera, no la última: con el vínculo en su lugar, una ruta contable vacía sigue rechazando con PIX-0105, y un activo o una cuenta de compensación ausente sigue rechazando con PIX-0106. Tres códigos, tres causas, tres correcciones distintas.No reintentes un 409. Sí reintenta su hermano 503
Esta es la distinción que te dice si el problema es tu configuración o la caída de alguien, y el estado la lleva.
Un 409 de arriba es conocimiento positivo de ausencia: el riel leyó tu configuración con éxito y no encontró nada ahí. Solo un operador puede aportar el valor, así que repetir la solicitud no puede cambiar la respuesta — un cliente que respeta la semántica de reintentos entraría en un bucle infinito contra una condición que nunca se resuelve sola. Cada una de esas respuestas nombra qué definir.
La mayoría de esas condiciones tiene un hermano 503 para el caso en que el riel no pudo leer la configuración en absoluto. No se estableció nada sobre lo que aprovisionaste, la respuesta nombra la dependencia que falla y reintentar es lo correcto.
PIX-0121 es un caso especial de otra forma: no puedes provocarlo por la API de administración, porque el validador de escritura rechaza un ispb malformado antes de guardarlo. Aparece solo cuando un valor llegó a la clave por otra vía — mira el paso del vínculo de arriba.detail exacto que lleva cada código, es la lista de errores de Pix JD.
Comprueba que la configuración está completa
Ejecuta estas comprobaciones en orden. Cada una falla por una razón distinta, y eso es lo que hace que valga la pena correr la secuencia en lugar de una sola prueba de humo.- El ledger acepta una cuenta. Crea una cuenta desechable y elimínala. Si el libro rechaza, el rechazo nombra el eslabón que falta. Sáltate esto y el mismo problema vuelve más tarde como “cuenta no encontrada” dentro de un flujo de pago, a tres capas de su causa. Nunca fondees la cuenta de prueba: Midaz se niega a eliminar una cuenta con saldo.
- El vínculo vuelve como una cadena entre comillas que lleva tu ISPB, como se muestra arriba.
- La consulta de alias devuelve tu cuenta, filtrada por documento, sucursal y número de cuenta.
- Una ruta de dinero deja de responder
409 PIX-0092. Es la misma llamada que ya hacías — no hace falta un arnés de pruebas. GET /v1/limitsdevuelve una lista para una cuenta que envió su primer pago.
A dónde ir después
Variables de entorno
Participantes indirectos
Pix Directo vía JD
Lista de errores de Pix JD
PIX-NNNN, su estado y el texto detail que lleva la respuesta.
