> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Retry indirect provisioning

> Re-runs the provisioning saga, from the top, for an indirect still in PENDING_PROVISIONING. Call it after a registration (or an earlier retry) came back with provisioning.failedStep set — that field names where the saga stopped: validateISPB, createPIAccount or markActive.

Every step is idempotent, so repeating this is safe: the ISPB check is pure, the `@pi_{ispb}` account creation reuses the existing account when the alias is already taken (including the account a previously CLOSED indirect left behind, which is unblocked and re-enabled), and the final step is guarded by the lifecycle state machine. On success the row is ACTIVE, the failed-step marker is cleared, and the participant becomes routable. The response status is 202, but the saga has ALREADY run when it returns — read status and provisioning.failedStep off the body rather than treating the 202 as "accepted, outcome later".

Unlike registration, a retry SURFACES a saga failure as an error instead of a success body: it is an explicit operator action expecting a verdict, and the row is left in PENDING_PROVISIONING for another attempt. Refusals: 409 PIX-0097 when the indirect is not in PENDING_PROVISIONING — ACTIVE means there is nothing to retry, and SUSPENDED/CLOSED are not retryable states; 404 PIX-0095 for an unknown id; 422 PIX-0098 when indirectId is not a valid UUID, or when JD directory validation is enabled and the ISPB is not a registered SPI participant there; 502 PIX-0099 when a step failed on a retryable infrastructure fault, naming the step in the message — the indirect stays pending, so retry.



## OpenAPI

````yaml /en/openapi/v3-current/pix.yaml post /v1/indirects/{indirectId}/provisioning/retry
openapi: 3.1.0
info:
  description: Brazilian PIX Direct (DICT + SPI) plugin API.
  title: plugin-br-pix-jd
  version: 1.0.0
servers: []
security:
  - BearerAuth: []
paths:
  /v1/indirects/{indirectId}/provisioning/retry:
    post:
      tags:
        - Indirects
      summary: Retry indirect provisioning
      description: >-
        Re-runs the provisioning saga, from the top, for an indirect still in
        PENDING_PROVISIONING. Call it after a registration (or an earlier retry)
        came back with provisioning.failedStep set — that field names where the
        saga stopped: validateISPB, createPIAccount or markActive.


        Every step is idempotent, so repeating this is safe: the ISPB check is
        pure, the `@pi_{ispb}` account creation reuses the existing account when
        the alias is already taken (including the account a previously CLOSED
        indirect left behind, which is unblocked and re-enabled), and the final
        step is guarded by the lifecycle state machine. On success the row is
        ACTIVE, the failed-step marker is cleared, and the participant becomes
        routable. The response status is 202, but the saga has ALREADY run when
        it returns — read status and provisioning.failedStep off the body rather
        than treating the 202 as "accepted, outcome later".


        Unlike registration, a retry SURFACES a saga failure as an error instead
        of a success body: it is an explicit operator action expecting a
        verdict, and the row is left in PENDING_PROVISIONING for another
        attempt. Refusals: 409 PIX-0097 when the indirect is not in
        PENDING_PROVISIONING — ACTIVE means there is nothing to retry, and
        SUSPENDED/CLOSED are not retryable states; 404 PIX-0095 for an unknown
        id; 422 PIX-0098 when indirectId is not a valid UUID, or when JD
        directory validation is enabled and the ISPB is not a registered SPI
        participant there; 502 PIX-0099 when a step failed on a retryable
        infrastructure fault, naming the step in the message — the indirect
        stays pending, so retry.
      operationId: retryIndirectProvisioning
      parameters:
        - description: The indirect participant id.
          in: path
          name: indirectId
          required: true
          schema:
            description: The indirect participant id.
            examples:
              - 018f2b7c-0000-7000-8000-000000000000
            type: string
      responses:
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Indirect'
          description: Accepted
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Error
components:
  schemas:
    Indirect:
      additionalProperties: false
      properties:
        createdAt:
          description: Creation timestamp (UTC).
          format: date-time
          type: string
        delivery:
          $ref: '#/components/schemas/IndirectDelivery'
          description: Delivery endpoint (secret redacted).
        indirectId:
          description: The indirect participant id (routing identifier).
          examples:
            - 018f2b7c-0000-7000-8000-000000000000
          type: string
        ispb:
          description: The indirect PSP's ISPB.
          examples:
            - '12345678'
          type: string
        messagingMode:
          description: Delivery mode.
          examples:
            - raw
          type: string
        name:
          description: Display name.
          examples:
            - Indirect PSP Ltda
          type: string
        piAccountAlias:
          description: The derived @pi_{ispb} Midaz account alias.
          examples:
            - '@pi_12345678'
          type: string
        provisioning:
          $ref: '#/components/schemas/IndirectProvisioning'
          description: Provisioning-saga state.
        qrCertificate:
          $ref: '#/components/schemas/IndirectQRCertificate'
          description: Own-QR-code certificate configuration.
        status:
          description: Lifecycle status.
          examples:
            - ACTIVE
          type: string
        updatedAt:
          description: Last-update timestamp (UTC).
          format: date-time
          type: string
      required:
        - indirectId
        - name
        - ispb
        - status
        - piAccountAlias
        - messagingMode
        - delivery
        - qrCertificate
        - provisioning
        - createdAt
        - updatedAt
      type: object
    Detail:
      additionalProperties: false
      properties:
        code:
          description: >-
            Stable, machine-readable domain error code scoped to the emitting
            service (format: <SERVICE>-NNNN).
          examples:
            - ERR-0001
          type: string
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
        upstream:
          $ref: '#/components/schemas/Upstream'
          description: >-
            RFC 9457 extension member: the error a proxied third-party provider
            reported. Absent unless the emitting service explicitly surfaced
            one.
      type: object
    IndirectDelivery:
      additionalProperties: false
      properties:
        endpointUrl:
          description: The HTTPS delivery endpoint.
          examples:
            - https://indirect.example.com/pix
          type: string
        secret:
          description: Always redacted.
          examples:
            - '***'
          type: string
      required:
        - endpointUrl
        - secret
      type: object
    IndirectProvisioning:
      additionalProperties: false
      properties:
        failedStep:
          description: The saga step that last failed, or null when clean.
          examples:
            - createPIAccount
          type:
            - string
            - 'null'
      required:
        - failedStep
      type: object
    IndirectQRCertificate:
      additionalProperties: false
      properties:
        ownCertificate:
          description: >-
            Whether the indirect hosts the dynamic-QR JWS/JWKS under its own
            certificate. False means it falls back to the direct participant.
          examples:
            - true
          type: boolean
        publicBaseUrl:
          description: >-
            The indirect's scheme-less public base URL for QR payload locations.
            Empty when ownCertificate is false.
          examples:
            - qr.indirect.example.com/pix
          type: string
      required:
        - ownCertificate
        - publicBaseUrl
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    Upstream:
      additionalProperties: false
      properties:
        code:
          description: The upstream provider's own error code, verbatim.
          examples:
            - E4001
          type: string
        message:
          description: >-
            The upstream provider's own error message, verbatim (bounded, never
            its raw response body).
          examples:
            - account not found at provider
          type: string
      type: object
  securitySchemes:
    BearerAuth:
      bearerFormat: JWT
      description: JWT bearer token issued by the identity provider.
      scheme: bearer
      type: http

````