This page is the provisioning. What a hosted participation is, how an inbound credit reaches one, how its lifecycle behaves and every refusal it can answer are in Indirect participants.
Step 7: the delivery-secret encryption key
Why this step exists. When you register an indirect participant, you supply a delivery secret. The plugin signs every notice it sends to that institution’s endpoint with it, and it is how the institution knows the notice really came from you. That secret is stored encrypted, and the key that encrypts it does not come from the database. It comes from outside. If the key is not configured, every registration that carries a secret fails. This is not an edge case — it is the whole write surface of the indirect flow.POST is the whole recovery.
409 here means “provision it”, not “try again later”. The rail looked for the key and established that it is not there, and only an operator can put it there — so repeating the call without that change fails identically. That is why the code is a 409 and says nothing about retrying.Its sibling is 503 PIX-0123, “Indirect delivery key source unavailable”, which is what you get when the key could not be read: the custody backend refused or did not answer. There, the key is not known to be missing — the read itself did not complete — so the response names the faulting dependency and retrying is the right move. Both refuse the registration and store nothing; the pair exists so you can tell an incomplete setup from an outage.
The format: exactly 64 hex characters. It is an AES-256 key — 32 bytes — hex-encoded. That is 64 hex characters, not 63 and not 65.
An absent, blank, or malformed value all produce the same
409 PIX-0107. There is no default and no degradation to storing the secret in the clear. That is deliberate: a silent default here would store customer secrets encrypted with a key everybody knows.409 PIX-0107 to 201.
Step 8: declare that this tenant hosts indirect participants
plugin-br-pix-jd.indirects/enabled has to be true.
204 when accepted. It is a JSON boolean, unquoted: {"value":"true"} answers 400.
The management API works with the posture off, so you can register participants before you enable — what the posture gates is the money paths. The full breakdown of what each half does is in Before you register anyone.
The read fails closed. If the systemplane does not answer, if the key does not resolve, or if the value comes back the wrong type, the plugin reads it as off — never on by accident. A money path that “went back to behaving like a direct one” with nobody having touched the key is this mechanism. Look at the systemplane.
Step 9: register an indirect participant
One call runs the whole assembly: it checks the ISPB, creates the@pi_{ispb} settlement account in Midaz, and marks the participation active.
A
201 means the participation is ready to use: registration is atomic, status is always ACTIVE, and there is nothing to poll for.
The refusals, the lifecycle actions, and how to read the registry back are in Indirect participants.
The systemplane keys of the indirects namespace
Five keys, all in plugin-br-pix-jd.indirects, and all of them always exist. The three delivery and resolution keys only take effect once enabled is true, because they tune the money paths. validate_ispb_on_jd is the exception: it gates a step of registration, which works while enabled is still false.
204 when accepted, 400 when the validator refuses. Booleans and integers both go unquoted, and a value outside the range answers 400 rather than clamping silently.
Neither of the two steps that break the indirect flow on their own lives in this namespace. Identity is the systemplane key
tenancy/jd_integration_binding, and without it every payment refuses with 409 PIX-0092. The encryption key lives in a deployment variable or a secret store, and without it every registration refuses with 409 PIX-0107.
