{
  "components": {
    "schemas": {
      "com.baobab.pispi.apps.api.AliasBulkResource$BulkView": {
        "properties": {
          "bulk": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$Summary"
          },
          "estimatedEndAt": {
            "format": "date-time",
            "type": "string"
          },
          "estimatedSeconds": {
            "format": "int64",
            "type": "integer"
          },
          "ratePerSecond": {
            "format": "double",
            "type": "number"
          },
          "rateSource": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasBulkResource$DeleteRequest": {
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$LineRequest"
            },
            "type": "array"
          },
          "reason": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasBulkResource$LineRequest": {
        "properties": {
          "account": {
            "type": "string"
          },
          "client": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "compte": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "fallbackType": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "ref": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasBulkResource$SubmitRequest": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$LineRequest"
            },
            "type": "array"
          },
          "reference": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasCategoryMapResource$CreateRequest": {
        "properties": {
          "copyFrom": {
            "format": "uuid",
            "type": "string"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasCategoryMapResource$DecisionRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasCategoryMapResource$TestRequest": {
        "properties": {
          "cbsValue": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$AliasDto": {
        "properties": {
          "cle": {
            "type": "string"
          },
          "shid": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$AliasView": {
        "properties": {
          "alias": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$AliasDto"
          },
          "client": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$ClientDto"
          },
          "compte": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$CompteDto"
          },
          "dateCreation": {
            "type": "string"
          },
          "dateModification": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$ClaimAcceptance": {
        "properties": {
          "actionAuteur": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$ClaimView": {
        "properties": {
          "actionAuteur": {
            "type": "string"
          },
          "actionDate": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "dateCreation": {
            "type": "string"
          },
          "dateModification": {
            "type": "string"
          },
          "dateVerrouillage": {
            "type": "string"
          },
          "detenteur": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "revendicateur": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$ClientDto": {
        "properties": {
          "adresse": {
            "type": "string"
          },
          "categorie": {
            "type": "string"
          },
          "categorieEntreprise": {
            "type": "string"
          },
          "codeActivite": {
            "type": "string"
          },
          "codePostale": {
            "type": "string"
          },
          "dateNaissance": {
            "type": "string"
          },
          "denominationSociale": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "genre": {
            "type": "string"
          },
          "identificationFiscale": {
            "type": "string"
          },
          "identificationNationale": {
            "type": "string"
          },
          "identificationRCCM": {
            "type": "string"
          },
          "nationalite": {
            "type": "string"
          },
          "nom": {
            "type": "string"
          },
          "nomMere": {
            "type": "string"
          },
          "numeroPasseport": {
            "type": "string"
          },
          "paysNaissance": {
            "type": "string"
          },
          "paysResidence": {
            "type": "string"
          },
          "photo": {
            "type": "string"
          },
          "raisonSociale": {
            "type": "string"
          },
          "telephone": {
            "type": "string"
          },
          "ville": {
            "type": "string"
          },
          "villeNaissance": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$CompteDto": {
        "properties": {
          "dateOuverture": {
            "type": "string"
          },
          "iban": {
            "type": "string"
          },
          "other": {
            "type": "string"
          },
          "participant": {
            "type": "string"
          },
          "preConfirmation": {
            "type": "boolean"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$CreateRequest": {
        "properties": {
          "alias": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$AliasDto"
          },
          "client": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$ClientDto"
          },
          "compte": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$CompteDto"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasPayloads$UpdateRequest": {
        "properties": {
          "client": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$ClientDto"
          },
          "compte": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$CompteDto"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$Initiation": {
        "properties": {
          "aliasKey": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "expiresAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "operation": {
            "enum": [
              "CREATE",
              "UPDATE",
              "DELETE",
              "CLAIM"
            ],
            "type": "string"
          },
          "resolvedAt": {
            "format": "date-time",
            "type": "string"
          },
          "result": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "state": {
            "enum": [
              "PENDING",
              "EXECUTING",
              "CONFIRMED",
              "CANCELLED",
              "EXPIRED",
              "UNKNOWN"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$InitiationRequest": {
        "properties": {
          "demande": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "key": {
            "type": "string"
          },
          "operation": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$LocalSearch": {
        "properties": {
          "count": {
            "format": "int32",
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.model.AliasLocalView"
            },
            "type": "array"
          },
          "source": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$OtpRequest": {
        "properties": {
          "account": {
            "type": "string"
          },
          "operation": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$PendingClaim": {
        "properties": {
          "aliasKey": {
            "type": "string"
          },
          "autoAcceptAt": {
            "format": "date-time",
            "type": "string"
          },
          "claimId": {
            "type": "string"
          },
          "closureDeadlineAt": {
            "format": "date-time",
            "type": "string"
          },
          "customerNotifiedAt": {
            "format": "date-time",
            "type": "string"
          },
          "receivedAt": {
            "format": "date-time",
            "type": "string"
          },
          "responseDeadlineAt": {
            "format": "date-time",
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.AliasResource$PiRacSearch": {
        "properties": {
          "alias": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$AliasView"
          },
          "source": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferInitiationResource$InitiationItem": {
        "properties": {
          "payee": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferInitiationResource$Payee"
          },
          "payment": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$ConfirmRequest"
          }
        },
        "required": [
          "payee",
          "payment"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferInitiationResource$InitiationRequest": {
        "properties": {
          "bulkReference": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferInitiationResource$InitiationItem"
            },
            "type": "array"
          }
        },
        "required": [
          "bulkReference",
          "items"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferInitiationResource$Payee": {
        "properties": {
          "accountId": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "creditorAgent": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$BatchPage": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchSummary"
            },
            "type": "array"
          },
          "page": {
            "format": "int32",
            "type": "integer"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          },
          "totalPages": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$BatchResponse": {
        "properties": {
          "batchId": {
            "format": "uuid",
            "type": "string"
          },
          "bulkReference": {
            "type": "string"
          },
          "confirmedAt": {
            "format": "date-time",
            "type": "string"
          },
          "counters": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.domain.PaymentBatchStatus$Counters"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "mode": {
            "enum": [
              "DIRECT",
              "TWO_STEP"
            ],
            "type": "string"
          },
          "payments": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$PaymentStatus"
            },
            "type": "array"
          },
          "state": {
            "enum": [
              "SEARCHING",
              "READY",
              "CONFIRMED",
              "CANCELLED"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "IN_PROGRESS",
              "COMPLETED",
              "PARTIALLY_COMPLETED",
              "FAILED"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$BatchSummary": {
        "properties": {
          "batchId": {
            "format": "uuid",
            "type": "string"
          },
          "bulkReference": {
            "type": "string"
          },
          "confirmedAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "itemCount": {
            "format": "int32",
            "type": "integer"
          },
          "mode": {
            "enum": [
              "DIRECT",
              "TWO_STEP"
            ],
            "type": "string"
          },
          "state": {
            "enum": [
              "SEARCHING",
              "READY",
              "CONFIRMED",
              "CANCELLED"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$BulkRequest": {
        "properties": {
          "bulkReference": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$SubmitRequest"
            },
            "type": "array"
          }
        },
        "required": [
          "bulkReference",
          "items"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$BulkResponse": {
        "properties": {
          "accepted": {
            "format": "int32",
            "type": "integer"
          },
          "batchId": {
            "format": "uuid",
            "type": "string"
          },
          "bulkReference": {
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$ItemResult"
            },
            "type": "array"
          },
          "refused": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$ItemResult": {
        "properties": {
          "businessReference": {
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "replayed": {
            "type": "boolean"
          },
          "rule": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.BulkTransferResource$PaymentStatus": {
        "properties": {
          "accountingStatus": {
            "type": "string"
          },
          "businessReference": {
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "lastError": {
            "type": "string"
          },
          "position": {
            "format": "int32",
            "type": "integer"
          },
          "refusalMessage": {
            "type": "string"
          },
          "refusalRule": {
            "type": "string"
          },
          "status": {
            "enum": [
              "REFUSED",
              "SEARCHING",
              "READY",
              "IN_PROGRESS",
              "SUCCEEDED",
              "FAILED"
            ],
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          },
          "transferStatus": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsDeadLetterResource$ReplayRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsDeadLetterService$DeadLetter": {
        "properties": {
          "attempts": {
            "format": "int32",
            "type": "integer"
          },
          "commandId": {
            "format": "uuid",
            "type": "string"
          },
          "deadLetteredAt": {
            "format": "date-time",
            "type": "string"
          },
          "failureClass": {
            "type": "string"
          },
          "firstFailureAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          },
          "lastError": {
            "type": "string"
          },
          "lastFailureAt": {
            "format": "date-time",
            "type": "string"
          },
          "operation": {
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "replayed": {
            "type": "boolean"
          },
          "traceId": {
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsDeadLetterService$ReplayResult": {
        "properties": {
          "deadLetterId": {
            "format": "uuid",
            "type": "string"
          },
          "operation": {
            "type": "string"
          },
          "operator": {
            "type": "string"
          },
          "replayedAt": {
            "format": "date-time",
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsSemanticMapResource$CreateRequest": {
        "properties": {
          "copyFrom": {
            "format": "uuid",
            "type": "string"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Rule"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsSemanticMapResource$DecisionRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CbsSemanticMapResource$TestRequest": {
        "properties": {
          "cbsValue": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "IDENTIFICATION_TYPE",
              "ACCOUNT_STANDING",
              "PAYER_REJECT_REASON",
              "PAYEE_REJECT_REASON"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.CustomerNotificationResource$Evidence": {
        "properties": {
          "sentAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "sentAt"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.FeeRuleResource$ActivateRequest": {
        "properties": {
          "replaceRuleId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.FeeRuleResource$DeactivateRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.FeeRuleResource$DuplicateRequest": {
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.IdentityVerificationResource$HolderResponse": {
        "properties": {
          "accountType": {
            "type": "string"
          },
          "birthCity": {
            "type": "string"
          },
          "birthCountry": {
            "type": "string"
          },
          "birthDate": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id1": {
            "type": "string"
          },
          "id2": {
            "type": "string"
          },
          "scheme1": {
            "type": "string"
          },
          "scheme2": {
            "type": "string"
          },
          "town": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.IdentityVerificationResource$VerificationRequest": {
        "properties": {
          "accountId": {
            "maxLength": 34,
            "minLength": 0,
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "iban": {
            "type": "boolean"
          },
          "payeeAgent": {
            "type": "string"
          }
        },
        "required": [
          "accountId",
          "payeeAgent"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.IdentityVerificationResource$VerificationResponse": {
        "properties": {
          "accountId": {
            "type": "string"
          },
          "answeredAt": {
            "format": "date-time",
            "type": "string"
          },
          "holder": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IdentityVerificationResource$HolderResponse"
          },
          "iban": {
            "type": "boolean"
          },
          "partyCountry": {
            "type": "string"
          },
          "partyName": {
            "type": "string"
          },
          "payeeAgent": {
            "type": "string"
          },
          "piRejectionReason": {
            "type": "string"
          },
          "reasonCode": {
            "type": "string"
          },
          "requestedAt": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "verificationId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.IssuedPaymentRequestResource$CreateRequest": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "amountModifiable": {
            "type": "boolean"
          },
          "bulkReference": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "expiry": {
            "format": "date-time",
            "type": "string"
          },
          "initiatingParty": {
            "maxLength": 140,
            "minLength": 0,
            "type": "string"
          },
          "lines": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$LineRequest"
            },
            "type": "array"
          },
          "payee": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IssuedPaymentRequestResource$PartyRequest"
          },
          "payer": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IssuedPaymentRequestResource$PartyRequest"
          },
          "payerAlias": {
            "type": "string"
          },
          "paymentInformationId": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "rebateAmount": {
            "type": "number"
          },
          "rebateRate": {
            "type": "number"
          },
          "remittanceInformation": {
            "maxLength": 140,
            "minLength": 0,
            "type": "string"
          },
          "requestedExecution": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "amount",
          "channel",
          "payee"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.IssuedPaymentRequestResource$PartyRequest": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountType": {
            "type": "string"
          },
          "agent": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "identification": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "town": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.MailNotificationOpsResource$ResumeRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$BulkheadView": {
        "properties": {
          "availableConcurrentCalls": {
            "format": "int32",
            "type": "integer"
          },
          "maxConcurrentCalls": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$CallMetricsView": {
        "properties": {
          "bulkheadRejected": {
            "format": "int64",
            "type": "integer"
          },
          "failure": {
            "format": "int64",
            "type": "integer"
          },
          "lastDurationMillis": {
            "format": "int64",
            "type": "integer"
          },
          "rateLimited": {
            "format": "int64",
            "type": "integer"
          },
          "slow": {
            "format": "int64",
            "type": "integer"
          },
          "success": {
            "format": "int64",
            "type": "integer"
          },
          "timeout": {
            "format": "int64",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$DependencyView": {
        "properties": {
          "baseUrl": {
            "type": "string"
          },
          "bulkhead": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$BulkheadView"
          },
          "circuitBreaker": {
            "type": "string"
          },
          "configured": {
            "type": "boolean"
          },
          "metrics": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$CallMetricsView"
          },
          "rateLimiter": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$RateLimiterView"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$KafkaView": {
        "properties": {
          "cbsGroup": {
            "type": "string"
          },
          "cbsRetry": {
            "$ref": "#/components/schemas/com.baobab.pispi.platform.messaging.service.CbsDeliveryStatsService$CbsDeliveryStats"
          },
          "cbsTopic": {
            "type": "string"
          },
          "piOutboundGroup": {
            "type": "string"
          },
          "piOutboundTopic": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$ParticipantIsolationView": {
        "properties": {
          "cbs": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$DependencyView"
          },
          "kafka": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$KafkaView"
          },
          "overallStatus": {
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "piRac": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$DependencyView"
          },
          "piSpi": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$DependencyView"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantIsolationOpsService$RateLimiterView": {
        "properties": {
          "availableTokens": {
            "format": "double",
            "type": "number"
          },
          "burstCapacity": {
            "format": "int32",
            "type": "integer"
          },
          "rateLimitRps": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantOperationsResource$BreakRequest": {
        "properties": {
          "indirectCode": {
            "pattern": "(CI|SN|ML|BF|BJ|TG|NE|GW)[BCDF][0-9]{3}",
            "type": "string"
          }
        },
        "required": [
          "indirectCode"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantOperationsResource$MaintenanceRequest": {
        "properties": {
          "active": {
            "type": "boolean"
          },
          "description": {
            "maxLength": 1000,
            "minLength": 0,
            "type": "string"
          },
          "startsAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "active"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ParticipantOperationsResource$SponsorshipRequest": {
        "properties": {
          "indirectCode": {
            "pattern": "(CI|SN|ML|BF|BJ|TG|NE|GW)[BCDF][0-9]{3}",
            "type": "string"
          },
          "limit": {
            "minimum": 1,
            "type": "number"
          },
          "sponsorCode": {
            "pattern": "(CI|SN|ML|BF|BJ|TG|NE|GW)[BCDF][0-9]{3}",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentInitiationResource$ConfirmRequest": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "businessReference": {
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "creditorAccountType": {
            "type": "string"
          },
          "creditorClientType": {
            "type": "string"
          },
          "creditorCountry": {
            "type": "string"
          },
          "creditorIdentification": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest"
          },
          "creditorTown": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "debtorAccount": {
            "type": "string"
          },
          "debtorAccountType": {
            "type": "string"
          },
          "debtorAgent": {
            "type": "string"
          },
          "debtorClientType": {
            "type": "string"
          },
          "debtorCountry": {
            "type": "string"
          },
          "debtorIdentification": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest"
          },
          "debtorLatitude": {
            "type": "number"
          },
          "debtorLongitude": {
            "type": "number"
          },
          "debtorName": {
            "type": "string"
          },
          "debtorTown": {
            "type": "string"
          },
          "merchantTransactionId": {
            "type": "string"
          },
          "remittanceInformation": {
            "maxLength": 140,
            "minLength": 0,
            "type": "string"
          },
          "serviceLevel": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "amount",
          "businessReference",
          "channel",
          "debtorAccount",
          "type"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentInitiationResource$InitiationResponse": {
        "properties": {
          "confirmedAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "method": {
            "type": "string"
          },
          "payee": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$PayeeResponse"
          },
          "resolvedAt": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentInitiationResource$PayeeResponse": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountType": {
            "type": "string"
          },
          "agent": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "town": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentInitiationResource$StartRequest": {
        "properties": {
          "accountId": {
            "description": "Compte du payé ; exige creditorAgent et exclut alias.",
            "type": "string"
          },
          "alias": {
            "description": "Alias du payé ; alternative à accountId.",
            "example": "<alias de recette>",
            "type": "string"
          },
          "creditorAgent": {
            "description": "Code membre du participant payé, requis avec accountId.",
            "type": "string"
          },
          "iban": {
            "description": "Détecté depuis accountId si absent ; doit rester cohérent avec le participant payé.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentRequestViews$LineRequest": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "fee": {
            "type": "number"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "amount",
          "type"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentRequestViews$PartyView": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountType": {
            "type": "string"
          },
          "agent": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "town": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.PaymentRequestViews$RequestView": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "amountModifiable": {
            "type": "boolean"
          },
          "amountToPay": {
            "type": "number"
          },
          "bulkReference": {
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "controlCode": {
            "type": "string"
          },
          "controlResult": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "direction": {
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "expiry": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "lines": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$LineRequest"
            },
            "type": "array"
          },
          "payee": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$PartyView"
          },
          "payer": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$PartyView"
          },
          "paymentInformationId": {
            "type": "string"
          },
          "piRejectionReason": {
            "type": "string"
          },
          "rebateAmount": {
            "type": "number"
          },
          "rebateRate": {
            "type": "number"
          },
          "rejectReason": {
            "type": "string"
          },
          "rejectedBy": {
            "type": "string"
          },
          "remittanceInformation": {
            "type": "string"
          },
          "requestedExecution": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.QrCodeResource$DecodeRequest": {
        "properties": {
          "payload": {
            "type": "string"
          }
        },
        "required": [
          "payload"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.QrCodeResource$GenerateRequest": {
        "properties": {
          "alias": {
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "clientType": {
            "type": "string"
          },
          "dynamic": {
            "type": "boolean"
          },
          "txId": {
            "type": "string"
          }
        },
        "required": [
          "alias",
          "clientType"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.QrCodeResource$QrCodeResponse": {
        "properties": {
          "alias": {
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "channel": {
            "type": "string"
          },
          "countryCode": {
            "type": "string"
          },
          "dynamic": {
            "type": "boolean"
          },
          "payload": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.QrCodeResource$QrInitiationResponse": {
        "properties": {
          "initiation": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$InitiationResponse"
          },
          "qr": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$QrCodeResponse"
          },
          "suggested": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$SuggestedConfirmation"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.QrCodeResource$SuggestedConfirmation": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "channel": {
            "type": "string"
          },
          "merchantTransactionId": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ReceivedPaymentRequestResource$AcceptanceRequest": {
        "properties": {
          "amount": {
            "type": "number"
          },
          "businessReference": {
            "maxLength": 140,
            "minLength": 0,
            "type": "string"
          },
          "debtorAccountType": {
            "pattern": "CACC|SVGS|LLSV|TRAN|VACC|TAXE|TRAL",
            "type": "string"
          },
          "debtorClientType": {
            "pattern": "[PBGC]",
            "type": "string"
          },
          "debtorCountry": {
            "pattern": "[A-Z]{2}",
            "type": "string"
          },
          "debtorLatitude": {
            "maximum": 90,
            "minimum": -90,
            "type": "number"
          },
          "debtorLongitude": {
            "maximum": 180,
            "minimum": -180,
            "type": "number"
          },
          "debtorTown": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "payLater": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ReceivedPaymentRequestResource$RejectionRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ReconciliationResource$CaseView": {
        "properties": {
          "accountingStatus": {
            "enum": [
              "NOT_STARTED",
              "RESERVATION_PENDING",
              "RESERVED",
              "PREPOSITION_PENDING",
              "PREPOSITIONED",
              "POSTING_PENDING",
              "POSTED",
              "RELEASE_PENDING",
              "RELEASED",
              "ACCOUNTING_EXCEPTION"
            ],
            "type": "string"
          },
          "ageSeconds": {
            "format": "int64",
            "type": "integer"
          },
          "amount": {
            "type": "number"
          },
          "anomalyType": {
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "fundsRetained": {
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "openedAt": {
            "format": "date-time",
            "type": "string"
          },
          "returnAccountingStatus": {
            "enum": [
              "NOT_STARTED",
              "RESERVATION_PENDING",
              "RESERVED",
              "PREPOSITION_PENDING",
              "PREPOSITIONED",
              "POSTING_PENDING",
              "POSTED",
              "RELEASE_PENDING",
              "RELEASED",
              "ACCOUNTING_EXCEPTION"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "RECEIVED",
              "VALIDATING",
              "RESERVING",
              "READY_TO_SEND",
              "SUBMITTING",
              "PENDING_CONFIRMATION",
              "UNKNOWN",
              "SUCCEEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ScheduledPaymentResource$CreateRequest": {
        "properties": {
          "endAt": {
            "format": "date-time",
            "type": "string"
          },
          "firstRunAt": {
            "format": "date-time",
            "type": "string"
          },
          "initiationId": {
            "format": "uuid",
            "type": "string"
          },
          "occurrences": {
            "format": "int32",
            "type": "integer"
          },
          "period": {
            "type": "string"
          },
          "terms": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$ConfirmRequest"
          }
        },
        "required": [
          "firstRunAt",
          "initiationId",
          "terms"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ScheduledPaymentResource$ExecutionResponse": {
        "properties": {
          "dueAt": {
            "format": "date-time",
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "initiationId": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ScheduledPaymentResource$PayeeResponse": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountType": {
            "type": "string"
          },
          "agent": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "town": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.ScheduledPaymentResource$ScheduledPaymentResponse": {
        "properties": {
          "alias": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "endAt": {
            "format": "date-time",
            "type": "string"
          },
          "executions": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$ExecutionResponse"
            },
            "type": "array"
          },
          "executionsStarted": {
            "format": "int32",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "method": {
            "type": "string"
          },
          "nextRunAt": {
            "format": "date-time",
            "type": "string"
          },
          "payee": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$PayeeResponse"
          },
          "period": {
            "type": "string"
          },
          "remainingOccurrences": {
            "format": "int32",
            "type": "integer"
          },
          "status": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TenantConfigurationOpsResource$AvailabilityUpdate": {
        "properties": {
          "account": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "version": {
            "format": "int64",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "account",
          "alias",
          "version"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TenantCredentialsOpsResource$CredentialView": {
        "properties": {
          "daysLeft": {
            "format": "int64",
            "type": "integer"
          },
          "location": {
            "type": "string"
          },
          "notAfter": {
            "format": "date-time",
            "type": "string"
          },
          "notBefore": {
            "format": "date-time",
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "serialNumber": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "usage": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TenantCredentialsOpsResource$ReloadView": {
        "properties": {
          "error": {
            "type": "string"
          },
          "result": {
            "type": "string"
          },
          "rotatedCredentials": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "uniqueItems": true
          },
          "rotatedSecretReferences": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "uniqueItems": true
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$CancellationDecisionRequest": {
        "properties": {
          "accepted": {
            "type": "boolean"
          },
          "rejectionCode": {
            "type": "string"
          }
        },
        "required": [
          "accepted"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$IdentifierRequest": {
        "properties": {
          "id": {
            "type": "string"
          },
          "scheme": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "scheme"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest": {
        "properties": {
          "birthCity": {
            "type": "string"
          },
          "birthCountry": {
            "type": "string"
          },
          "birthDate": {
            "format": "date",
            "type": "string"
          },
          "identifiers": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$IdentifierRequest"
            },
            "maxItems": 2,
            "minItems": 0,
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$PiDetailsResponse": {
        "properties": {
          "acceptanceDateTime": {
            "format": "date-time",
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "creditorAccountType": {
            "type": "string"
          },
          "creditorAlias": {
            "type": "string"
          },
          "creditorClientType": {
            "type": "string"
          },
          "creditorCountry": {
            "type": "string"
          },
          "creditorTown": {
            "type": "string"
          },
          "debtorAccountType": {
            "type": "string"
          },
          "debtorClientType": {
            "type": "string"
          },
          "debtorCountry": {
            "type": "string"
          },
          "debtorLatitude": {
            "type": "number"
          },
          "debtorLongitude": {
            "type": "number"
          },
          "debtorTown": {
            "type": "string"
          },
          "merchantTransactionId": {
            "type": "string"
          },
          "remittanceInformation": {
            "type": "string"
          },
          "serviceLevel": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$ReasonRequest": {
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$ReturnRequest": {
        "properties": {
          "initiatedBy": {
            "enum": [
              "CUSTOMER",
              "PARTICIPANT"
            ],
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$SubmitRequest": {
        "properties": {
          "acceptanceDateTime": {
            "format": "date-time",
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "bulkReference": {
            "maxLength": 35,
            "minLength": 0,
            "type": "string"
          },
          "businessReference": {
            "type": "string"
          },
          "channel": {
            "type": "string"
          },
          "creditorAccount": {
            "type": "string"
          },
          "creditorAccountType": {
            "type": "string"
          },
          "creditorAgent": {
            "type": "string"
          },
          "creditorAlias": {
            "type": "string"
          },
          "creditorClientType": {
            "type": "string"
          },
          "creditorCountry": {
            "type": "string"
          },
          "creditorIdentification": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest"
          },
          "creditorName": {
            "type": "string"
          },
          "creditorTown": {
            "type": "string"
          },
          "currency": {
            "default": "XOF",
            "description": "Devise XOF, utilisée si le champ est absent.",
            "type": "string"
          },
          "customerChannel": {
            "type": "string"
          },
          "customerId": {
            "type": "string"
          },
          "debtorAccount": {
            "type": "string"
          },
          "debtorAccountType": {
            "type": "string"
          },
          "debtorAgent": {
            "type": "string"
          },
          "debtorAlias": {
            "type": "string"
          },
          "debtorClientType": {
            "type": "string"
          },
          "debtorCountry": {
            "type": "string"
          },
          "debtorIdentification": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PartyIdentificationRequest"
          },
          "debtorLatitude": {
            "type": "number"
          },
          "debtorLongitude": {
            "type": "number"
          },
          "debtorName": {
            "type": "string"
          },
          "debtorTown": {
            "type": "string"
          },
          "endToEndId": {
            "description": "EndToEndId de la recherche préalable aboutie pour un transfert inter-participants.",
            "type": "string"
          },
          "merchantTransactionId": {
            "type": "string"
          },
          "remittanceInformation": {
            "maxLength": 140,
            "minLength": 0,
            "type": "string"
          },
          "serviceLevel": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "amount",
          "businessReference",
          "channel",
          "creditorAccount",
          "creditorAccountType",
          "creditorAgent",
          "creditorClientType",
          "creditorName",
          "debtorAccount",
          "type"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$TimingsResponse": {
        "properties": {
          "t10CustomerNotifiedAt": {
            "format": "date-time",
            "type": "string"
          },
          "t10Verified": {
            "type": "boolean"
          },
          "t1OrderReceivedAt": {
            "format": "date-time",
            "type": "string"
          },
          "t2SentToPiAt": {
            "format": "date-time",
            "type": "string"
          },
          "t5PayeeReceivedAt": {
            "format": "date-time",
            "type": "string"
          },
          "t5pPayeeAnswerSentAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$TransferDetailResponse": {
        "properties": {
          "accountingStatus": {
            "enum": [
              "NOT_STARTED",
              "RESERVATION_PENDING",
              "RESERVED",
              "PREPOSITION_PENDING",
              "PREPOSITIONED",
              "POSTING_PENDING",
              "POSTED",
              "RELEASE_PENDING",
              "RELEASED",
              "ACCOUNTING_EXCEPTION"
            ],
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "businessReference": {
            "type": "string"
          },
          "cancellationStatus": {
            "enum": [
              "NONE",
              "REQUESTED",
              "SUBMITTED",
              "ACCEPTED",
              "REJECTED",
              "UNKNOWN",
              "REJECTED_BY_PI"
            ],
            "type": "string"
          },
          "cbsReference": {
            "type": "string"
          },
          "confirmationDeadline": {
            "format": "date-time",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "creditorAccount": {
            "type": "string"
          },
          "creditorAgent": {
            "type": "string"
          },
          "creditorName": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "debtorAccount": {
            "type": "string"
          },
          "debtorAgent": {
            "type": "string"
          },
          "debtorName": {
            "type": "string"
          },
          "details": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$PiDetailsResponse"
          },
          "direction": {
            "enum": [
              "OUTBOUND",
              "INBOUND"
            ],
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "lastError": {
            "type": "string"
          },
          "nextActionAt": {
            "format": "date-time",
            "type": "string"
          },
          "originalPiMessageId": {
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "piReference": {
            "type": "string"
          },
          "returnStatus": {
            "enum": [
              "NONE",
              "REQUESTED",
              "SUBMITTED",
              "RECEIVED",
              "PENDING",
              "COMPLETED",
              "REJECTED",
              "UNKNOWN"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "RECEIVED",
              "VALIDATING",
              "RESERVING",
              "READY_TO_SEND",
              "SUBMITTING",
              "PENDING_CONFIRMATION",
              "UNKNOWN",
              "SUCCEEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "timings": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$TimingsResponse"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          },
          "type": {
            "enum": [
              "CREDIT_TRANSFER",
              "PAYMENT",
              "BULK_PAYMENT_ITEM",
              "AVAILABILITY"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "format": "int64",
            "type": "integer"
          },
          "withoutPreconfirmation": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$TransferPage": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$TransferSummary"
            },
            "type": "array"
          },
          "page": {
            "format": "int32",
            "type": "integer"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          },
          "totalPages": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$TransferSummary": {
        "properties": {
          "accountingStatus": {
            "enum": [
              "NOT_STARTED",
              "RESERVATION_PENDING",
              "RESERVED",
              "PREPOSITION_PENDING",
              "PREPOSITIONED",
              "POSTING_PENDING",
              "POSTED",
              "RELEASE_PENDING",
              "RELEASED",
              "ACCOUNTING_EXCEPTION"
            ],
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "businessReference": {
            "type": "string"
          },
          "cancellationStatus": {
            "enum": [
              "NONE",
              "REQUESTED",
              "SUBMITTED",
              "ACCEPTED",
              "REJECTED",
              "UNKNOWN",
              "REJECTED_BY_PI"
            ],
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "creditorAccount": {
            "type": "string"
          },
          "creditorAgent": {
            "type": "string"
          },
          "creditorName": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "debtorAccount": {
            "type": "string"
          },
          "debtorAgent": {
            "type": "string"
          },
          "debtorName": {
            "type": "string"
          },
          "direction": {
            "enum": [
              "OUTBOUND",
              "INBOUND"
            ],
            "type": "string"
          },
          "endToEndId": {
            "type": "string"
          },
          "irrevocableAt": {
            "format": "date-time",
            "type": "string"
          },
          "lastError": {
            "type": "string"
          },
          "remittanceInformation": {
            "type": "string"
          },
          "returnStatus": {
            "enum": [
              "NONE",
              "REQUESTED",
              "SUBMITTED",
              "RECEIVED",
              "PENDING",
              "COMPLETED",
              "REJECTED",
              "UNKNOWN"
            ],
            "type": "string"
          },
          "status": {
            "enum": [
              "RECEIVED",
              "VALIDATING",
              "RESERVING",
              "READY_TO_SEND",
              "SUBMITTING",
              "PENDING_CONFIRMATION",
              "UNKNOWN",
              "SUCCEEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          },
          "type": {
            "enum": [
              "CREDIT_TRANSFER",
              "PAYMENT",
              "BULK_PAYMENT_ITEM",
              "AVAILABILITY"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.TransferResource$TransferTimelineItem": {
        "properties": {
          "eventType": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "payload": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasCreationRequest": {
        "properties": {
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasInfo": {
        "properties": {
          "cle": {
            "type": "string"
          },
          "compte": {
            "type": "string"
          },
          "dateCreation": {
            "type": "string"
          },
          "dateModification": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasItem": {
        "properties": {
          "cle": {
            "type": "string"
          },
          "compte": {
            "type": "string"
          },
          "dateCreation": {
            "type": "string"
          },
          "dateModification": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasList": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasItem"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$Meta"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$EnrolementInfo": {
        "properties": {
          "categorie": {
            "type": "string"
          },
          "cle": {
            "type": "string"
          },
          "nom": {
            "type": "string"
          },
          "pays": {
            "type": "string"
          },
          "photo": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessAliasResource$Meta": {
        "properties": {
          "next": {
            "type": "string"
          },
          "page": {
            "type": "string"
          },
          "prev": {
            "type": "string"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteDetailResponse": {
        "properties": {
          "dateOuverture": {
            "format": "date",
            "type": "string"
          },
          "devise": {
            "type": "string"
          },
          "numero": {
            "type": "string"
          },
          "preConfirmation": {
            "type": "boolean"
          },
          "solde": {
            "type": "number"
          },
          "statut": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteItemResponse": {
        "properties": {
          "dateOuverture": {
            "format": "date",
            "type": "string"
          },
          "numero": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteListeResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteItemResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionRequest": {
        "properties": {
          "montant": {
            "maximum": 1000000000000000,
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeNumero": {
            "type": "string"
          },
          "payeurNumero": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "required": [
          "montant",
          "payeNumero",
          "payeurNumero",
          "txId"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionResponse": {
        "properties": {
          "dateEnvoi": {
            "format": "date-time",
            "type": "string"
          },
          "dateIrrevocabilite": {
            "format": "date-time",
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeNumero": {
            "type": "string"
          },
          "payeurNumero": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "statutRaison": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessComptesResource$MetaResponse": {
        "properties": {
          "next": {
            "type": "string"
          },
          "page": {
            "type": "string"
          },
          "prev": {
            "type": "string"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesCreationService$CreationResponse": {
        "properties": {
          "categorie": {
            "type": "string"
          },
          "confirmation": {
            "type": "boolean"
          },
          "dateConfirmation": {
            "format": "date-time",
            "type": "string"
          },
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "dateEnvoi": {
            "format": "date-time",
            "type": "string"
          },
          "end2endId": {
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "payeurNom": {
            "type": "string"
          },
          "payeurPays": {
            "type": "string"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "statutRaison": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchDetailResponse": {
        "properties": {
          "dateAnnulation": {
            "format": "date-time",
            "type": "string"
          },
          "dateConfirmation": {
            "format": "date-time",
            "type": "string"
          },
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "dateExpiration": {
            "format": "date-time",
            "type": "string"
          },
          "instructionId": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "transactionsEnvoyees": {
            "format": "int64",
            "type": "integer"
          },
          "transactionsInitiees": {
            "format": "int64",
            "type": "integer"
          },
          "transactionsIrrevocables": {
            "format": "int64",
            "type": "integer"
          },
          "transactionsRejetees": {
            "format": "int64",
            "type": "integer"
          },
          "transactionsTotal": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchItemResponse": {
        "properties": {
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "instructionId": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchItemResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$DecisionRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          }
        },
        "required": [
          "decision"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$MetaResponse": {
        "properties": {
          "next": {
            "type": "string"
          },
          "page": {
            "type": "string"
          },
          "prev": {
            "type": "string"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$ConfirmationRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          }
        },
        "required": [
          "decision"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$ConfirmationResponse": {
        "properties": {
          "categorie": {
            "type": "string"
          },
          "confirmation": {
            "type": "boolean"
          },
          "dateConfirmation": {
            "format": "date-time",
            "type": "string"
          },
          "dateLimitePaiement": {
            "format": "date-time",
            "type": "string"
          },
          "dateLimiteReponse": {
            "format": "date-time",
            "type": "string"
          },
          "debitDiffere": {
            "type": "boolean"
          },
          "logoUrl": {
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "payeurNom": {
            "type": "string"
          },
          "payeurPays": {
            "type": "string"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "remise": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$Remise"
          },
          "statut": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$CreationCommand": {
        "properties": {
          "accounts": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "cbsCustomerId": {
            "type": "string"
          },
          "request": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$Remise": {
        "properties": {
          "montant": {
            "type": "number"
          },
          "taux": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeResponse"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeResponse": {
        "properties": {
          "categorie": {
            "type": "string"
          },
          "confirmation": {
            "type": "boolean"
          },
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "dateEnvoi": {
            "format": "date-time",
            "type": "string"
          },
          "dateIrrevocabilite": {
            "format": "date-time",
            "type": "string"
          },
          "dateLimitePaiement": {
            "format": "date-time",
            "type": "string"
          },
          "dateLimiteReponse": {
            "format": "date-time",
            "type": "string"
          },
          "dateReponse": {
            "format": "date-time",
            "type": "string"
          },
          "end2endId": {
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeNom": {
            "type": "string"
          },
          "payePays": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "statutRaison": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$ReponseRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          },
          "raison": {
            "type": "string"
          }
        },
        "required": [
          "decision"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$MetaResponse": {
        "properties": {
          "next": {
            "type": "string"
          },
          "page": {
            "type": "string"
          },
          "prev": {
            "type": "string"
          },
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementConfirmationRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementRequest": {
        "properties": {
          "confirmation": {
            "type": "boolean"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "programme": {
            "type": "boolean"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "required": [
          "montant",
          "payeAlias",
          "payeurAlias",
          "txId"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementResponse": {
        "properties": {
          "categorie": {
            "type": "string"
          },
          "confirmation": {
            "type": "boolean"
          },
          "dateConfirmation": {
            "format": "date-time",
            "type": "string"
          },
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "dateEnvoi": {
            "format": "date-time",
            "type": "string"
          },
          "dateIrrevocabilite": {
            "format": "date-time",
            "type": "string"
          },
          "dateReponse": {
            "format": "date-time",
            "type": "string"
          },
          "end2endId": {
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeNom": {
            "type": "string"
          },
          "payePays": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "payeurCompte": {
            "type": "string"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "statutRaison": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeCreationResponse": {
        "properties": {
          "instructionId": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeDecisionRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          }
        },
        "required": [
          "decision"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeItemRequest": {
        "properties": {
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "refDocNumero": {
            "type": "string"
          },
          "refDocType": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "required": [
          "montant",
          "payeAlias",
          "txId"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeItemResponse": {
        "properties": {
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "instructionId": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeItemResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeRequest": {
        "properties": {
          "confirmation": {
            "type": "boolean"
          },
          "instructionId": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "transactions": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeItemRequest"
            },
            "type": "array"
          }
        },
        "required": [
          "instructionId",
          "payeurAlias",
          "transactions"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeResponse": {
        "properties": {
          "dateConfirmation": {
            "format": "date-time",
            "type": "string"
          },
          "dateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "dateExpiration": {
            "format": "date-time",
            "type": "string"
          },
          "instructionId": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "transactionsEnvoyees": {
            "format": "int32",
            "type": "integer"
          },
          "transactionsInitiees": {
            "format": "int32",
            "type": "integer"
          },
          "transactionsIrrevocables": {
            "format": "int32",
            "type": "integer"
          },
          "transactionsRejetees": {
            "format": "int32",
            "type": "integer"
          },
          "transactionsTotal": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$MetaResponse": {
        "properties": {
          "size": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementListResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
            },
            "type": "array"
          },
          "meta": {
            "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$MetaResponse"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse": {
        "properties": {
          "annulationStatut": {
            "type": "string"
          },
          "categorie": {
            "type": "string"
          },
          "dateIrrevocabilite": {
            "format": "date-time",
            "type": "string"
          },
          "end2endId": {
            "type": "string"
          },
          "montant": {
            "type": "number"
          },
          "motif": {
            "type": "string"
          },
          "payeAlias": {
            "type": "string"
          },
          "payeCompte": {
            "type": "string"
          },
          "payeNom": {
            "type": "string"
          },
          "payeurAlias": {
            "type": "string"
          },
          "payeurCompte": {
            "type": "string"
          },
          "payeurNom": {
            "type": "string"
          },
          "payeurPays": {
            "type": "string"
          },
          "programme": {
            "type": "boolean"
          },
          "retourDateDemande": {
            "format": "date-time",
            "type": "string"
          },
          "retourDateIrrevocabilite": {
            "format": "date-time",
            "type": "string"
          },
          "retourDateReponse": {
            "format": "date-time",
            "type": "string"
          },
          "retourStatut": {
            "type": "string"
          },
          "retourStatutRaison": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "statutRaison": {
            "type": "string"
          },
          "txId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessRetoursFondsResource$AnnulationReponseRequest": {
        "properties": {
          "decision": {
            "type": "boolean"
          }
        },
        "required": [
          "decision"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.business.BusinessRetoursFondsResource$AnnulationRequest": {
        "properties": {
          "raison": {
            "type": "string"
          }
        },
        "required": [
          "raison"
        ],
        "type": "object"
      },
      "com.baobab.pispi.apps.api.provisioning.TenantDemoDataCatalog$DemoAlias": {
        "properties": {
          "accountId": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "preConfirmation": {
            "type": "boolean"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.provisioning.TenantProvisioningResource$Request": {
        "properties": {
          "steps": {
            "items": {
              "enum": [
                "MATRICES",
                "CBS_ACCOUNTS",
                "HOMOLOGATION_ACCOUNTS",
                "ALIASES",
                "AVAILABILITY_TEST",
                "BUSINESS_CLIENTS"
              ],
              "type": "string"
            },
            "type": "array",
            "uniqueItems": true
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.provisioning.TenantProvisioningService$Report": {
        "properties": {
          "aliases": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.provisioning.TenantDemoDataCatalog$DemoAlias"
            },
            "type": "array"
          },
          "generated": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "participantCode": {
            "type": "string"
          },
          "personas": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.apps.api.provisioning.TenantProvisioningService$StepResult"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.apps.api.provisioning.TenantProvisioningService$StepResult": {
        "properties": {
          "created": {
            "format": "int32",
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "existing": {
            "format": "int32",
            "type": "integer"
          },
          "status": {
            "enum": [
              "DONE",
              "SKIPPED",
              "FAILED"
            ],
            "type": "string"
          },
          "step": {
            "enum": [
              "MATRICES",
              "CBS_ACCOUNTS",
              "HOMOLOGATION_ACCOUNTS",
              "ALIASES",
              "AVAILABILITY_TEST",
              "BUSINESS_CLIENTS"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasBulkService$HealResult": {
        "properties": {
          "absentInPiRac": {
            "format": "int32",
            "type": "integer"
          },
          "checked": {
            "format": "int32",
            "type": "integer"
          },
          "failed": {
            "format": "int32",
            "type": "integer"
          },
          "healed": {
            "format": "int32",
            "type": "integer"
          },
          "otherParticipant": {
            "format": "int32",
            "type": "integer"
          },
          "stillMissing": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasBulkService$ItemView": {
        "properties": {
          "attempts": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "createdKey": {
            "type": "string"
          },
          "createdType": {
            "type": "string"
          },
          "fallbackType": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "lineNo": {
            "format": "int32",
            "type": "integer"
          },
          "linkedShid": {
            "type": "string"
          },
          "ref": {
            "type": "string"
          },
          "requestedType": {
            "type": "string"
          },
          "resolvedAt": {
            "format": "date-time",
            "type": "string"
          },
          "state": {
            "enum": [
              "PENDING",
              "SENDING",
              "CREATED",
              "DELETED",
              "FAILED",
              "UNKNOWN",
              "CANCELLED"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasBulkService$Reconciliation": {
        "properties": {
          "checked": {
            "format": "int32",
            "type": "integer"
          },
          "resolved": {
            "format": "int32",
            "type": "integer"
          },
          "stillUnknown": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasBulkService$Report": {
        "properties": {
          "failureReasons": {
            "additionalProperties": {
              "format": "int64",
              "type": "integer"
            },
            "type": "object"
          },
          "missingFromRegistry": {
            "format": "int64",
            "type": "integer"
          },
          "reconciliation": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$Reconciliation"
          },
          "registryUnresolvable": {
            "format": "int64",
            "type": "integer"
          },
          "summary": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$Summary"
          },
          "unknown": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$ItemView"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasBulkService$Summary": {
        "properties": {
          "byState": {
            "additionalProperties": {
              "format": "int64",
              "type": "integer"
            },
            "type": "object"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdByType": {
            "additionalProperties": {
              "format": "int64",
              "type": "integer"
            },
            "type": "object"
          },
          "createdWithFallback": {
            "format": "int64",
            "type": "integer"
          },
          "finishedAt": {
            "format": "date-time",
            "type": "string"
          },
          "haltedReason": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "percentDone": {
            "format": "double",
            "type": "number"
          },
          "reference": {
            "type": "string"
          },
          "settled": {
            "format": "int64",
            "type": "integer"
          },
          "state": {
            "enum": [
              "RUNNING",
              "COMPLETED",
              "CANCELLED",
              "HALTED",
              "PAUSED"
            ],
            "type": "string"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasOtpService$Challenge": {
        "properties": {
          "otpId": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasService$Comparison": {
        "properties": {
          "key": {
            "type": "string"
          },
          "local": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.model.AliasLocalView"
          },
          "remote": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasService$Comparison$Remote"
          },
          "verdict": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.application.AliasService$Comparison$Remote": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountParticipant": {
            "type": "string"
          },
          "ownerName": {
            "type": "string"
          },
          "shid": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Change": {
        "properties": {
          "after": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule"
          },
          "before": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule"
          },
          "cbsValue": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Resolution": {
        "properties": {
          "cbsValue": {
            "type": "string"
          },
          "rule": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule"
          },
          "versionId": {
            "format": "uuid",
            "type": "string"
          },
          "versionNumber": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule": {
        "properties": {
          "category": {
            "type": "string"
          },
          "cbsValue": {
            "type": "string"
          },
          "piAccountType": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version": {
        "properties": {
          "author": {
            "type": "string"
          },
          "copiedFrom": {
            "format": "uuid",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "decidedAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "number": {
            "format": "int64",
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Rule"
            },
            "type": "array"
          },
          "status": {
            "enum": [
              "DRAFT",
              "PENDING_APPROVAL",
              "ACTIVE",
              "SUPERSEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "submittedAt": {
            "format": "date-time",
            "type": "string"
          },
          "supersededAt": {
            "format": "date-time",
            "type": "string"
          },
          "validator": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Change": {
        "properties": {
          "after": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Rule"
          },
          "before": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Rule"
          },
          "cbsValue": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "IDENTIFICATION_TYPE",
              "ACCOUNT_STANDING",
              "PAYER_REJECT_REASON",
              "PAYEE_REJECT_REASON"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Resolution": {
        "properties": {
          "cbsValue": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "IDENTIFICATION_TYPE",
              "ACCOUNT_STANDING",
              "PAYER_REJECT_REASON",
              "PAYEE_REJECT_REASON"
            ],
            "type": "string"
          },
          "targetValue": {
            "type": "string"
          },
          "versionId": {
            "format": "uuid",
            "type": "string"
          },
          "versionNumber": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Rule": {
        "properties": {
          "cbsValue": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "IDENTIFICATION_TYPE",
              "ACCOUNT_STANDING",
              "PAYER_REJECT_REASON",
              "PAYEE_REJECT_REASON"
            ],
            "type": "string"
          },
          "targetValue": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version": {
        "properties": {
          "author": {
            "type": "string"
          },
          "copiedFrom": {
            "format": "uuid",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "decidedAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "number": {
            "format": "int64",
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "rules": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Rule"
            },
            "type": "array"
          },
          "status": {
            "enum": [
              "DRAFT",
              "PENDING_APPROVAL",
              "ACTIVE",
              "SUPERSEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "submittedAt": {
            "format": "date-time",
            "type": "string"
          },
          "supersededAt": {
            "format": "date-time",
            "type": "string"
          },
          "validator": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.alias.model.AliasLocalView": {
        "properties": {
          "account": {
            "type": "string"
          },
          "accountParticipant": {
            "type": "string"
          },
          "clientType": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "deletedAt": {
            "format": "date-time",
            "type": "string"
          },
          "deletionReason": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "linkedShid": {
            "type": "string"
          },
          "ownerName": {
            "type": "string"
          },
          "status": {
            "enum": [
              "ACTIVE",
              "DELETED"
            ],
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.AvailabilityReport": {
        "properties": {
          "availabilityRate": {
            "format": "double",
            "type": "number"
          },
          "availabilityRateExcludingPlannedMaintenance": {
            "format": "double",
            "type": "number"
          },
          "category": {
            "format": "int32",
            "type": "integer"
          },
          "compliant": {
            "type": "boolean"
          },
          "deviationPercentagePoints": {
            "format": "double",
            "type": "number"
          },
          "generatedAt": {
            "type": "string"
          },
          "guaranteeRejections": {
            "format": "int64",
            "type": "integer"
          },
          "incidents": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.AvailabilityReport$Incident"
            },
            "type": "array"
          },
          "method": {
            "type": "string"
          },
          "month": {
            "type": "string"
          },
          "monthSeconds": {
            "format": "int64",
            "type": "integer"
          },
          "participantCode": {
            "type": "string"
          },
          "provisional": {
            "type": "boolean"
          },
          "requiredRate": {
            "format": "double",
            "type": "number"
          },
          "tranches01": {
            "format": "int32",
            "type": "integer"
          },
          "unavailableSeconds": {
            "format": "int64",
            "type": "integer"
          },
          "unavailableSecondsExcludingPlannedMaintenance": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.AvailabilityReport$Incident": {
        "properties": {
          "cause": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "endedAt": {
            "type": "string"
          },
          "planned": {
            "type": "boolean"
          },
          "seconds": {
            "format": "int64",
            "type": "integer"
          },
          "source": {
            "type": "string"
          },
          "startedAt": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.ParticipantOperationsService$NotificationView": {
        "properties": {
          "messageId": {
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.ParticipantOperationsService$PeerView": {
        "properties": {
          "name": {
            "type": "string"
          },
          "participantId": {
            "type": "string"
          },
          "piStatus": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.ParticipantOperationsService$RefreshView": {
        "properties": {
          "lastRequestedAt": {
            "format": "date-time",
            "type": "string"
          },
          "listUpdatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "requested": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.ParticipantOperationsService$StatusView": {
        "properties": {
          "maintenance": {
            "type": "boolean"
          },
          "maintenanceSince": {
            "format": "date-time",
            "type": "string"
          },
          "piStatus": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.RelationshipService$RelationView": {
        "properties": {
          "active": {
            "type": "boolean"
          },
          "endDate": {
            "type": "string"
          },
          "limit": {
            "type": "number"
          },
          "sponsorCode": {
            "type": "string"
          },
          "startDate": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.operations.RelationshipService$RequestView": {
        "properties": {
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "reasonCode": {
            "type": "string"
          },
          "sponsorCode": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeBatchSimulationCommand": {
        "properties": {
          "cases": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationCommand"
            },
            "type": "array"
          },
          "ruleId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeBatchSimulationView": {
        "properties": {
          "batchId": {
            "format": "uuid",
            "type": "string"
          },
          "ko": {
            "format": "int32",
            "type": "integer"
          },
          "ok": {
            "format": "int32",
            "type": "integer"
          },
          "ruleId": {
            "format": "uuid",
            "type": "string"
          },
          "ruleStatus": {
            "enum": [
              "PENDING",
              "SIMULATED",
              "ACTIVE",
              "INACTIVE"
            ],
            "type": "string"
          },
          "simulations": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationView"
            },
            "type": "array"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          },
          "verdict": {
            "enum": [
              "OK",
              "KO"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeCatalogView": {
        "properties": {
          "actions": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Action"
            },
            "type": "array"
          },
          "criteria": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Criterion"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Action": {
        "properties": {
          "description": {
            "type": "string"
          },
          "feeAction": {
            "type": "boolean"
          },
          "parameters": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Parameter"
            },
            "type": "array"
          },
          "type": {
            "enum": [
              "GRATUIT",
              "FRAIS_FIXE",
              "FRAIS_POURCENTAGE",
              "FRAIS_TRANCHES",
              "REMISE",
              "PLAFOND",
              "PLANCHER",
              "TAXE"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Criterion": {
        "properties": {
          "format": {
            "type": "string"
          },
          "operators": {
            "items": {
              "enum": [
                "EQ",
                "NE",
                "IN",
                "NOT_IN",
                "GT",
                "GTE",
                "LT",
                "LTE",
                "BETWEEN"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "type": {
            "enum": [
              "DIRECTION",
              "OPERATION_TYPE",
              "CHANNEL",
              "SCOPE",
              "COUNTERPARTY_COUNTRY",
              "PAYER_CATEGORY",
              "PAYEE_CATEGORY",
              "COUNTERPARTY_INSTITUTION_TYPE",
              "AMOUNT",
              "VALIDITY_PERIOD",
              "DAY_OF_WEEK",
              "TIME_RANGE",
              "TONTINE",
              "CUSTOMER_SEGMENT"
            ],
            "type": "string"
          },
          "values": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeCatalogView$Parameter": {
        "properties": {
          "format": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeChargeView": {
        "properties": {
          "account": {
            "type": "string"
          },
          "businessReference": {
            "type": "string"
          },
          "cbsReference": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "feeExclTax": {
            "format": "int64",
            "type": "integer"
          },
          "feeInclTax": {
            "format": "int64",
            "type": "integer"
          },
          "lastError": {
            "type": "string"
          },
          "reasonCode": {
            "type": "string"
          },
          "ruleCode": {
            "type": "string"
          },
          "status": {
            "enum": [
              "PENDING",
              "POSTED",
              "REJECTED",
              "UNCERTAIN",
              "FAILED",
              "TO_RECONCILE"
            ],
            "type": "string"
          },
          "totalTax": {
            "format": "int64",
            "type": "integer"
          },
          "transactionRef": {
            "type": "string"
          },
          "transferId": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "verificationAttempts": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeParameterCommand": {
        "properties": {
          "code": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "validFrom": {
            "format": "date",
            "type": "string"
          },
          "value": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeParameterView": {
        "properties": {
          "code": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "type": "string"
          },
          "validFrom": {
            "format": "date",
            "type": "string"
          },
          "validTo": {
            "format": "date",
            "type": "string"
          },
          "value": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRequest": {
        "properties": {
          "acceptedAt": {
            "format": "date-time",
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "channel": {
            "enum": [
              "APPLICATION_MOBILE",
              "USSD",
              "INTERNET",
              "AGENCE",
              "API_BUSINESS",
              "AUTRE"
            ],
            "type": "string"
          },
          "counterpartyCountry": {
            "type": "string"
          },
          "counterpartyInstitutionType": {
            "enum": [
              "BANQUE",
              "IMF",
              "EME",
              "EP",
              "TRESOR",
              "AUTRE"
            ],
            "type": "string"
          },
          "counterpartyParticipantId": {
            "type": "string"
          },
          "cumulOverride": {
            "format": "int64",
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "customerId": {
            "type": "string"
          },
          "customerSegment": {
            "type": "string"
          },
          "direction": {
            "enum": [
              "EMISSION",
              "RECEPTION"
            ],
            "type": "string"
          },
          "operationType": {
            "enum": [
              "TRANSFERT",
              "PAIEMENT",
              "DEMANDE_PAIEMENT",
              "RETOUR_FONDS",
              "DEMANDE_ANNULATION",
              "RECHERCHE_ALIAS",
              "VERIFICATION_IDENTITE",
              "DEBIT_DIFFERE",
              "PICO",
              "PICASH"
            ],
            "type": "string"
          },
          "payeeCategory": {
            "enum": [
              "P",
              "C",
              "B",
              "G"
            ],
            "type": "string"
          },
          "payerCategory": {
            "enum": [
              "P",
              "C",
              "B",
              "G"
            ],
            "type": "string"
          },
          "tontine": {
            "type": "boolean"
          },
          "transactionRef": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeResult": {
        "properties": {
          "acceptedAt": {
            "format": "date-time",
            "type": "string"
          },
          "amount": {
            "format": "int64",
            "type": "integer"
          },
          "appliedActions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "base": {
            "format": "int64",
            "type": "integer"
          },
          "cumul": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult$Cumul"
          },
          "currency": {
            "type": "string"
          },
          "explanation": {
            "type": "string"
          },
          "feeExclTax": {
            "format": "int64",
            "type": "integer"
          },
          "feeInclTax": {
            "format": "int64",
            "type": "integer"
          },
          "mode": {
            "enum": [
              "QUOTE",
              "APPLIED",
              "SIMULATION"
            ],
            "type": "string"
          },
          "outcome": {
            "enum": [
              "MATCHED",
              "NO_RULE",
              "CONFLICT"
            ],
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "rule": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult$RuleRef"
          },
          "taxes": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult$Tax"
            },
            "type": "array"
          },
          "totalTax": {
            "format": "int64",
            "type": "integer"
          },
          "transactionRef": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeResult$Cumul": {
        "properties": {
          "after": {
            "format": "int64",
            "type": "integer"
          },
          "before": {
            "format": "int64",
            "type": "integer"
          },
          "businessDate": {
            "format": "date",
            "type": "string"
          },
          "threshold": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeResult$RuleRef": {
        "properties": {
          "code": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "source": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeResult$Tax": {
        "properties": {
          "amount": {
            "format": "int64",
            "type": "integer"
          },
          "base": {
            "format": "int64",
            "type": "integer"
          },
          "code": {
            "type": "string"
          },
          "rate": {
            "type": "number"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand": {
        "properties": {
          "actions": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Action"
            },
            "type": "array"
          },
          "code": {
            "type": "string"
          },
          "criteria": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Criterion"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "priority": {
            "format": "int32",
            "type": "integer"
          },
          "source": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Action": {
        "properties": {
          "params": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "type": {
            "enum": [
              "GRATUIT",
              "FRAIS_FIXE",
              "FRAIS_POURCENTAGE",
              "FRAIS_TRANCHES",
              "REMISE",
              "PLAFOND",
              "PLANCHER",
              "TAXE"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Criterion": {
        "properties": {
          "operator": {
            "enum": [
              "EQ",
              "NE",
              "IN",
              "NOT_IN",
              "GT",
              "GTE",
              "LT",
              "LTE",
              "BETWEEN"
            ],
            "type": "string"
          },
          "type": {
            "enum": [
              "DIRECTION",
              "OPERATION_TYPE",
              "CHANNEL",
              "SCOPE",
              "COUNTERPARTY_COUNTRY",
              "PAYER_CATEGORY",
              "PAYEE_CATEGORY",
              "COUNTERPARTY_INSTITUTION_TYPE",
              "AMOUNT",
              "VALIDITY_PERIOD",
              "DAY_OF_WEEK",
              "TIME_RANGE",
              "TONTINE",
              "CUSTOMER_SEGMENT"
            ],
            "type": "string"
          },
          "value": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRuleHistoryView": {
        "properties": {
          "actor": {
            "type": "string"
          },
          "event": {
            "enum": [
              "CREATED",
              "DUPLICATED",
              "UPDATED",
              "SIMULATED",
              "ACTIVATED",
              "DEACTIVATED"
            ],
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "ruleId": {
            "format": "uuid",
            "type": "string"
          },
          "snapshot": {
            "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
          },
          "statusAfter": {
            "enum": [
              "PENDING",
              "SIMULATED",
              "ACTIVE",
              "INACTIVE"
            ],
            "type": "string"
          },
          "statusBefore": {
            "enum": [
              "PENDING",
              "SIMULATED",
              "ACTIVE",
              "INACTIVE"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeRuleView": {
        "properties": {
          "actions": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Action"
            },
            "type": "array"
          },
          "code": {
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "createdBy": {
            "type": "string"
          },
          "criteria": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand$Criterion"
            },
            "type": "array"
          },
          "criteriaSignature": {
            "type": "string"
          },
          "deactivatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "deactivatedBy": {
            "type": "string"
          },
          "deactivationReason": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "priority": {
            "format": "int32",
            "type": "integer"
          },
          "replacesRuleId": {
            "format": "uuid",
            "type": "string"
          },
          "simulatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "status": {
            "enum": [
              "PENDING",
              "SIMULATED",
              "ACTIVE",
              "INACTIVE"
            ],
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "type": "string"
          },
          "validatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "validatedBy": {
            "type": "string"
          },
          "version": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeSimulationCommand": {
        "properties": {
          "expectedFeeExclTax": {
            "format": "int64",
            "type": "integer"
          },
          "expectedOutcome": {
            "enum": [
              "MATCHED",
              "NO_RULE",
              "CONFLICT"
            ],
            "type": "string"
          },
          "expectedRuleCode": {
            "type": "string"
          },
          "expectedTaxes": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationCommand$ExpectedTax"
            },
            "type": "array"
          },
          "label": {
            "type": "string"
          },
          "request": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRequest"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeSimulationCommand$ExpectedTax": {
        "properties": {
          "amount": {
            "format": "int64",
            "type": "integer"
          },
          "code": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeSimulationView": {
        "properties": {
          "actor": {
            "type": "string"
          },
          "batchId": {
            "format": "uuid",
            "type": "string"
          },
          "candidates": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationView$Candidate"
            },
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "mismatches": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "result": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult"
          },
          "ruleId": {
            "format": "uuid",
            "type": "string"
          },
          "ruleStatus": {
            "enum": [
              "PENDING",
              "SIMULATED",
              "ACTIVE",
              "INACTIVE"
            ],
            "type": "string"
          },
          "simulatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "testedRuleSelected": {
            "type": "boolean"
          },
          "verdict": {
            "enum": [
              "OK",
              "KO"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.pricingengine.api.FeeSimulationView$Candidate": {
        "properties": {
          "matched": {
            "type": "boolean"
          },
          "priority": {
            "format": "int32",
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "ruleCode": {
            "type": "string"
          },
          "selected": {
            "type": "boolean"
          },
          "specificity": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.reconciliation.GuaranteeBalance": {
        "type": "object"
      },
      "com.baobab.pispi.domain.reconciliation.GuaranteeEvent": {
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.application.TransferAccepted": {
        "properties": {
          "status": {
            "enum": [
              "RECEIVED",
              "VALIDATING",
              "RESERVING",
              "READY_TO_SEND",
              "SUBMITTING",
              "PENDING_CONFIRMATION",
              "UNKNOWN",
              "SUCCEEDED",
              "REJECTED"
            ],
            "type": "string"
          },
          "transferId": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.domain.PaymentBatchStatus$Counters": {
        "properties": {
          "failed": {
            "format": "int32",
            "type": "integer"
          },
          "inProgress": {
            "format": "int32",
            "type": "integer"
          },
          "refused": {
            "format": "int32",
            "type": "integer"
          },
          "succeeded": {
            "format": "int32",
            "type": "integer"
          },
          "total": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.sla.SlaReport": {
        "properties": {
          "generatedAt": {
            "type": "string"
          },
          "ind1": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport$Indicator"
          },
          "ind3": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport$Indicator"
          },
          "method": {
            "type": "string"
          },
          "month": {
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "provisional": {
            "type": "boolean"
          },
          "quality": {
            "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport$Quality"
          },
          "timingBasis": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.sla.SlaReport$Indicator": {
        "properties": {
          "name": {
            "type": "string"
          },
          "requirements": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport$Requirement"
            },
            "type": "array"
          },
          "sampleSize": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.sla.SlaReport$Quality": {
        "properties": {
          "bulkExcludedFromInd1": {
            "format": "int64",
            "type": "integer"
          },
          "complete": {
            "type": "boolean"
          },
          "negativeDurationsInd1": {
            "format": "int64",
            "type": "integer"
          },
          "negativeDurationsInd3": {
            "format": "int64",
            "type": "integer"
          },
          "notAcceptedByPi": {
            "format": "int64",
            "type": "integer"
          },
          "notIrrevocable": {
            "format": "int64",
            "type": "integer"
          },
          "outboundTransfers": {
            "format": "int64",
            "type": "integer"
          },
          "scheduledExcludedFromInd1": {
            "format": "int64",
            "type": "integer"
          },
          "withoutNotificationEvidence": {
            "format": "int64",
            "type": "integer"
          },
          "withoutTimings": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.domain.transfer.sla.SlaReport$Requirement": {
        "properties": {
          "compliant": {
            "type": "boolean"
          },
          "deviationSeconds": {
            "format": "double",
            "type": "number"
          },
          "label": {
            "type": "string"
          },
          "observedPercentileSeconds": {
            "format": "double",
            "type": "number"
          },
          "observedShare": {
            "format": "double",
            "type": "number"
          },
          "requiredShare": {
            "format": "double",
            "type": "number"
          },
          "thresholdSeconds": {
            "format": "double",
            "type": "number"
          },
          "tranches02s": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.crypto.credentials.TenantCredentialStore$Revocation": {
        "properties": {
          "reason": {
            "type": "string"
          },
          "revokedAt": {
            "format": "date-time",
            "type": "string"
          },
          "serialNumber": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.messaging.service.CbsDeliveryStatsService$CbsDeliveryStats": {
        "properties": {
          "ambiguous": {
            "format": "int64",
            "type": "integer"
          },
          "dlqCount": {
            "format": "int64",
            "type": "integer"
          },
          "dlqTopic": {
            "type": "string"
          },
          "retry1Count": {
            "format": "int64",
            "type": "integer"
          },
          "retry1Group": {
            "type": "string"
          },
          "retry1Topic": {
            "type": "string"
          },
          "retry2Count": {
            "format": "int64",
            "type": "integer"
          },
          "retry2Group": {
            "type": "string"
          },
          "retry2Topic": {
            "type": "string"
          },
          "retryExhausted": {
            "format": "int64",
            "type": "integer"
          },
          "retrySucceeded": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.notification.NotificationOperations$Detail": {
        "properties": {
          "attempts": {
            "items": {
              "$ref": "#/components/schemas/com.baobab.pispi.platform.notification.store.MailAttemptRecord"
            },
            "type": "array"
          },
          "delivery": {
            "type": "string"
          },
          "maxAttempts": {
            "format": "int32",
            "type": "integer"
          },
          "notification": {
            "$ref": "#/components/schemas/com.baobab.pispi.platform.notification.store.MailNotificationRecord"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.notification.store.MailAttemptRecord": {
        "properties": {
          "attempt": {
            "format": "int32",
            "type": "integer"
          },
          "failureKind": {
            "type": "string"
          },
          "finishedAt": {
            "format": "date-time",
            "type": "string"
          },
          "notificationId": {
            "format": "uuid",
            "type": "string"
          },
          "outcome": {
            "enum": [
              "PENDING",
              "SENDING",
              "RETRY",
              "ACCEPTED",
              "FAILED",
              "SKIPPED"
            ],
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "replyCode": {
            "format": "int32",
            "type": "integer"
          },
          "smtpRoute": {
            "type": "string"
          },
          "startedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.notification.store.MailNotificationRecord": {
        "properties": {
          "acceptedAt": {
            "format": "date-time",
            "type": "string"
          },
          "attempts": {
            "format": "int32",
            "type": "integer"
          },
          "correlation": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "failureKind": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          },
          "lastError": {
            "type": "string"
          },
          "leaseUntil": {
            "format": "date-time",
            "type": "string"
          },
          "messageId": {
            "type": "string"
          },
          "nextAttemptAt": {
            "format": "date-time",
            "type": "string"
          },
          "participantCode": {
            "type": "string"
          },
          "possibleDuplicate": {
            "type": "boolean"
          },
          "recipients": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "resumedCount": {
            "format": "int32",
            "type": "integer"
          },
          "sender": {
            "type": "string"
          },
          "smtpRoute": {
            "type": "string"
          },
          "status": {
            "enum": [
              "PENDING",
              "SENDING",
              "RETRY",
              "ACCEPTED",
              "FAILED",
              "SKIPPED"
            ],
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "template": {
            "enum": [
              "TRANSFER_SUCCEEDED",
              "RECONCILIATION_CASE_OPENED",
              "PI_TECHNICAL_REJECTION",
              "PI_WARNING_RECEIVED",
              "TEST"
            ],
            "type": "string"
          },
          "test": {
            "type": "boolean"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "com.baobab.pispi.platform.tenancy.service.AvailabilityTestSettingsService$Settings": {
        "properties": {
          "account": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          },
          "configured": {
            "type": "boolean"
          },
          "participantCode": {
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "updatedBy": {
            "type": "string"
          },
          "version": {
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "com.fasterxml.jackson.databind.JsonNode": {
        "description": "Valeur JSON libre : objet, tableau, chaîne, nombre, booléen ou null. Les contraintes métier du champ restent applicables."
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "bearerFormat": "JWT",
        "description": "Jeton Keycloak remis par votre participant en mode OIDC. Voir le guide des accès.",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "description": "API de participant-api : services métier, exploitation et réception des messages PI. Cette référence ne décrit pas les API distantes de PI-SPI ou PI-RAC. En mode OIDC, /api/v1/** exige un jeton Bearer du royaume et du rôle appropriés ; le mode OFF est réservé au développement local. Les callbacks PI utilisent leur canal mTLS dédié. Une acceptation HTTP ne prouve pas l'irrévocabilité d'un transfert : consulter son état.",
    "title": "PI Connect — API du cœur",
    "version": "0.1.0"
  },
  "openapi": "3.1.0",
  "paths": {
    "/annulations": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande de retour d’un transfert devenu irrévocable au participant. Le message camt.056 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour retrouver le transfert et engager le parcours de décision du payé ; la réception ne garantit pas son accord.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.056. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_5",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.056. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande d’annulation de PI",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/annulations/": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande de retour d’un transfert devenu irrévocable au participant. Le message camt.056 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour retrouver le transfert et engager le parcours de décision du payé ; la réception ne garantit pas son accord.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.056. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_7",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.056. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande d’annulation de PI",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/annulations/rapports": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre la réponse à une annulation demandée par le participant au participant. Le message camt.029 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour mettre en corrélation la décision reçue avec la demande et le transfert d’origine.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.029. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_8",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.029. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une réponse à une demande d’annulation",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/api/v1/ops/credentials": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les métadonnées des certificats utilisés par le processus : identités des participants, serveur entrant et ancres de confiance PI.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler les dates de validité et préparer une rotation sans exposer les clés ni les secrets.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Usage et origine du certificat.\n- Sujet, numéro de série, début et fin de validité.\n- Nombre de jours restants et emplacement de référence disponible.\n\n### Conditions et effets\n\nCette liste décrit le processus participant-api consulté, pas automatiquement l’état de tous les workers.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Magasin de certificats non activé dans cet assemblage.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "all_1",
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TenantCredentialsOpsResource$CredentialView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Usage et origine du certificat. Sujet, numéro de série, début et fin de validité. Nombre de jours restants et emplacement de référence disponible."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Magasin de certificats non activé dans cet assemblage."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les certificats en service dans cette instance",
        "tags": [
          "Certificats et révocation"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/credentials/reload": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de demander un rechargement immédiat après une rotation des éléments utilisés par participant-api.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après mise à disposition des nouveaux éléments, puis contrôler le résultat et les certificats en service.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- result : changed, unchanged ou failed.\n- Références des certificats et secrets ayant changé.\n- Erreur de rechargement disponible lorsque l’opération échoue.\n\n### Conditions et effets\n\nUn HTTP 200 peut porter result=failed : examiner le corps. Le worker recharge ses éléments selon son propre mécanisme ; cet appel ne prouve pas sa synchronisation.\n\n### Erreurs et reprise\n\nContrôler le résultat et les métadonnées avant une nouvelle demande. Aucun secret lui-même n’est retourné.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "reload",
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TenantCredentialsOpsResource$ReloadView"
                }
              }
            },
            "description": "result : changed, unchanged ou failed. Références des certificats et secrets ayant changé. Erreur de rechargement disponible lorsque l’opération échoue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Recharger les certificats et références de secrets de l’instance",
        "tags": [
          "Certificats et révocation"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/credentials/revocations": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de lire les révocations publiées par l’autorité et connues du magasin local de certificats.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier les informations de révocation disponibles lors d’une investigation TLS.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Révocations chargées depuis les informations de l’autorité de certification.\n\n### Conditions et effets\n\nLa route est en lecture seule ; elle ne révoque pas un certificat. La révocation se réalise auprès de l’autorité émettrice.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Magasin de certificats désactivé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "revocations",
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.platform.crypto.credentials.TenantCredentialStore$Revocation"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Révocations chargées depuis les informations de l’autorité de certification."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Magasin de certificats désactivé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter les révocations connues de certificats",
        "tags": [
          "Certificats et révocation"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/isolation": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les états d’isolation des participants connus pour les dépendances et traitements suivis par le cœur.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour diagnostiquer une limitation de capacité, un circuit ouvert ou une file de traitement avant toute reprise.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Vue des capacités et états de résilience disponibles.\n- Informations de quotas, traitements et ressources par participant selon le schéma.\n\n### Conditions et effets\n\nLa consultation ne ferme pas les circuits et ne rejoue aucun message.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "all",
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$ParticipantIsolationView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Vue des capacités et états de résilience disponibles. Informations de quotas, traitements et ressources par participant selon le schéma."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’isolation de tous les participants",
        "tags": [
          "Supervision et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/cbs/dlq": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de lister les commandes CBS du participant qui sont sorties du traitement normal et demandent une investigation.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour examiner la cause et le résultat connu avant toute décision de rejeu.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Identifiant de l’entrée, transfert et opération concernés.\n- Informations d’échec et de suivi disponibles.\n\n### Conditions et effets\n\nUne entrée en file morte ne prouve pas qu’aucun effet CBS n’a eu lieu. L’issue financière doit être connue avant un rejeu.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_10",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsDeadLetterService$DeadLetter"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Identifiant de l’entrée, transfert et opération concernés. Informations d’échec et de suivi disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Inspecter les commandes CBS en file morte",
        "tags": [
          "Reprises CBS"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/cbs/dlq/{deadLetterId}/replay": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de demander le rejeu d’une seule commande CBS inspectée en file morte. La demande est accompagnée d’une identité et d’un motif pour l’audit.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après diagnostic de la cause et vérification que la commande peut être rejouée sans reproduire un effet ambigu.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreason justifie la reprise de cette commande.\n\n### Données retournées\n\n- 202 : résultat de la demande de reprise et informations de suivi de l’entrée.\n\n### Conditions et effets\n\nL’opérateur et reason sont obligatoires. Le service contrôle l’éligibilité et empêche le rejeu multiple de la même entrée.\n\n### Erreurs et reprise\n\nAprès un timeout, inspecter l’entrée et le transfert avant de rappeler. Ne pas contourner le contrôle par la création d’un nouvel ordre financier.\n\n- **400** : Opérateur ou motif manquant.\n\n- **404** : Entrée de file morte introuvable.\n\n- **409** : Rejeu déjà demandé ou entrée non éligible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "replay",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de l’entrée CBS en file morte, obtenu dans la liste à inspecter.",
            "in": "path",
            "name": "deadLetterId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsDeadLetterResource$ReplayRequest"
              }
            }
          },
          "description": "reason justifie la reprise de cette commande.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsDeadLetterService$ReplayResult"
                }
              }
            },
            "description": "202 : résultat de la demande de reprise et informations de suivi de l’entrée."
          },
          "400": {
            "description": "Opérateur ou motif manquant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Entrée de file morte introuvable."
          },
          "409": {
            "description": "Rejeu déjà demandé ou entrée non éligible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander le rejeu audité d’une commande CBS",
        "tags": [
          "Reprises CBS"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/isolation": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter l’état d’isolation du participant demandé pour les dépendances et traitements suivis par le cœur.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour diagnostiquer une limitation de capacité, un circuit ouvert ou une file de traitement avant toute reprise.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Vue des capacités et états de résilience disponibles.\n- Informations de quotas, traitements et ressources par participant selon le schéma.\n\n### Conditions et effets\n\nLa consultation ne ferme pas les circuits et ne rejoue aucun message.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_13",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantIsolationOpsService$ParticipantIsolationView"
                }
              }
            },
            "description": "Vue des capacités et états de résilience disponibles. Informations de quotas, traitements et ressources par participant selon le schéma."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’isolation d’un participant",
        "tags": [
          "Supervision et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/notifications": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter l’état d’envoi des notifications par courrier électronique de son participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour rechercher une notification en attente ou en échec avant d’examiner ses tentatives.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Notifications et états de livraison correspondant aux filtres.\n- Métadonnées et raisons d’erreur expurgées disponibles.\n\n### Conditions et effets\n\nCette route concerne le service de courrier électronique ; les notifications opérationnelles reçues de PI ont une autre route.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant ou filtre invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_9",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État de livraison recherché selon le schéma.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "PENDING",
                "SENDING",
                "RETRY",
                "ACCEPTED",
                "FAILED",
                "SKIPPED"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nombre maximal de notifications demandé.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.platform.notification.store.MailNotificationRecord"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Notifications et états de livraison correspondant aux filtres. Métadonnées et raisons d’erreur expurgées disponibles."
          },
          "400": {
            "description": "Participant ou filtre invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les notifications par courrier électronique",
        "tags": [
          "Notifications et reprises"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/notifications/{notificationId}": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de retrouver le détail d’une notification par courrier électronique et l’historique de ses essais de livraison.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour identifier la cause d’un échec et vérifier si une reprise est justifiée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- État et métadonnées de la notification.\n- Tentatives d’envoi et erreurs expurgées.\n\n### Conditions et effets\n\nLa lecture ne renvoie pas la notification au destinataire.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Notification introuvable pour ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_12",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la notification par courrier électronique.",
            "in": "path",
            "name": "notificationId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.platform.notification.NotificationOperations$Detail"
                }
              }
            },
            "description": "État et métadonnées de la notification. Tentatives d’envoi et erreurs expurgées."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Notification introuvable pour ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une notification et ses tentatives d’envoi",
        "tags": [
          "Notifications et reprises"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/participants/{participantCode}/notifications/{notificationId}/resume": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de réouvrir le traitement d’une notification arrivée en échec final, avec traçabilité de son intervention.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après correction de la cause et examen des tentatives précédentes.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreason justifie le nouvel essai d’envoi.\n\n### Données retournées\n\n- Détail de la notification après demande de reprise.\n\n### Conditions et effets\n\nL’identité de l’opérateur et un motif sont obligatoires ; l’état de la notification doit permettre la reprise. La réponse n’atteste pas encore la livraison réussie.\n\n### Erreurs et reprise\n\nRelire la notification avant une nouvelle reprise si la réponse a été perdue.\n\n- **400** : Opérateur ou motif manquant.\n\n- **404** : Notification introuvable.\n\n- **409** : État non éligible à la reprise.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "resume_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la notification par courrier électronique.",
            "in": "path",
            "name": "notificationId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.MailNotificationOpsResource$ResumeRequest"
              }
            }
          },
          "description": "reason justifie le nouvel essai d’envoi.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.platform.notification.NotificationOperations$Detail"
                }
              }
            },
            "description": "Détail de la notification après demande de reprise."
          },
          "400": {
            "description": "Opérateur ou motif manquant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Notification introuvable."
          },
          "409": {
            "description": "État non éligible à la reprise."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Reprendre une notification en échec final",
        "tags": [
          "Notifications et reprises"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/tenant-configuration": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter l’état de configuration de l’instance et les versions connues pour les participants.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier une activation, un décalage entre instances ou un changement qui demande un redémarrage.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- État de l’instance et changements en attente de redémarrage.\n- Versions de configuration récentes et enregistrements des instances.\n- Participants connus de la configuration.\n\n### Conditions et effets\n\nLes valeurs secrètes sont expurgées. Aucune configuration n’est modifiée par cette consultation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "summary",
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "additionalProperties": {
                    "type": "object"
                  },
                  "type": "object"
                }
              }
            },
            "description": "État de l’instance et changements en attente de redémarrage. Versions de configuration récentes et enregistrements des instances. Participants connus de la configuration."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la synthèse des configurations déployées",
        "tags": [
          "Configuration des participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/tenant-configuration/{participantCode}": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter le snapshot de configuration enregistré pour un participant, avec sa version et les sources des paramètres.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour expliquer le comportement effectif d’un participant et vérifier les travaux encore en cours lors de son retrait.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Configuration non secrète et informations de version.\n- Sources des valeurs et empreinte disponible.\n- pendingWork : travaux en cours connus pour ce participant.\n\n### Conditions et effets\n\nCette route ne remplace pas les fichiers et le mécanisme d’activation de configuration. Les secrets restent expurgés.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Snapshot de configuration introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "tenant",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "additionalProperties": {
                    "type": "object"
                  },
                  "type": "object"
                }
              }
            },
            "description": "Configuration non secrète et informations de version. Sources des valeurs et empreinte disponible. pendingWork : travaux en cours connus pour ce participant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Snapshot de configuration introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la configuration effective d’un participant",
        "tags": [
          "Configuration des participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/tenant-configuration/{participantCode}/availability-test": {
      "get": {
        "description": "Administrer le couple DISP persisté du tenant, distinct du compte de facturation.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nAvant activation des tests ou changement du compte de recette ; les fichiers ne servent qu’au premier amorçage.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Compte, alias, version du réglage, auteur et date de dernière modification ; configured indique si le couple est complet.\n\n### Conditions et effets\n\nAccès exploitation uniquement ; compte et alias renseignés ensemble. Amorçage, API et démo utilisent le même contrôle en lecture seule : compte CBS, alias PI-RAC, rattachement au même compte/participant, types cohérents et identification non TRAL. Aucune création implicite d’alias ni effet comptable.\n\n### Erreurs et reprise\n\nLecture sans effet financier.\n\n- **400** : Tenant inconnu, couple incomplet ou version invalide.\n\n- **403** : Accès exploitation refusé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "availability",
        "parameters": [
          {
            "description": "Code du tenant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.platform.tenancy.service.AvailabilityTestSettingsService$Settings"
                }
              }
            },
            "description": "Compte, alias, version du réglage, auteur et date de dernière modification ; configured indique si le couple est complet."
          },
          "400": {
            "description": "Tenant inconnu, couple incomplet ou version invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Accès exploitation refusé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lire le compte et l’alias des tests de disponibilité",
        "tags": [
          "Configuration des participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "put": {
        "description": "Administrer le couple DISP persisté du tenant, distinct du compte de facturation.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nAvant activation des tests ou changement du compte de recette ; les fichiers ne servent qu’au premier amorçage.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\naccount : numéro du compte de test ; alias : alias PI-RAC rattaché au même compte ; version : version attendue rendue par GET (entier positif ou nul). Le remplacement est atomique, sans appel financier.\n\n### Données retournées\n\n- Compte, alias, version du réglage, auteur et date de dernière modification ; configured indique si le couple est complet.\n\n### Conditions et effets\n\nAccès exploitation uniquement ; compte et alias renseignés ensemble. Amorçage, API et démo utilisent le même contrôle en lecture seule : compte CBS, alias PI-RAC, rattachement au même compte/participant, types cohérents et identification non TRAL. Aucune création implicite d’alias ni effet comptable.\n\n### Erreurs et reprise\n\nRelire avant reprise après conflit 409 ; fournir la version attendue. Seuls les nouveaux messages utilisent la nouvelle valeur.\n\n- **400** : Tenant inconnu, couple incomplet ou version invalide.\n\n- **403** : Accès exploitation refusé.\n\n- **409** : Version modifiée depuis la lecture.\n\n- **503** : CBS ou PI-RAC indisponible : réglage non modifié.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "availability_1",
        "parameters": [
          {
            "description": "Code du tenant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TenantConfigurationOpsResource$AvailabilityUpdate"
              }
            }
          },
          "description": "account : numéro du compte de test ; alias : alias PI-RAC rattaché au même compte ; version : version attendue rendue par GET (entier positif ou nul). Le remplacement est atomique, sans appel financier.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.platform.tenancy.service.AvailabilityTestSettingsService$Settings"
                }
              }
            },
            "description": "Compte, alias, version du réglage, auteur et date de dernière modification ; configured indique si le couple est complet."
          },
          "400": {
            "description": "Tenant inconnu, couple incomplet ou version invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Accès exploitation refusé."
          },
          "409": {
            "description": "Version modifiée depuis la lecture."
          },
          "503": {
            "description": "CBS ou PI-RAC indisponible : réglage non modifié."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Modifier le compte et l’alias des tests de disponibilité",
        "tags": [
          "Configuration des participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/tenant-configuration/{participantCode}/history": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de relire l’historique de configuration enregistré pour le participant désigné.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour dater un changement et rapprocher un incident d’une version de paramètres.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Historique des versions et métadonnées de configuration disponibles.\n\n### Conditions et effets\n\nAucune réactivation d’ancienne version n’est déclenchée par cette consultation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "history_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "additionalProperties": {
                      "type": "object"
                    },
                    "type": "object"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Historique des versions et métadonnées de configuration disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’historique de configuration d’un participant",
        "tags": [
          "Configuration des participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/active": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter la version active de la correspondance entre les valeurs CBS et les types PI.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler une correspondance, préparer une modification ou vérifier ce qui a changé avant validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_READER` ou `ALIAS_MAP_EDITOR` ou `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Version active, état et métadonnées de validation.\n- Règles : valeur CBS, type client PI et type de compte PI.\n\n### Conditions et effets\n\nLes versions et le contexte appartiennent au participant demandé. Cette lecture n’active aucune matrice.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **403** : Rôle de lecture ou contexte participant insuffisant.\n\n- **404** : Version introuvable.\n\n- **422** : Identifiants ou paramètres invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "active",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                }
              }
            },
            "description": "Version active, état et métadonnées de validation. Règles : valeur CBS, type client PI et type de compte PI."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle de lecture ou contexte participant insuffisant."
          },
          "404": {
            "description": "Version introuvable."
          },
          "422": {
            "description": "Identifiants ou paramètres invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la matrice CBS→PI active",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_READER",
            "ALIAS_MAP_EDITOR",
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/diff": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les différences entre deux versions de la matrice.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler une correspondance, préparer une modification ou vérifier ce qui a changé avant validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_READER` ou `ALIAS_MAP_EDITOR` ou `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Ajouts, suppressions ou modifications de règles entre les versions demandées.\n\n### Conditions et effets\n\nLes versions et le contexte appartiennent au participant demandé. Cette lecture n’active aucune matrice.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **403** : Rôle de lecture ou contexte participant insuffisant.\n\n- **404** : Version introuvable.\n\n- **422** : Identifiants ou paramètres invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "diff",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la version initiale.",
            "in": "query",
            "name": "before",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la version à comparer.",
            "in": "query",
            "name": "after",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Change"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Ajouts, suppressions ou modifications de règles entre les versions demandées."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle de lecture ou contexte participant insuffisant."
          },
          "404": {
            "description": "Version introuvable."
          },
          "422": {
            "description": "Identifiants ou paramètres invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Comparer deux versions de matrice CBS→PI",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_READER",
            "ALIAS_MAP_EDITOR",
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/drafts": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les versions de travail et de validation de la matrice.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler une correspondance, préparer une modification ou vérifier ce qui a changé avant validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_READER` ou `ALIAS_MAP_EDITOR` ou `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Versions de travail disponibles avec leur état et leurs métadonnées.\n\n### Conditions et effets\n\nLes versions et le contexte appartiennent au participant demandé. Cette lecture n’active aucune matrice.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **403** : Rôle de lecture ou contexte participant insuffisant.\n\n- **404** : Version introuvable.\n\n- **422** : Identifiants ou paramètres invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "drafts",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Versions de travail disponibles avec leur état et leurs métadonnées."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle de lecture ou contexte participant insuffisant."
          },
          "404": {
            "description": "Version introuvable."
          },
          "422": {
            "description": "Identifiants ou paramètres invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les matrices CBS→PI non actives",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_READER",
            "ALIAS_MAP_EDITOR",
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/test": {
      "post": {
        "description": "Cet endpoint permet à un lecteur habilité de vérifier la correspondance d’une valeur brute CBS dans la matrice active du participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour expliquer le type client et le type de compte PI retenus, avant de modifier les règles.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_READER` ou `ALIAS_MAP_EDITOR` ou `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\ncbsValue est la valeur brute de type ou produit telle qu’elle est fournie par le CBS.\n\n### Données retournées\n\n- Version de matrice utilisée.\n- Valeur CBS et règle de résolution lorsqu’elle est trouvée.\n\n### Conditions et effets\n\ncbsValue doit être non vide et respecter la limite de taille. Ce test ne crée pas de règle et n’appelle pas le CBS.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **403** : Rôle de lecture insuffisant.\n\n- **422** : Valeur CBS manquante ou trop longue.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "test",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasCategoryMapResource$TestRequest"
              }
            }
          },
          "description": "cbsValue est la valeur brute de type ou produit telle qu’elle est fournie par le CBS.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Resolution"
                }
              }
            },
            "description": "Version de matrice utilisée. Valeur CBS et règle de résolution lorsqu’elle est trouvée."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle de lecture insuffisant."
          },
          "422": {
            "description": "Valeur CBS manquante ou trop longue."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Tester la résolution d’une valeur CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_READER",
            "ALIAS_MAP_EDITOR",
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/versions": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les versions enregistrées de la matrice du participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler une correspondance, préparer une modification ou vérifier ce qui a changé avant validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_READER` ou `ALIAS_MAP_EDITOR` ou `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Versions, auteurs, validateurs, dates et contenu des règles.\n\n### Conditions et effets\n\nLes versions et le contexte appartiennent au participant demandé. Cette lecture n’active aucune matrice.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **403** : Rôle de lecture ou contexte participant insuffisant.\n\n- **404** : Version introuvable.\n\n- **422** : Identifiants ou paramètres invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "history",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Versions, auteurs, validateurs, dates et contenu des règles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle de lecture ou contexte participant insuffisant."
          },
          "404": {
            "description": "Version introuvable."
          },
          "422": {
            "description": "Identifiants ou paramètres invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’historique des matrices CBS→PI",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_READER",
            "ALIAS_MAP_EDITOR",
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à un éditeur habilité de créer une version de travail de la matrice à partir de règles fournies ou d’une version à copier.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour préparer un changement sans toucher à la version active.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_EDITOR`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nrules porte les correspondances explicites ; copyFrom permet de copier une version existante à leur place.\n\n### Données retournées\n\n- Nouvelle version DRAFT, auteur, numéro et règles enregistrées.\n\n### Conditions et effets\n\nChoisir rules ou copyFrom, pas les deux. L’opérateur doit être identifié ; l’activation passe ensuite par soumission et décision.\n\n### Erreurs et reprise\n\nAprès un timeout, relire les brouillons avant de recréer une version.\n\n- **403** : Rôle d’édition insuffisant.\n\n- **404** : Version à copier introuvable.\n\n- **409** : Conflit de version.\n\n- **422** : Règles ou identité de l’auteur invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create_5",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasCategoryMapResource$CreateRequest"
              }
            }
          },
          "description": "rules porte les correspondances explicites ; copyFrom permet de copier une version existante à leur place.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                }
              }
            },
            "description": "Nouvelle version DRAFT, auteur, numéro et règles enregistrées."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle d’édition insuffisant."
          },
          "404": {
            "description": "Version à copier introuvable."
          },
          "409": {
            "description": "Conflit de version."
          },
          "422": {
            "description": "Règles ou identité de l’auteur invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un brouillon de matrice CBS→PI",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_EDITOR"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/versions/{id}/approve": {
      "post": {
        "description": "Cet endpoint permet à un approbateur habilité de activer la version soumise et remplacer la version active précédente. La décision est enregistrée avec son motif.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après examen des règles et de leurs différences avec la version active.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nreason justifie l’approbation ou le rejet et doit respecter les limites du contrôleur/service.\n\n### Données retournées\n\n- Version après décision, validateur, motif et date de décision.\n\n### Conditions et effets\n\nLa version doit attendre approbation. Un motif est requis ; la séparation d’auteur et de validateur est contrôlée lorsque le dispositif à quatre yeux est actif.\n\n### Erreurs et reprise\n\nRelire l’état de la version après un timeout ; une version déjà tranchée ne reçoit pas une nouvelle décision.\n\n- **403** : Rôle insuffisant ou séparation des opérateurs non respectée.\n\n- **404** : Version introuvable.\n\n- **409** : État incompatible avec une décision.\n\n- **422** : Motif ou opérateur invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "approve",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasCategoryMapResource$DecisionRequest"
              }
            }
          },
          "description": "reason justifie l’approbation ou le rejet et doit respecter les limites du contrôleur/service.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                }
              }
            },
            "description": "Version après décision, validateur, motif et date de décision."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle insuffisant ou séparation des opérateurs non respectée."
          },
          "404": {
            "description": "Version introuvable."
          },
          "409": {
            "description": "État incompatible avec une décision."
          },
          "422": {
            "description": "Motif ou opérateur invalide."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Approuver une matrice CBS→PI",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/versions/{id}/reject": {
      "post": {
        "description": "Cet endpoint permet à un approbateur habilité de refuser la version soumise sans l’activer. La décision est enregistrée avec son motif.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après examen des règles et de leurs différences avec la version active.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nreason justifie l’approbation ou le rejet et doit respecter les limites du contrôleur/service.\n\n### Données retournées\n\n- Version après décision, validateur, motif et date de décision.\n\n### Conditions et effets\n\nLa version doit attendre approbation. Un motif est requis ; la séparation d’auteur et de validateur est contrôlée lorsque le dispositif à quatre yeux est actif.\n\n### Erreurs et reprise\n\nRelire l’état de la version après un timeout ; une version déjà tranchée ne reçoit pas une nouvelle décision.\n\n- **403** : Rôle insuffisant ou séparation des opérateurs non respectée.\n\n- **404** : Version introuvable.\n\n- **409** : État incompatible avec une décision.\n\n- **422** : Motif ou opérateur invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "reject_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasCategoryMapResource$DecisionRequest"
              }
            }
          },
          "description": "reason justifie l’approbation ou le rejet et doit respecter les limites du contrôleur/service.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                }
              }
            },
            "description": "Version après décision, validateur, motif et date de décision."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle insuffisant ou séparation des opérateurs non respectée."
          },
          "404": {
            "description": "Version introuvable."
          },
          "409": {
            "description": "État incompatible avec une décision."
          },
          "422": {
            "description": "Motif ou opérateur invalide."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Rejeter une matrice CBS→PI",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/alias-category-map/versions/{id}/submit": {
      "post": {
        "description": "Cet endpoint permet à l’auteur habilité de soumettre son brouillon de matrice après vérification de ses règles.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsqu’un brouillon est prêt pour la décision d’un approbateur.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `ALIAS_MAP_EDITOR`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Version en attente d’approbation avec ses métadonnées et règles.\n\n### Conditions et effets\n\nLa version doit être DRAFT ; seul son auteur peut la soumettre. Cette étape ne remplace pas la matrice active.\n\n### Erreurs et reprise\n\nRelire la version après une réponse perdue ; ne pas soumettre une autre version pour contourner un conflit d’état.\n\n- **403** : Rôle insuffisant ou opérateur différent de l’auteur.\n\n- **404** : Version introuvable.\n\n- **409** : Version pas à l’état brouillon.\n\n- **422** : Règles ou opérateur invalides.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "submit_3",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.AliasCategoryMapService$Version"
                }
              }
            },
            "description": "Version en attente d’approbation avec ses métadonnées et règles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle insuffisant ou opérateur différent de l’auteur."
          },
          "404": {
            "description": "Version introuvable."
          },
          "409": {
            "description": "Version pas à l’état brouillon."
          },
          "422": {
            "description": "Règles ou opérateur invalides."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Soumettre une matrice CBS→PI à validation",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "ALIAS_MAP_EDITOR"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/active": {
      "get": {
        "description": "Consulter la version active des correspondances des types de pièces et des statuts de compte CBS.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nContrôler les règles actives avant un parcours qui utilise une pièce ou un état de compte.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_READER` ou `CBS_MAP_EDITOR` ou `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nLa première lecture initialise une version active vide si aucune version n’existe. Aucune correspondance bancaire n’est devinée.\n\n### Erreurs et reprise\n\nCette consultation ne déclenche pas de paiement. Après une erreur réseau, elle peut être répétée avec les mêmes paramètres.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapActive",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                }
              }
            },
            "description": "Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter les correspondances sémantiques CBS actives",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_READER",
            "CBS_MAP_EDITOR",
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/diff": {
      "get": {
        "description": "Comparer les règles de deux versions du même participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nContrôler les ajouts, suppressions et changements avant une décision.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_READER` ou `CBS_MAP_EDITOR` ou `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Changements : kind, cbsValue, règle before et règle after ; seuls les écarts sont retournés.\n\n### Conditions et effets\n\nLes deux UUID doivent désigner des versions du participant ; la comparaison n’active aucune version.\n\n### Erreurs et reprise\n\nCette consultation ne déclenche pas de paiement. Après une erreur réseau, elle peut être répétée avec les mêmes paramètres.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapDiff",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la version initiale à comparer.",
            "in": "query",
            "name": "before",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la seconde version à comparer.",
            "in": "query",
            "name": "after",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Change"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Changements : kind, cbsValue, règle before et règle after ; seuls les écarts sont retournés."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Comparer deux versions de correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_READER",
            "CBS_MAP_EDITOR",
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/drafts": {
      "get": {
        "description": "Consulter les versions DRAFT et PENDING_APPROVAL du participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nRetrouver un travail en préparation ou en attente de validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_READER` ou `CBS_MAP_EDITOR` ou `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Liste des brouillons et versions en attente de validation.\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nLe filtre porte sur DRAFT et PENDING_APPROVAL ; les versions rejetées ou actives ne sont pas retournées.\n\n### Erreurs et reprise\n\nCette consultation ne déclenche pas de paiement. Après une erreur réseau, elle peut être répétée avec les mêmes paramètres.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapDrafts",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Liste des brouillons et versions en attente de validation. Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les brouillons de correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_READER",
            "CBS_MAP_EDITOR",
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/test": {
      "post": {
        "description": "Résoudre une valeur CBS exacte dans la matrice active, sans modifier ses règles.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nDiagnostiquer une pièce ou un statut CBS absent ou mal configuré.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_READER` ou `CBS_MAP_EDITOR` ou `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nkind identifie la famille de correspondance et cbsValue la valeur CBS exacte. Une absence de règle donne targetValue=null ; ce résultat ne crée aucune correspondance.\n\n### Données retournées\n\n- versionId et versionNumber de la matrice active.\n- kind et cbsValue testés ; targetValue est null en l’absence de correspondance.\n\n### Conditions et effets\n\nLa recherche utilise le couple kind/cbsValue exact. Une première résolution initialise la version active vide si nécessaire.\n\n### Erreurs et reprise\n\nCette consultation ne déclenche pas de paiement. Après une erreur réseau, elle peut être répétée avec les mêmes paramètres.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapTest",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsSemanticMapResource$TestRequest"
              }
            }
          },
          "description": "kind identifie la famille de correspondance et cbsValue la valeur CBS exacte. Une absence de règle donne targetValue=null ; ce résultat ne crée aucune correspondance.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Resolution"
                }
              }
            },
            "description": "versionId et versionNumber de la matrice active. kind et cbsValue testés ; targetValue est null en l’absence de correspondance."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Tester une correspondance sémantique CBS active",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_READER",
            "CBS_MAP_EDITOR",
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/versions": {
      "get": {
        "description": "Retrouver l’historique des versions de la matrice du participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nPréparer une comparaison ou retrouver les auteurs et décisions d’une version.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_READER` ou `CBS_MAP_EDITOR` ou `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Liste des versions, de la plus récente à la plus ancienne.\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nLa consultation initialise la version active vide si nécessaire ; elle n’approuve pas de brouillon.\n\n### Erreurs et reprise\n\nCette consultation ne déclenche pas de paiement. Après une erreur réseau, elle peut être répétée avec les mêmes paramètres.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapHistory",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Liste des versions, de la plus récente à la plus ancienne. Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les versions des correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_READER",
            "CBS_MAP_EDITOR",
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Créer une nouvelle version à partir de règles explicites ou d’une copie existante.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nPréparer les correspondances établies avec l’équipe CBS avant soumission.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_EDITOR`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nrules contient les règles explicites (kind, cbsValue, targetValue), ou copyFrom désigne la version à copier. rules=[] prépare une version vide ; aucune valeur CBS bancaire ne peut être déduite de cet exemple.\n\n### Données retournées\n\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nChoisir rules ou copyFrom, jamais les deux. Une liste vide est autorisée pour préparer une matrice vide. Les couples kind/cbsValue sont uniques et les cibles sont validées par le service. Aucune activation à cette étape.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire les versions et leur état avant de répéter la mutation. La création de brouillon ne porte pas de clé d’idempotence : ne pas supposer qu’un nouvel appel retrouve le même brouillon.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapCreate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "rules": []
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsSemanticMapResource$CreateRequest"
              }
            }
          },
          "description": "rules contient les règles explicites (kind, cbsValue, targetValue), ou copyFrom désigne la version à copier. rules=[] prépare une version vide ; aucune valeur CBS bancaire ne peut être déduite de cet exemple.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                }
              }
            },
            "description": "Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un brouillon de correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_EDITOR"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/versions/{id}/approve": {
      "post": {
        "description": "Activer une version en attente de validation et remplacer la version active précédente.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nAprès revue des différences, des valeurs CBS et de leurs cibles.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nreason : motif obligatoire de la décision (1 à 1000 caractères). L’auteur provient de l’identité opérateur de confiance.\n\n### Données retournées\n\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nLa version doit être PENDING_APPROVAL. reason contient de 1 à 1000 caractères. Si platform.cbs.mapping.four-eyes=true, le décideur doit être différent de l’auteur. La version précédente devient SUPERSEDED et le cache est invalidé après validation transactionnelle.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire les versions et leur état avant de répéter la mutation. La création de brouillon ne porte pas de clé d’idempotence : ne pas supposer qu’un nouvel appel retrouve le même brouillon.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapApprove",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsSemanticMapResource$DecisionRequest"
              }
            }
          },
          "description": "reason : motif obligatoire de la décision (1 à 1000 caractères). L’auteur provient de l’identité opérateur de confiance.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                }
              }
            },
            "description": "Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Approuver les correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/versions/{id}/reject": {
      "post": {
        "description": "Passer une version PENDING_APPROVAL à REJECTED en conservant la version active.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nRefuser un brouillon soumis dont les correspondances ne sont pas approuvées.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_APPROVER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nreason : motif obligatoire de la décision (1 à 1000 caractères). L’auteur provient de l’identité opérateur de confiance.\n\n### Données retournées\n\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nreason contient de 1 à 1000 caractères. Si platform.cbs.mapping.four-eyes=true, le décideur doit être différent de l’auteur. Le rejet n’active aucune règle proposée.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire les versions et leur état avant de répéter la mutation. La création de brouillon ne porte pas de clé d’idempotence : ne pas supposer qu’un nouvel appel retrouve le même brouillon.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapReject",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CbsSemanticMapResource$DecisionRequest"
              }
            }
          },
          "description": "reason : motif obligatoire de la décision (1 à 1000 caractères). L’auteur provient de l’identité opérateur de confiance.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                }
              }
            },
            "description": "Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Rejeter les correspondances sémantiques CBS proposées",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_APPROVER"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/cbs-semantic-map/versions/{id}/submit": {
      "post": {
        "description": "Passer un brouillon DRAFT à PENDING_APPROVAL.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nPrésenter un brouillon finalisé au validateur habilité.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `CBS_MAP_EDITOR`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Version : id, number, status, author, validator, reason et copiedFrom.\n- Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt.\n- Règles : kind, cbsValue et targetValue.\n\n### Conditions et effets\n\nSeul l’auteur du brouillon peut le soumettre ; les règles sont revérifiées et la version doit être DRAFT.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire les versions et leur état avant de répéter la mutation. La création de brouillon ne porte pas de clé d’idempotence : ne pas supposer qu’un nouvel appel retrouve le même brouillon.\n\n- **403** : Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif.\n\n- **404** : Version introuvable dans ce participant.\n\n- **409** : État de version incompatible avec la transition demandée.\n\n- **422** : Paramètre, auteur, motif ou règle invalide selon les contrôles du service.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cbsSemanticMapSubmit",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier de la matrice. En OIDC, proviennent du jeton et remplacent l’en-tête fourni ; en recette OFF, les rôles nécessaires doivent être fournis par le dispositif de confiance.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Auteur de l’action, requis par le circuit de validation. En OIDC, provient de l’identité du jeton, pas de l’en-tête de l’appelant.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.mapping.CbsSemanticMapService$Version"
                }
              }
            },
            "description": "Version : id, number, status, author, validator, reason et copiedFrom. Horodatages disponibles : createdAt, submittedAt, decidedAt et supersededAt. Règles : kind, cbsValue et targetValue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte ou rôles insuffisants ; sur une décision, séparation auteur/validateur exigée si le contrôle quatre yeux est actif."
          },
          "404": {
            "description": "Version introuvable dans ce participant."
          },
          "409": {
            "description": "État de version incompatible avec la transition demandée."
          },
          "422": {
            "description": "Paramètre, auteur, motif ou règle invalide selon les contrôles du service."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Soumettre un brouillon de correspondances sémantiques CBS",
        "tags": [
          "Matrice des catégories"
        ],
        "x-authorization": {
          "additionalRoles": [
            "CBS_MAP_EDITOR"
          ],
          "additionalRolesEnforced": true,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/provisioning": {
      "post": {
        "description": "Cet endpoint permet à un opérateur habilité de générer de bout en bout les données factices d'un tenant : matrices, comptes du CBS simulé, alias PI-RAC et clients Business.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL'utiliser pour préparer un tenant de recette ou d'homologation ; il est refusé tant que le .env du tenant ne porte pas PROVISIONING_DEMO_ENABLED=true.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `TENANT_PROVISIONER`. Ce contrôle de la matrice reste actif même en mode OFF. En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nsteps liste les étapes à jouer ; absent ou vide : toutes.\n\n### Données retournées\n\n- Un compte rendu par étape (MATRICES, CBS_ACCOUNTS, ALIASES, AVAILABILITY_TEST, BUSINESS_CLIENTS) : statut, éléments créés et déjà présents, détail des échecs.\n- personas : les comptes et identifiants de clients du modèle d'homologation ; generated : les clés d'alias générées par PI-RAC. Aucun secret n'est renvoyé.\n\n### Conditions et effets\n\nLe tenant doit demander le provisionnement dans son .env. Les comptes factices exigent l'adaptateur CBS simulé (étape ignorée sinon). Les étapes jouées sont celles du corps, toutes si absent.\n\n### Erreurs et reprise\n\nIdempotent : rejouer l'appel complète ce qui manque sans rien dupliquer.\n\n- **403** : Rôle TENANT_PROVISIONER absent du jeton.\n\n- **409** : Le provisionnement de démonstration n'est pas demandé pour ce tenant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "provision",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.provisioning.TenantProvisioningResource$Request"
              }
            }
          },
          "description": "steps liste les étapes à jouer ; absent ou vide : toutes."
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.provisioning.TenantProvisioningService$Report"
                }
              }
            },
            "description": "Un compte rendu par étape (MATRICES, CBS_ACCOUNTS, ALIASES, AVAILABILITY_TEST, BUSINESS_CLIENTS) : statut, éléments créés et déjà présents, détail des échecs. personas : les comptes et identifiants de clients du modèle d'homologation ; generated : les clés d'alias générées par PI-RAC. Aucun secret n'est renvoyé."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Rôle TENANT_PROVISIONER absent du jeton."
          },
          "409": {
            "description": "Le provisionnement de démonstration n'est pas demandé pour ce tenant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Provisionner un tenant de démonstration",
        "tags": [
          "Provisionnement de démonstration"
        ],
        "x-authorization": {
          "additionalRoles": [
            "TENANT_PROVISIONER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/ops/{participantCode}/reconciliation-cases": {
      "get": {
        "description": "L'opérateur consulte les anomalies ouvertes du participant et les fonds qui restent réservés ou prépositionnés.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nAprès épuisement des recherches de statut ou signalement d'une attente ancienne par le filet de sécurité.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-ops`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Au plus 200 cas ouverts, les plus anciens d'abord, identifiants de corrélation et âge en secondes.\n- Statut du transfert, comptabilité, montant et indicateur de fonds retenus ; comptabilité du retour lorsqu'elle existe.\n\n### Conditions et effets\n\nLecture seule et isolation par participant. Une issue ambiguë ne provoque aucune libération automatique des fonds.\n\n### Erreurs et reprise\n\nLecture rejouable sans effet financier ; un cas ouvert reste visible jusqu'à son traitement opérateur.\n\n- **403** : Contexte du participant incohérent ou accès opérateur refusé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "reconciliationCasesList",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page des cas ouverts, base zéro. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Nombre de cas demandés, 100 par défaut, plafonné à 200. Valeur par défaut : `100`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 100,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ReconciliationResource$CaseView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Au plus 200 cas ouverts, les plus anciens d'abord, identifiants de corrélation et âge en secondes. Statut du transfert, comptabilité, montant et indicateur de fonds retenus ; comptabilité du retour lorsqu'elle existe."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Contexte du participant incohérent ou accès opérateur refusé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les cas de rapprochement et les fonds retenus",
        "tags": [
          "Supervision et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-ops",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks": {
      "get": {
        "description": "Cet endpoint permet au canal de retrouver les lots de création et de suppression d’alias de son participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour construire une liste de suivi et ouvrir le détail du lot choisi.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Résumés des lots correspondant à la page demandée.\n\n### Conditions et effets\n\nLes lignes individuelles sont disponibles par la route items du lot.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_6",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille de page, 20 par défaut. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$Summary"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Résumés des lots correspondant à la page demandée."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les lots d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet au canal du participant de soumettre plusieurs créations d’alias pour traitement progressif dans le quota PI-RAC du participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour un enrôlement en masse, puis suivre les lignes acceptées, refusées ou incertaines.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreference identifie le lot ; items contient les lignes ref, type, fallbackType éventuel, key, account, client et compte.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nChaque ligne décrit le type demandé, la clé éventuelle, le compte et les données client/compte ; un type de repli est facultatif, jamais implicite.\n\n### Erreurs et reprise\n\nLa même référence avec le même contenu restitue le lot et peut porter Idempotency-Replayed. Une ligne d’issue incertaine doit être vérifiée avant une nouvelle création.\n\n- **400** : Lot ou lignes invalides.\n\n- **409** : Référence déjà employée avec un contenu incompatible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "submit_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$SubmitRequest"
              }
            }
          },
          "description": "reference identifie le lot ; items contient les lignes ref, type, fallbackType éventuel, key, account, client et compte.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "400": {
            "description": "Lot ou lignes invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Référence déjà employée avec un contenu incompatible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/deletions": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de demander la suppression progressive d’une liste d’alias.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après validation explicite du périmètre à supprimer, puis contrôler le résultat de chaque ligne.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreference identifie le lot ; confirm autorise explicitement la suppression ; reason porte le motif et items les clés à supprimer.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nconfirm doit être vrai. Une suppression est irréversible ; elle ne rappelle pas les paiements et ne doit pas être confondue avec l’annulation d’un lot en attente.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **400** : Confirmation absente ou lot invalide.\n\n- **409** : Référence en conflit avec un autre contenu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "submitDeletion",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$DeleteRequest"
              }
            }
          },
          "description": "reference identifie le lot ; confirm autorise explicitement la suppression ; reason porte le motif et items les clés à supprimer.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "400": {
            "description": "Confirmation absente ou lot invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Référence en conflit avec un autre contenu."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Soumettre un lot de suppressions d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal de consulter l’avancement d’un lot, ses compteurs et une estimation de son traitement restant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pendant le traitement ou avant une pause, une reprise ou une inspection des lignes.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nLes estimations dépendent du débit observé ou permis et ne sont pas une garantie de délai.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_11",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la progression d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/cancel": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de abandonner les lignes du lot qui peuvent encore être arrêtées.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après lecture du lot et de ses lignes pour contrôler la suite de son traitement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nCette action n’annule pas les créations ou suppressions déjà exécutées dans PI-RAC.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire le lot et ses lignes avant une autre action.\n\n- **404** : Lot introuvable.\n\n- **409** : État du lot incompatible avec cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cancel_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          },
          "409": {
            "description": "État du lot incompatible avec cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Arrêter les lignes restantes d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/export": {
      "get": {
        "description": "Cet endpoint permet au canal ou au support d’extraire les lignes d’un lot en JSON ou CSV, avec leurs dernières réponses et les alias créés ou supprimés.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour le rapprochement, le compte rendu de campagne ou le traitement des lignes non résolues.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Lignes filtrées par issue et instant de résolution.\n- Extraction JSON ou CSV selon format.\n- X-Alias-Unknown-Remaining : nombre de lignes dont la vérification reste à mener.\n\n### Conditions et effets\n\nCette lecture peut vérifier les issues UNKNOWN dans PI-RAC et enregistrer les alias retrouvés dans la copie locale. Elle ne doit donc pas être décrite comme une lecture sans effet.\n\n### Erreurs et reprise\n\nRéutiliser resolvedSince pour une extraction incrémentale et écarter les lignes déjà traitées. Ne pas recréer un alias parce qu’une ligne reste inconnue.\n\n- **400** : Format, issue ou instant invalide.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "export",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "created, deleted, failed, unknown, pending ou all ; all par défaut. Valeur par défaut : `all`.",
            "in": "query",
            "name": "outcome",
            "required": false,
            "schema": {
              "default": "all",
              "type": "string"
            }
          },
          {
            "description": "json par défaut, ou csv. Valeur par défaut : `json`.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "default": "json",
              "type": "string"
            }
          },
          {
            "description": "Instant ISO 8601 minimal de résolution inclus.",
            "in": "query",
            "name": "resolvedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "object"
                }
              }
            },
            "description": "Lignes filtrées par issue et instant de résolution. Extraction JSON ou CSV selon format. X-Alias-Unknown-Remaining : nombre de lignes dont la vérification reste à mener."
          },
          "400": {
            "description": "Format, issue ou instant invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Extraire les résultats d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/heal": {
      "post": {
        "description": "Cet endpoint permet au support de relire dans PI-RAC les alias créés par un lot mais absents de la copie locale, afin de compléter celle-ci.\n\n### Qui appelle cette opération ?\n\nSupport du participant ; aucun rôle opérateur supplémentaire n’est imposé par ce contrôleur.\n\n### Quand l’utiliser ?\n\nL’utiliser après un défaut d’enregistrement local, sans redemander la création des alias.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Bilan du rattrapage et compteur stillMissing des entrées restant à traiter.\n\n### Conditions et effets\n\nLa route réalise des lectures PI-RAC et peut écrire la copie locale. Un alias absent de PI-RAC ou appartenant à un autre participant n’est pas adopté.\n\n### Erreurs et reprise\n\nLe rattrapage traite un nombre borné de lignes ; rappeler tant que le compteur stillMissing diminue, sans relancer de création.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "heal",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$HealResult"
                }
              }
            },
            "description": "Bilan du rattrapage et compteur stillMissing des entrées restant à traiter."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Rattraper la copie locale d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/items": {
      "get": {
        "description": "Cet endpoint permet au canal d’examiner les résultats individuels d’un lot, y compris les tentatives et les réponses de PI-RAC.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour suivre la progression ou isoler les lignes à examiner avant une reprise.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Numéro et référence de ligne, état et alias concernés.\n- Types et clés demandés ou créés, SHID associé lorsqu’il existe.\n- Historique des tentatives et dernière issue connue.\n\n### Conditions et effets\n\nstate peut contenir plusieurs états séparés par des virgules. resolvedSince permet une lecture incrémentale ; écarter les doublons par numéro de ligne.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : État ou instant invalide.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "items",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "États des lignes séparés par des virgules, selon l’énumération du lot.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Instant ISO 8601 minimal de résolution inclus.",
            "in": "query",
            "name": "resolvedSince",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille de page, 100 par défaut. Valeur par défaut : `100`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 100,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$ItemView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Numéro et référence de ligne, état et alias concernés. Types et clés demandés ou créés, SHID associé lorsqu’il existe. Historique des tentatives et dernière issue connue."
          },
          "400": {
            "description": "État ou instant invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lire les lignes d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/pause": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de empêcher la prise en charge de nouvelles lignes tout en laissant terminer celles déjà en cours.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après lecture du lot et de ses lignes pour contrôler la suite de son traitement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nLe lot doit être dans un état permettant la pause ; les lignes déjà envoyées peuvent encore recevoir leur résultat.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire le lot et ses lignes avant une autre action.\n\n- **404** : Lot introuvable.\n\n- **409** : État du lot incompatible avec cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "pause",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          },
          "409": {
            "description": "État du lot incompatible avec cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Mettre en pause un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/report": {
      "get": {
        "description": "Cet endpoint permet au canal de lire le rapport synthétique d’un lot de création ou de suppression d’alias.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour distinguer les issues du lot avant une extraction ou un traitement manuel.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Bilan du lot et répartition des issues connues selon le schéma de rapport.\n\n### Conditions et effets\n\nUn bilan comportant des issues UNKNOWN n’est pas la preuve que ces lignes ont échoué dans PI-RAC.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "report",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasBulkService$Report"
                }
              }
            },
            "description": "Bilan du lot et répartition des issues connues selon le schéma de rapport."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le bilan d’un lot d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-bulks/{id}/resume": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de reprendre le traitement d’un lot HALTED ou PAUSED après correction de la cause de l’arrêt.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après lecture du lot et de ses lignes pour contrôler la suite de son traitement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Résumé du lot et compteurs de ses lignes.\n- Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles.\n- État et informations de progression du traitement.\n\n### Conditions et effets\n\nVérifier la cause de l’arrêt, les accès PI-RAC et le plan d’usage avant la reprise. Aucun renvoi aveugle d’une ligne ambiguë n’est autorisé.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire le lot et ses lignes avant une autre action.\n\n- **404** : Lot introuvable.\n\n- **409** : État du lot incompatible avec cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "resume",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasBulkResource$BulkView"
                }
              }
            },
            "description": "Résumé du lot et compteurs de ses lignes. Estimation du temps restant et débit utilisé lorsqu’ils sont disponibles. État et informations de progression du traitement."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable."
          },
          "409": {
            "description": "État du lot incompatible avec cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Reprendre un lot d’alias arrêté ou en pause",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-claims": {
      "get": {
        "description": "Cet endpoint permet au canal du détenteur d’un alias de consulter les revendications reçues qui attendent encore une décision.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour préparer la présentation au client et surveiller les échéances de réponse.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Référence de revendication, clé d’alias et état.\n- Dates de réception, échéances de réponse et de clôture.\n- Date d’acceptation automatique prévue et date de notification du client.\n\n### Conditions et effets\n\nLa liste reflète le suivi durable du participant détenteur ; elle ne crée pas une nouvelle revendication.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "pendingClaims",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$PendingClaim"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Référence de revendication, clé d’alias et état. Dates de réception, échéances de réponse et de clôture. Date d’acceptation automatique prévue et date de notification du client."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les revendications d’alias reçues en attente",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-claims/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal du participant de retrouver l’état d’une revendication dans le répertoire.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après l’initiation ou avant une décision pour vérifier si la revendication est toujours ouverte.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Identifiant et état de la revendication.\n- Informations de l’alias et de la revendication disponibles dans la réponse PI-RAC.\n\n### Conditions et effets\n\nL’identifiant de revendication n’est pas une clé d’alias ; conserver la référence retournée à sa création.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Revendication inconnue.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "getClaim",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$ClaimView"
                }
              }
            },
            "description": "Identifiant et état de la revendication. Informations de l’alias et de la revendication disponibles dans la réponse PI-RAC."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Revendication inconnue."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une revendication d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-claims/{id}/acceptance": {
      "put": {
        "description": "Cet endpoint permet au canal du participant détenteur de accepter la revendication d’un alias qu’il détient, après décision du client ou dans le cas prévu pour le participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une revendication encore en attente, après consultation de son état et recueil de la décision appropriée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nactionAuteur est obligatoire et vaut CLIENT ou PARTICIPANT selon l’auteur réel de la décision.\n\n### Données retournées\n\n- État de la revendication après décision.\n- Idempotency-Replayed lors de la restitution d’une décision déjà exécutée.\n\n### Conditions et effets\n\nUne revendication déjà résolue ne doit pas recevoir une nouvelle décision contradictoire.\n\n### Erreurs et reprise\n\nConserver Idempotency-Key pour la même décision. Un conflit d’état doit être résolu par consultation, pas par une nouvelle clé.\n\n- **400** : Clé ou auteur de décision manquant.\n\n- **409** : Revendication déjà tranchée ou première décision encore incertaine.\n\n- **422** : Clé réutilisée pour une autre demande.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "acceptClaim",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$ClaimAcceptance"
              }
            }
          },
          "description": "actionAuteur est obligatoire et vaut CLIENT ou PARTICIPANT selon l’auteur réel de la décision."
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "État de la revendication après décision. Idempotency-Replayed lors de la restitution d’une décision déjà exécutée."
          },
          "400": {
            "description": "Clé ou auteur de décision manquant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Revendication déjà tranchée ou première décision encore incertaine."
          },
          "422": {
            "description": "Clé réutilisée pour une autre demande."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Accepter une revendication d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-claims/{id}/rejection": {
      "put": {
        "description": "Cet endpoint permet au canal du participant détenteur de refuser la revendication après décision du client détenteur.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une revendication encore en attente, après consultation de son état et recueil de la décision appropriée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- État de la revendication après décision.\n- Idempotency-Replayed lors de la restitution d’une décision déjà exécutée.\n\n### Conditions et effets\n\nUne revendication déjà résolue ne doit pas recevoir une nouvelle décision contradictoire.\n\n### Erreurs et reprise\n\nConserver Idempotency-Key pour la même décision. Un conflit d’état doit être résolu par consultation, pas par une nouvelle clé.\n\n- **400** : Clé ou auteur de décision manquant.\n\n- **409** : Revendication déjà tranchée ou première décision encore incertaine.\n\n- **422** : Clé réutilisée pour une autre demande.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "rejectClaim",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "État de la revendication après décision. Idempotency-Replayed lors de la restitution d’une décision déjà exécutée."
          },
          "400": {
            "description": "Clé ou auteur de décision manquant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Revendication déjà tranchée ou première décision encore incertaine."
          },
          "422": {
            "description": "Clé réutilisée pour une autre demande."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Refuser une revendication d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-registry/comparison/{key}": {
      "get": {
        "description": "Cet endpoint permet au support du participant de rapprocher les informations de sa copie locale et celles de PI-RAC pour le même alias.\n\n### Qui appelle cette opération ?\n\nSupport du participant ; aucun rôle opérateur supplémentaire n’est imposé par ce contrôleur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour diagnostiquer une absence ou une différence sans lancer une modification d’alias.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Informations disponibles dans la copie locale et dans PI-RAC.\n- Verdict de comparaison pour la clé demandée.\n\n### Conditions et effets\n\nLa route lit le répertoire et ne corrige pas les différences. Elle n’est pas une recherche préalable au paiement.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **503** : Répertoire indisponible pendant la comparaison.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "compare",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasService$Comparison"
                }
              }
            },
            "description": "Informations disponibles dans la copie locale et dans PI-RAC. Verdict de comparaison pour la clé demandée."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "503": {
            "description": "Répertoire indisponible pendant la comparaison."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Comparer un alias local avec sa référence PI-RAC",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-registry/local": {
      "get": {
        "description": "Cet endpoint permet au support du participant de retrouver les alias connus de la copie locale, y compris par compte ou nom du titulaire lorsqu’il ne connaît pas leur clé.\n\n### Qui appelle cette opération ?\n\nSupport ou opérateur du participant ; le filtre OIDC de cette route exige les mêmes rôles que les routes client, sans rôle opérateur supplémentaire dans le contrôleur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une investigation locale ; consulter ensuite PI-RAC si la référence distante doit être vérifiée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- source égal à LOCAL.\n- Nombre de lignes retournées.\n- Entrées locales correspondant aux filtres : alias, compte, titulaire et état.\n\n### Conditions et effets\n\nCette route ne consulte pas PI-RAC. Un alias créé en dehors de cette plateforme peut être absent ; ce résultat n’autorise pas un transfert.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Filtre d’état ou pagination invalide.\n\n- **404** : Copie locale indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "searchLocal",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Compte exact dans la copie locale.",
            "in": "query",
            "name": "account",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias.",
            "in": "query",
            "name": "key",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "SHID associé pour retrouver un alias lié.",
            "in": "query",
            "name": "linkedShid",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Type d’alias recherché.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État local ACTIVE ou DELETED.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Partie du nom du titulaire.",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page de recherche à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille de page, 50 par défaut. Valeur par défaut : `50`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 50,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$LocalSearch"
                }
              }
            },
            "description": "source égal à LOCAL. Nombre de lignes retournées. Entrées locales correspondant aux filtres : alias, compte, titulaire et état."
          },
          "400": {
            "description": "Filtre d’état ou pagination invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Copie locale indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Rechercher dans la copie locale des alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/alias-registry/pi-rac/{key}": {
      "get": {
        "description": "Cet endpoint permet au support du participant d’interroger directement le répertoire pour une clé exacte, indépendamment de la copie locale.\n\n### Qui appelle cette opération ?\n\nSupport du participant ; aucun rôle opérateur supplémentaire n’est imposé par ce contrôleur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier ce que PI-RAC connaît d’un alias au cours d’une investigation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- source égal à PI-RAC.\n- Alias, compte et propriétaire connus du répertoire.\n\n### Conditions et effets\n\nAucun EndToEndId de transfert n’est fourni : le cœur utilise une référence technique. Cette consultation consomme le quota PI mais ne prépare ni n’autorise un transfert.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Clé inconnue de PI-RAC.\n\n- **429** : Quota du participant atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "searchPiRac",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$PiRacSearch"
                }
              }
            },
            "description": "source égal à PI-RAC. Alias, compte et propriétaire connus du répertoire."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Clé inconnue de PI-RAC."
          },
          "429": {
            "description": "Quota du participant atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter un alias dans PI-RAC pour diagnostic",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de créer un alias pour le compte d’un client après les contrôles du participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après la demande du titulaire et la préparation des données client et compte.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nLe corps porte alias, client et compte selon les schémas de création.\n\n### Données retournées\n\n- Alias, compte et propriétaire selon le résultat du répertoire.\n- Statut de l’opération et informations liées disponibles.\n- Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée.\n\n### Conditions et effets\n\nLe type d’alias, le titulaire et le compte doivent satisfaire les contrôles du répertoire. Fournir la preuve OTP si le parcours direct la demande.\n\n### Erreurs et reprise\n\nIdempotency-Key est obligatoire même si l’en-tête apparaît facultatif dans la signature du contrôleur. La même clé et le même contenu restituent la réponse initiale ; clé réutilisée avec d’autres données : 422 ; première issue inconnue ou en cours : 409.\n\n- **400** : Clé d’idempotence absente ou données invalides.\n\n- **409** : Première opération en cours ou issue incertaine.\n\n- **422** : Clé réutilisée avec une autre requête.\n\n- **423** : Alias verrouillé selon la réponse du répertoire.\n\n- **429** : Quota PI-RAC atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create_4",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence de la preuve à usage unique obtenue pour cette opération d’alias, si ce parcours l’exige.",
            "in": "header",
            "name": "x-otp-id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Code à usage unique reçu par le client pour cette opération ; ne pas le conserver dans une collection ou un journal partagé.",
            "in": "header",
            "name": "x-otp-code",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$CreateRequest"
              }
            }
          },
          "description": "Le corps porte alias, client et compte selon les schémas de création.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Alias, compte et propriétaire selon le résultat du répertoire. Statut de l’opération et informations liées disponibles. Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée."
          },
          "400": {
            "description": "Clé d’idempotence absente ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Première opération en cours ou issue incertaine."
          },
          "422": {
            "description": "Clé réutilisée avec une autre requête."
          },
          "423": {
            "description": "Alias verrouillé selon la réponse du répertoire."
          },
          "429": {
            "description": "Quota PI-RAC atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un alias de compte",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/initiations": {
      "post": {
        "description": "Cet endpoint permet au canal de conserver une création, modification, suppression ou revendication d’alias avant son exécution dans PI-RAC.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour un parcours où le client relit la demande puis confirme ou abandonne l’opération.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\noperation vaut CREATE, UPDATE, DELETE ou CLAIM. CREATE et UPDATE portent demande ; UPDATE, DELETE et CLAIM désignent key. DELETE peut préciser reason.\n\n### Données retournées\n\n- Identifiant de l’initiation, opération et alias concerné.\n- État, dates de création et d’expiration.\n- Location pour consulter l’initiation.\n\n### Conditions et effets\n\nAucun appel d’écriture PI-RAC n’est exécuté à cette étape. La décision projet de ce parcours en deux temps n’impose pas d’OTP.\n\n### Erreurs et reprise\n\nConserver l’identifiant de l’initiation ; consulter son état avant une nouvelle préparation si la réponse a été perdue.\n\n- **400** : Opération ou demande invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "initiate_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$InitiationRequest"
              }
            }
          },
          "description": "operation vaut CREATE, UPDATE, DELETE ou CLAIM. CREATE et UPDATE portent demande ; UPDATE, DELETE et CLAIM désignent key. DELETE peut préciser reason.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$Initiation"
                }
              }
            },
            "description": "Identifiant de l’initiation, opération et alias concerné. État, dates de création et d’expiration. Location pour consulter l’initiation."
          },
          "400": {
            "description": "Opération ou demande invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer une opération d’alias à confirmer",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/initiations/{id}": {
      "delete": {
        "description": "Cet endpoint permet au canal de abandonner la demande conservée avant son exécution. Il applique la décision à l’initiation existante.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après consultation de l’initiation et accord ou abandon du client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Opération et état après décision.\n- Dates disponibles et résultat conservé lorsque l’exécution a eu lieu.\n\n### Conditions et effets\n\nUne préparation expirée, déjà exécutée ou dans un état incompatible peut être refusée. Abandonner une préparation ne supprime pas un alias déjà créé.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Initiation introuvable.\n\n- **409** : Initiation expirée ou état incompatible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cancel_3",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$Initiation"
                }
              }
            },
            "description": "Opération et état après décision. Dates disponibles et résultat conservé lorsque l’exécution a eu lieu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable."
          },
          "409": {
            "description": "Initiation expirée ou état incompatible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Abandonner une opération d’alias préparée",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "get": {
        "description": "Cet endpoint permet au canal de connaître l’état d’une opération d’alias en deux temps et son résultat lorsqu’elle a été exécutée.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant de confirmer ou d’annuler, et après une réponse réseau ambiguë.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Opération, alias et état de l’initiation.\n- Dates de création, expiration et résolution.\n- Résultat conservé de l’opération lorsqu’il existe.\n\n### Conditions et effets\n\nUne préparation expirée ne doit pas être considérée comme exécutable.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Initiation introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "getInitiation",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$Initiation"
                }
              }
            },
            "description": "Opération, alias et état de l’initiation. Dates de création, expiration et résolution. Résultat conservé de l’opération lorsqu’il existe."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une opération d’alias préparée",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/initiations/{id}/confirmation": {
      "post": {
        "description": "Cet endpoint permet au canal de exécuter la demande conservée dans PI-RAC. Il applique la décision à l’initiation existante.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après consultation de l’initiation et accord ou abandon du client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Opération et état après décision.\n- Dates disponibles et résultat conservé lorsque l’exécution a eu lieu.\n\n### Conditions et effets\n\nUne préparation expirée, déjà exécutée ou dans un état incompatible peut être refusée. Abandonner une préparation ne supprime pas un alias déjà créé.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Initiation introuvable.\n\n- **409** : Initiation expirée ou état incompatible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "confirm_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$Initiation"
                }
              }
            },
            "description": "Opération et état après décision. Dates disponibles et résultat conservé lorsque l’exécution a eu lieu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable."
          },
          "409": {
            "description": "Initiation expirée ou état incompatible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer une opération d’alias préparée",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/{key}": {
      "delete": {
        "description": "Cet endpoint permet au canal du participant de supprimer l’alias désigné et restituer le résultat de la suppression des alias éventuellement liés.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après validation de la demande de suppression par le titulaire ou du motif applicable.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Alias, compte et propriétaire selon le résultat du répertoire.\n- Statut de l’opération et informations liées disponibles.\n- Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée.\n\n### Conditions et effets\n\nLa suppression d’un alias n’annule aucun paiement déjà exécuté. Une preuve OTP peut être demandée sur le parcours direct.\n\n### Erreurs et reprise\n\nIdempotency-Key est obligatoire même si l’en-tête apparaît facultatif dans la signature du contrôleur. La même clé et le même contenu restituent la réponse initiale ; clé réutilisée avec d’autres données : 422 ; première issue inconnue ou en cours : 409.\n\n- **400** : Clé d’idempotence absente ou données invalides.\n\n- **409** : Première opération en cours ou issue incertaine.\n\n- **422** : Clé réutilisée avec une autre requête.\n\n- **423** : Alias verrouillé selon la réponse du répertoire.\n\n- **429** : Quota PI-RAC atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "delete",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Motif de suppression PI-RAC ; DEMANDE_CLIENT est utilisé par défaut.",
            "in": "query",
            "name": "reason",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence de la preuve à usage unique obtenue pour cette opération d’alias, si ce parcours l’exige.",
            "in": "header",
            "name": "x-otp-id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Code à usage unique reçu par le client pour cette opération ; ne pas le conserver dans une collection ou un journal partagé.",
            "in": "header",
            "name": "x-otp-code",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Alias, compte et propriétaire selon le résultat du répertoire. Statut de l’opération et informations liées disponibles. Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée."
          },
          "400": {
            "description": "Clé d’idempotence absente ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Première opération en cours ou issue incertaine."
          },
          "422": {
            "description": "Clé réutilisée avec une autre requête."
          },
          "423": {
            "description": "Alias verrouillé selon la réponse du répertoire."
          },
          "429": {
            "description": "Quota PI-RAC atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Supprimer un alias de compte",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "get": {
        "description": "Cet endpoint permet au canal payeur de rechercher dans PI-RAC le titulaire et le compte d’un alias. La recherche est enregistrée sous l’EndToEndId transmis pour pouvoir contrôler le transfert à venir.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour identifier le bénéficiaire, afficher son nom et son pays au client, puis réutiliser le même EndToEndId lors du transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Alias et type d’alias.\n- Compte et participant qui le tient.\n- Informations du propriétaire disponibles dans la réponse du répertoire.\n\n### Conditions et effets\n\nx-pi-EndToEndId est obligatoire. Une lecture de la copie locale ou une recherche opérateur ne remplace pas cette recherche préalable.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : En-tête ou clé invalide.\n\n- **404** : Alias inconnu du répertoire.\n\n- **423** : Alias verrouillé.\n\n- **429** : Quota de recherche atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias recherché.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId du transfert à venir ; la recherche et le paiement doivent rester corrélés.",
            "in": "header",
            "name": "x-pi-EndToEndId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$AliasView"
                }
              }
            },
            "description": "Alias et type d’alias. Compte et participant qui le tient. Informations du propriétaire disponibles dans la réponse du répertoire."
          },
          "400": {
            "description": "En-tête ou clé invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Alias inconnu du répertoire."
          },
          "423": {
            "description": "Alias verrouillé."
          },
          "429": {
            "description": "Quota de recherche atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Résoudre un alias pour préparer un transfert",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "put": {
        "description": "Cet endpoint permet au canal du participant de mettre à jour les informations modifiables d’un alias détenu par le participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque les coordonnées ou caractéristiques autorisées du titulaire ou du compte changent.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nLe corps porte les modifications client et compte autorisées ; key identifie l’alias.\n\n### Données retournées\n\n- Alias, compte et propriétaire selon le résultat du répertoire.\n- Statut de l’opération et informations liées disponibles.\n- Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée.\n\n### Conditions et effets\n\nLe participant doit pouvoir modifier l’alias et les champs doivent appartenir au périmètre autorisé. Une preuve OTP peut être demandée.\n\n### Erreurs et reprise\n\nIdempotency-Key est obligatoire même si l’en-tête apparaît facultatif dans la signature du contrôleur. La même clé et le même contenu restituent la réponse initiale ; clé réutilisée avec d’autres données : 422 ; première issue inconnue ou en cours : 409.\n\n- **400** : Clé d’idempotence absente ou données invalides.\n\n- **409** : Première opération en cours ou issue incertaine.\n\n- **422** : Clé réutilisée avec une autre requête.\n\n- **423** : Alias verrouillé selon la réponse du répertoire.\n\n- **429** : Quota PI-RAC atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "update_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence de la preuve à usage unique obtenue pour cette opération d’alias, si ce parcours l’exige.",
            "in": "header",
            "name": "x-otp-id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Code à usage unique reçu par le client pour cette opération ; ne pas le conserver dans une collection ou un journal partagé.",
            "in": "header",
            "name": "x-otp-code",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasPayloads$UpdateRequest"
              }
            }
          },
          "description": "Le corps porte les modifications client et compte autorisées ; key identifie l’alias.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Alias, compte et propriétaire selon le résultat du répertoire. Statut de l’opération et informations liées disponibles. Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée."
          },
          "400": {
            "description": "Clé d’idempotence absente ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Première opération en cours ou issue incertaine."
          },
          "422": {
            "description": "Clé réutilisée avec une autre requête."
          },
          "423": {
            "description": "Alias verrouillé selon la réponse du répertoire."
          },
          "429": {
            "description": "Quota PI-RAC atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Modifier les informations d’un alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/{key}/claims": {
      "post": {
        "description": "Cet endpoint permet au canal du participant de ouvrir une revendication d’alias mobile auprès de son détenteur actuel.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après vérification du besoin et de la possession du numéro par le client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Alias, compte et propriétaire selon le résultat du répertoire.\n- Statut de l’opération et informations liées disponibles.\n- Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée.\n\n### Conditions et effets\n\nLa revendication concerne un alias mobile ; elle n’attribue pas immédiatement cet alias au demandeur. La décision du détenteur est suivie séparément.\n\n### Erreurs et reprise\n\nIdempotency-Key est obligatoire même si l’en-tête apparaît facultatif dans la signature du contrôleur. La même clé et le même contenu restituent la réponse initiale ; clé réutilisée avec d’autres données : 422 ; première issue inconnue ou en cours : 409.\n\n- **400** : Clé d’idempotence absente ou données invalides.\n\n- **409** : Première opération en cours ou issue incertaine.\n\n- **422** : Clé réutilisée avec une autre requête.\n\n- **423** : Alias verrouillé selon la réponse du répertoire.\n\n- **429** : Quota PI-RAC atteint.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "claim",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Obligatoire pour cette écriture d’alias. Conserver la même clé avec la même requête ; 422 si le contenu change et 409 si la première issue est en cours ou inconnue.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence de la preuve à usage unique obtenue pour cette opération d’alias, si ce parcours l’exige.",
            "in": "header",
            "name": "x-otp-id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Code à usage unique reçu par le client pour cette opération ; ne pas le conserver dans une collection ou un journal partagé.",
            "in": "header",
            "name": "x-otp-code",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Alias, compte et propriétaire selon le résultat du répertoire. Statut de l’opération et informations liées disponibles. Idempotency-Replayed présent et vrai lorsque la réponse initiale est restituée."
          },
          "400": {
            "description": "Clé d’idempotence absente ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Première opération en cours ou issue incertaine."
          },
          "422": {
            "description": "Clé réutilisée avec une autre requête."
          },
          "423": {
            "description": "Alias verrouillé selon la réponse du répertoire."
          },
          "429": {
            "description": "Quota PI-RAC atteint."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Revendiquer un alias mobile détenu ailleurs",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/aliases/{key}/otp": {
      "post": {
        "description": "Cet endpoint permet au canal de demander l’envoi d’un code à usage unique au numéro mobile concerné par une opération d’alias.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le parcours exige une preuve de possession avant une création, modification, suppression ou revendication.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\noperation identifie l’action préparée ; account porte le compte lorsqu’il est requis pour ce contrôle.\n\n### Données retournées\n\n- Référence otpId de la demande de preuve.\n- Indicateur required précisant si un code doit être fourni.\n\n### Conditions et effets\n\noperation doit être CREATE, UPDATE, DELETE ou CLAIM. Si le numéro est déjà vérifié à l’enrôlement, required peut être faux. Le code secret n’est pas rendu par l’API.\n\n### Erreurs et reprise\n\nLa preuve reçue est transmise à l’opération concernée dans x-otp-id et x-otp-code ; ne pas confondre cette demande d’envoi avec la confirmation d’une mutation.\n\n- **400** : Opération de preuve non reconnue.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "requestOtp",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "account": "<compte de recette>",
                    "operation": "CREATE"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.AliasResource$OtpRequest"
              }
            }
          },
          "description": "operation identifie l’action préparée ; account porte le compte lorsqu’il est requis pour ce contrôle.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.alias.application.AliasOtpService$Challenge"
                }
              }
            },
            "description": "Référence otpId de la demande de preuve. Indicateur required précisant si un code doit être fourni."
          },
          "400": {
            "description": "Opération de preuve non reconnue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander une preuve de possession d’un numéro d’alias",
        "tags": [
          "Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/bulk-transfer-initiations": {
      "post": {
        "description": "Cet endpoint permet au canal payeur d’ouvrir un lot dont le cœur recherche les bénéficiaires en arrière-plan. Les conditions de chaque paiement sont conservées avant la confirmation globale.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour faire présenter les payés trouvés au client avant l’envoi des virements. Consulter le lot jusqu’à la fin des recherches.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nbulkReference identifie le lot ; items associe payee aux conditions payment de chaque élément.\n\n### Données retournées\n\n- Référence, mode et état de préparation du lot.\n- Statut d’ensemble, compteurs et dates disponibles.\n- Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus.\n\n### Conditions et effets\n\nChaque ligne associe un payee par alias ou compte et un payment de type BULK_PAYMENT_ITEM. Les références doivent être cohérentes et la capacité de masse activée.\n\n### Erreurs et reprise\n\nLa référence du lot permet de retrouver le même lot au rejeu ; ne pas changer de référence pour résoudre une recherche encore en cours.\n\n- **400** : Taille, référence, type d’élément ou désignation du payé invalide.\n\n- **422** : Capacité de paiement de masse désactivée.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "start_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferInitiationResource$InitiationRequest"
              }
            }
          },
          "description": "bulkReference identifie le lot ; items associe payee aux conditions payment de chaque élément.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchResponse"
                }
              }
            },
            "description": "Référence, mode et état de préparation du lot. Statut d’ensemble, compteurs et dates disponibles. Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus."
          },
          "400": {
            "description": "Taille, référence, type d’élément ou désignation du payé invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Capacité de paiement de masse désactivée."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer un lot et rechercher ses bénéficiaires",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/bulk-transfer-initiations/{batchId}": {
      "get": {
        "description": "Cet endpoint permet au canal payeur de connaître la préparation du lot et l’issue de chacun de ses paiements. Il calcule un statut d’ensemble à partir des éléments sans masquer les refus individuels.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pendant les recherches, avant confirmation et après envoi pour présenter les résultats par ligne.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Référence, mode et état de préparation du lot.\n- Statut d’ensemble, compteurs et dates disponibles.\n- Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus.\n\n### Conditions et effets\n\nUn lot peut être partiellement exécuté. READY concerne sa préparation ; le succès financier reste celui des transferts individuels.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_10",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant interne du lot, retourné lors de sa préparation ou sa création.",
            "in": "path",
            "name": "batchId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchResponse"
                }
              }
            },
            "description": "Référence, mode et état de préparation du lot. Statut d’ensemble, compteurs et dates disponibles. Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le détail et les résultats d’un lot",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/bulk-transfer-initiations/{batchId}/confirmation": {
      "post": {
        "description": "Cet endpoint permet au canal du même client payeur de confirmer un lot après la recherche de ses bénéficiaires. Les virements sont créés pour les éléments dont le payé a été trouvé et dont les contrôles autorisent l’envoi.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après consultation des résultats et confirmation du client. Suivre ensuite le statut de chaque paiement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Référence, mode et état de préparation du lot.\n- Statut d’ensemble, compteurs et dates disponibles.\n- Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus.\n\n### Conditions et effets\n\nLe lot doit être READY. Les lignes refusées sont conservées dans le suivi et ne deviennent pas automatiquement des virements.\n\n### Erreurs et reprise\n\nUn nouvel appel sur le lot déjà confirmé restitue son suivi sans recréer les virements. Réutiliser batchId et lire les résultats existants.\n\n- **403** : Lot pas encore prêt à être confirmé.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "confirm_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant interne du lot, retourné lors de sa préparation ou sa création.",
            "in": "path",
            "name": "batchId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchResponse"
                }
              }
            },
            "description": "Référence, mode et état de préparation du lot. Statut d’ensemble, compteurs et dates disponibles. Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Lot pas encore prêt à être confirmé."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer l’envoi des paiements prêts du lot",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/bulk-transfers": {
      "get": {
        "description": "Cet endpoint permet au canal de retrouver les lots du participant, directs ou préparés en deux temps. Il fournit une liste paginée des lots les plus récents.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour construire l’historique des lots, puis ouvrir un lot pour connaître l’état de chaque paiement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Identifiant, référence, mode et état de chaque lot.\n- Nombre de lignes et dates de création et confirmation.\n- Pagination et nombre total de lots.\n\n### Conditions et effets\n\nLe filtre state porte sur l’état du lot ; il ne remplace pas le statut financier des éléments.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Pagination ou état invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_5",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État du lot selon le schéma ; filtre facultatif.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille demandée, 20 par défaut, au maximum 100. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchPage"
                }
              }
            },
            "description": "Identifiant, référence, mode et état de chaque lot. Nombre de lignes et dates de création et confirmation. Pagination et nombre total de lots."
          },
          "400": {
            "description": "Pagination ou état invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les lots de transferts",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet au canal payeur d’envoyer plusieurs transferts préparés sous une même référence de lot. Chaque ligne est contrôlée et suivie séparément ; une ligne refusée ne bloque pas les autres.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque les recherches préalables de chaque payé sont déjà réalisées et que le canal peut fournir des ordres complets.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nbulkReference identifie le lot ; items contient les requêtes de transfert complètes de ses éléments.\n\n### Données retournées\n\n- batchId et bulkReference du lot.\n- Nombre d’éléments acceptés et refusés.\n- Résultat de chaque ligne : références, transfert créé, refus et règle éventuelle.\n\n### Conditions et effets\n\nChaque élément doit être de type BULK_PAYMENT_ITEM, respecter le profil et porter une recherche préalable. La limite d’éléments et la capacité BULK viennent de la configuration du participant.\n\n### Erreurs et reprise\n\nLes clés par élément sont dérivées de bulkReference et businessReference. Réutiliser la même référence et le même contenu pour retrouver les lignes déjà créées ; examiner chaque résultat.\n\n- **400** : Taille ou structure du lot invalide.\n\n- **422** : Paiements en masse désactivés pour ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "submit_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BulkRequest"
              }
            }
          },
          "description": "bulkReference identifie le lot ; items contient les requêtes de transfert complètes de ses éléments.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BulkResponse"
                }
              }
            },
            "description": "batchId et bulkReference du lot. Nombre d’éléments acceptés et refusés. Résultat de chaque ligne : références, transfert créé, refus et règle éventuelle."
          },
          "400": {
            "description": "Taille ou structure du lot invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Paiements en masse désactivés pour ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Soumettre directement un lot de transferts",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/bulk-transfers/{batchId}": {
      "get": {
        "description": "Cet endpoint permet au canal payeur de connaître la préparation du lot et l’issue de chacun de ses paiements. Il calcule un statut d’ensemble à partir des éléments sans masquer les refus individuels.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pendant les recherches, avant confirmation et après envoi pour présenter les résultats par ligne.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Référence, mode et état de préparation du lot.\n- Statut d’ensemble, compteurs et dates disponibles.\n- Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus.\n\n### Conditions et effets\n\nUn lot peut être partiellement exécuté. READY concerne sa préparation ; le succès financier reste celui des transferts individuels.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_9",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant interne du lot, retourné lors de sa préparation ou sa création.",
            "in": "path",
            "name": "batchId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.BulkTransferResource$BatchResponse"
                }
              }
            },
            "description": "Référence, mode et état de préparation du lot. Statut d’ensemble, compteurs et dates disponibles. Paiements dans l’ordre du lot : transfert, état métier et comptable, erreur ou règle de refus."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le détail et les résultats d’un lot",
        "tags": [
          "Paiements de masse"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/alias/{cle}": {
      "get": {
        "description": "Cet endpoint permet à business-api de rechercher un alias afin de composer les informations d’enrôlement du client.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier le propriétaire connu de l’alias avant de poursuivre l’enrôlement Business.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Clé, nom du propriétaire et pays.\n- Catégorie et photo lorsqu’elles sont disponibles dans cette voie.\n\n### Conditions et effets\n\nCette recherche utilise une référence technique d’enrôlement. Elle ne constitue pas la recherche préalable d’un transfert sous son EndToEndId.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Alias inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "checkAlias",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "cle",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$EnrolementInfo"
                }
              }
            },
            "description": "Clé, nom du propriétaire et pays. Catégorie et photo lorsqu’elles sont disponibles dans cette voie."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Alias inconnu."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Vérifier un alias pour l’enrôlement Business",
        "tags": [
          "Business · Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/comptes": {
      "get": {
        "description": "Cet endpoint permet à l’application business-api de consulter auprès du CBS la liste des comptes du client Business identifié. Il fournit les informations nécessaires à la présentation de ses comptes dans le canal Business.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après identification du client dans business-api, avant le choix d’un compte pour une consultation ou une opération.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- numero : numéro du compte.\n- type : type de compte obtenu par la matrice CBS→PI du participant.\n- dateOuverture : date d’ouverture disponible auprès du CBS.\n- statut : compte ouvert, bloqué ou clôturé lorsque le CBS fournit cet état.\n- meta.total : nombre de comptes retournés.\n\n### Conditions et effets\n\nclientId désigne le client dans le CBS. Les données non fournies par l’adaptateur peuvent être absentes ; une correspondance de type manquante provoque un refus de disponibilité plutôt qu’un type inventé.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **503** : CBS indisponible ou type CBS sans correspondance configurée.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "listComptes",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant CBS du client Business, fourni par la liaison interne après les contrôles du client en amont.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteListeResponse"
                }
              }
            },
            "description": "numero : numéro du compte. type : type de compte obtenu par la matrice CBS→PI du participant. dateOuverture : date d’ouverture disponible auprès du CBS. statut : compte ouvert, bloqué ou clôturé lorsque le CBS fournit cet état. meta.total : nombre de comptes retournés."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "503": {
            "description": "CBS indisponible ou type CBS sans correspondance configurée."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les comptes d’un client Business",
        "tags": [
          "Business · Comptes"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/comptes/transactions": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les transferts dont les comptes payeur et payé sont rattachés au même participant.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour l’historique des mouvements intra-comptes, avec les filtres transmis par le canal Business.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Transactions : référence, montant, motif et comptes des deux parties.\n- Statut restitué au format Business et dates disponibles.\n- Nombre total de résultats dans les métadonnées.\n\n### Conditions et effets\n\nLa route filtre le participant et les comptes lorsque leurs filtres sont donnés. Elle ne reçoit pas une identité de client final ; le périmètre autorisé doit être déterminé en amont.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "listTransactions",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence métier exacte du transfert.",
            "in": "query",
            "name": "txId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Statut Business à filtrer.",
            "in": "query",
            "name": "statut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Compte débiteur à filtrer.",
            "in": "query",
            "name": "payeurNumero",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Compte crédité à filtrer.",
            "in": "query",
            "name": "payeNumero",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille de page demandée, bornée entre 1 et 100. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Identifiant du client fourni par business-api pour le périmètre de cette route interne ; ce paramètre n’est pas une preuve d’authentification.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionListResponse"
                }
              }
            },
            "description": "Transactions : référence, montant, motif et comptes des deux parties. Statut restitué au format Business et dates disponibles. Nombre total de résultats dans les métadonnées."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les transferts intra-participant exposés à Business",
        "tags": [
          "Business · Transactions"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de demander un transfert intra-participant entre les comptes désignés. Le cœur vérifie les comptes auprès du CBS et soumet le transfert à sa saga.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une instruction intra-comptes déjà autorisée et confirmée dans le canal Business.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ntxId, montant, payeurNumero et payeNumero désignent l’ordre intra-comptes ; motif porte le libellé disponible.\n\n### Données retournées\n\n- Référence txId, montant, motif et comptes concernés.\n- Statut INITIE à la création, avec les dates disponibles.\n\n### Conditions et effets\n\nL’autorisation client est contrôlée en amont. Les types CBS doivent avoir une correspondance PI ; la création INITIE ne constitue pas la preuve de comptabilisation achevée.\n\n### Erreurs et reprise\n\ntxId est la référence métier et la clé d’idempotence transmise au cœur. Conserver cette référence et le même contenu, puis consulter l’opération après un timeout.\n\n- **404** : Compte débiteur ou créditeur introuvable.\n\n- **409** : Référence déjà employée de manière incompatible.\n\n- **422** : Règle de transfert refusée.\n\n- **503** : CBS indisponible ou type sans correspondance.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "createTransaction",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant du client fourni par business-api pour le périmètre de cette route interne ; ce paramètre n’est pas une preuve d’authentification.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionRequest"
              }
            }
          },
          "description": "txId, montant, payeurNumero et payeNumero désignent l’ordre intra-comptes ; motif porte le libellé disponible.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteTransactionResponse"
                }
              }
            },
            "description": "Référence txId, montant, motif et comptes concernés. Statut INITIE à la création, avec les dates disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Compte débiteur ou créditeur introuvable."
          },
          "409": {
            "description": "Référence déjà employée de manière incompatible."
          },
          "422": {
            "description": "Règle de transfert refusée."
          },
          "503": {
            "description": "CBS indisponible ou type sans correspondance."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un transfert entre deux comptes du participant",
        "tags": [
          "Business · Transactions"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/comptes/{numero}": {
      "get": {
        "description": "Cet endpoint permet à business-api d’interroger le solde et l’état d’un compte auprès du CBS, puis de présenter ses attributs disponibles au client.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après sélection d’un compte autorisé par le canal Business pour afficher son détail.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Numéro, solde et devise du compte lorsque disponibles.\n- Type de compte résolu et date d’ouverture.\n- État ouvert, bloqué ou clôturé.\n\n### Conditions et effets\n\nLa route interne prend le numéro de compte. L’habilitation du client Business à ce compte doit être établie en amont ; le paramètre de chemin n’est pas une preuve de propriété.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Compte introuvable.\n\n- **503** : CBS indisponible ou type sans correspondance.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "getCompte",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Numéro de compte CBS à consulter, déjà autorisé pour le client par business-api.",
            "in": "path",
            "name": "numero",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant du client fourni par business-api pour le périmètre de cette route interne ; ce paramètre n’est pas une preuve d’authentification.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessComptesResource$CompteDetailResponse"
                }
              }
            },
            "description": "Numéro, solde et devise du compte lorsque disponibles. Type de compte résolu et date d’ouverture. État ouvert, bloqué ou clôturé."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Compte introuvable."
          },
          "503": {
            "description": "CBS indisponible ou type sans correspondance."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le solde et l’état d’un compte Business",
        "tags": [
          "Business · Comptes"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/comptes/{numero}/alias": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les alias actifs de la copie locale pour un compte donné.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour présenter les adresses de paiement déjà connues du canal pour le compte autorisé.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Clé, type, compte et dates connues de chaque alias.\n- Métadonnées de la liste retournée.\n\n### Conditions et effets\n\nPI-RAC ne fournit pas ici une liste distante par compte. Les alias créés en dehors de cette plateforme peuvent manquer ; une liste vide reste une réponse 200.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "listAliases",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Numéro de compte concerné dans le périmètre autorisé.",
            "in": "path",
            "name": "numero",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasList"
                }
              }
            },
            "description": "Clé, type, compte et dates connues de chaque alias. Métadonnées de la liste retournée."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les alias actifs connus pour un compte Business",
        "tags": [
          "Business · Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de demander la création d’une adresse de paiement SHID pour un compte autorisé. Le cœur prépare les données du titulaire à partir du CBS et de la matrice du participant.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le client souhaite une nouvelle adresse de paiement pour le compte choisi.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ntype doit être SHID ; numero désigne le compte pour lequel l’adresse est créée.\n\n### Données retournées\n\n- Clé, type SHID et compte de l’alias créé.\n- Dates de création et de modification disponibles dans la réponse PI-RAC.\n\n### Conditions et effets\n\nCette voie prend uniquement type=SHID. Le compte, le titulaire et la correspondance CBS→PI doivent être disponibles. L’habilitation du client au compte est vérifiée en amont.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **400** : Type non pris en charge ou compte inconnu.\n\n- **422** : Type CBS sans correspondance pour la création.\n\n- **503** : CBS indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "createAlias",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Numéro de compte concerné dans le périmètre autorisé.",
            "in": "path",
            "name": "numero",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "type": "SHID"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasCreationRequest"
              }
            }
          },
          "description": "type doit être SHID ; numero désigne le compte pour lequel l’adresse est créée.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessAliasResource$AliasInfo"
                }
              }
            },
            "description": "Clé, type SHID et compte de l’alias créé. Dates de création et de modification disponibles dans la réponse PI-RAC."
          },
          "400": {
            "description": "Type non pris en charge ou compte inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Type CBS sans correspondance pour la création."
          },
          "503": {
            "description": "CBS indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer un alias SHID pour un compte Business",
        "tags": [
          "Business · Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/comptes/{numero}/alias/{cle}": {
      "delete": {
        "description": "Cet endpoint permet à business-api de demander la suppression de la clé d’alias désignée pour le parcours du compte sélectionné.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après confirmation de la suppression par le client et contrôle du compte et de l’alias autorisés dans le canal.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- 204 : demande exécutée sans corps de réponse.\n\n### Conditions et effets\n\nLa méthode interne supprime par clé d’alias ; la présence de numero dans l’URL ne constitue pas à elle seule un contrôle de propriété client.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Alias inconnu du répertoire.\n\n- **503** : Répertoire indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "deleteAlias",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Numéro de compte concerné dans le périmètre autorisé.",
            "in": "path",
            "name": "numero",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé exacte de l’alias concerné.",
            "in": "path",
            "name": "cle",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "204 : demande exécutée sans corps de réponse."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Alias inconnu du répertoire."
          },
          "503": {
            "description": "Répertoire indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Supprimer un alias depuis le canal Business",
        "tags": [
          "Business · Alias"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les initiations et demandes de paiement du client Business identifié, avec les filtres de son parcours.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour l’historique du client, une recherche de référence ou le suivi des demandes préparées et envoyées.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- data : références, parties, montant, état, conditions et dates disponibles.\n- meta : total, taille, page et liens de pagination disponibles.\n\n### Conditions et effets\n\nLa requête est limitée à clientId dans le participant. Les filtres et la sélection de champs ne créent pas de droit sur les demandes d’un autre client.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_4",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire des demandes.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Filtres de la consultation Business ; les clés sont interprétées par le service de requête, notamment la pagination, les critères de recherche et champs.",
            "in": "query",
            "name": "filters",
            "required": true,
            "schema": {
              "additionalProperties": {
                "type": "string"
              },
              "type": "object"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
                }
              }
            },
            "description": "data : références, parties, montant, état, conditions et dates disponibles. meta : total, taille, page et liens de pagination disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les demandes Business émises par un client",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de préparer la demande du client payé après validation de son corps et du compte qui lui appartient dans le CBS.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après identification du client Business et sélection d’un compte autorisé, pour une émission immédiate ou avec confirmation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\nLe corps interne contient request, cbsCustomerId et accounts. request porte les données contractuelles de la demande Business.\n\n### Données retournées\n\n- Référence txId, alias des parties, montant et catégorie.\n- Confirmation attendue, état et motif de rejet métier disponible.\n- Dates et références de la demande disponibles.\n\n### Conditions et effets\n\nclientId est l’identifiant Business du suivi. cbsCustomerId et accounts proviennent du contexte autorisé établi par business-api ; ils ne doivent pas être inventés par un appelant final.\n\n### Erreurs et reprise\n\nConsulter la demande par clientId et txId après une réponse perdue. Examiner le statut métier même en HTTP 200 : il peut porter un refus de création.\n\n- **400** : Enveloppe ou demande invalide.\n\n- **503** : CBS ou dépendance indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "creer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant du client Business propriétaire du suivi de demande.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$CreationCommand"
              }
            }
          },
          "description": "Le corps interne contient request, cbsCustomerId et accounts. request porte les données contractuelles de la demande Business.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesCreationService$CreationResponse"
                }
              }
            },
            "description": "Référence txId, alias des parties, montant et catégorie. Confirmation attendue, état et motif de rejet métier disponible. Dates et références de la demande disponibles."
          },
          "400": {
            "description": "Enveloppe ou demande invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "503": {
            "description": "CBS ou dépendance indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer ou émettre une demande de paiement Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements-groupes": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les lots de demandes de paiement appartenant au client Business indiqué.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour le suivi des campagnes et ouvrir un lot à partir de sa référence.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- data : référence, état et date de chaque lot.\n- meta : total, taille, page et pages voisines disponibles.\n\n### Conditions et effets\n\nCette pagination Business utilise des numéros à partir de 1, contrairement aux listes techniques du cœur à partir de 0.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "lister",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire des lots.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État Business à filtrer.",
            "in": "query",
            "name": "statut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Numéro de page Business à partir de 1. Valeur par défaut : `1`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": "1",
              "type": "string"
            }
          },
          {
            "description": "Taille de page Business ; 100 par défaut. Valeur par défaut : `100`.",
            "in": "query",
            "name": "pagination.limit",
            "required": false,
            "schema": {
              "default": 100,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Critère de tri accepté par le service de lots.",
            "in": "query",
            "name": "sort_by",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchListResponse"
                }
              }
            },
            "description": "data : référence, état et date de chaque lot. meta : total, taille, page et pages voisines disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les lots de demandes Business d’un client",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de soumettre plusieurs demandes du client payé dans un lot identifié. Le cœur vérifie les données et le compte du payé, puis prépare les recherches et demandes par élément.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une campagne de demandes, puis suivre le lot et appliquer sa confirmation si elle a été demandée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\nEnveloppe interne request, cbsCustomerId et accounts ; request contient instructionId, le payé et les transactions du lot.\n\n### Données retournées\n\n- 202 sans corps : lot accepté pour préparation.\n- Location : chemin de consultation du lot retourné par la voie interne.\n\n### Conditions et effets\n\nLe client, son identifiant CBS et ses comptes autorisés doivent être transmis par business-api. Chaque élément conserve sa référence ; une demande acceptée n’est pas un paiement reçu.\n\n### Erreurs et reprise\n\ninstructionId est unique dans le périmètre du client ; un doublon reçoit 409. Consulter le lot avant de soumettre à nouveau après une réponse perdue.\n\n- **400** : Lot ou enveloppe invalide.\n\n- **409** : instructionId déjà employé.\n\n- **503** : CBS ou dépendance indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create_3",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire du lot.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$CreationCommand"
              }
            }
          },
          "description": "Enveloppe interne request, cbsCustomerId et accounts ; request contient instructionId, le payé et les transactions du lot.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : lot accepté pour préparation. Location : chemin de consultation du lot retourné par la voie interne."
          },
          "400": {
            "description": "Lot ou enveloppe invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "instructionId déjà employé."
          },
          "503": {
            "description": "CBS ou dépendance indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer un lot de demandes de paiement Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements-groupes/{instructionId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de connaître l’état et les compteurs d’un lot de demandes du client Business.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pendant la préparation, avant confirmation et après émission pour suivre les demandes payées ou refusées.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Référence instructionId, état et dates du lot.\n- Nombre total de demandes et compteurs par état.\n- Dates de confirmation, d’expiration ou d’annulation disponibles.\n\n### Conditions et effets\n\nLes compteurs sont calculés à partir des éléments et demandes associés. Une confirmation de lot ne signifie pas que les payeurs ont payé.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot introuvable pour ce client.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "consulter",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire du lot.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence du lot de ce client.",
            "in": "path",
            "name": "instructionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchDetailResponse"
                }
              }
            },
            "description": "Référence instructionId, état et dates du lot. Nombre total de demandes et compteurs par état. Dates de confirmation, d’expiration ou d’annulation disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot introuvable pour ce client."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le suivi d’un lot de demandes Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements-groupes/{instructionId}/confirmations": {
      "put": {
        "description": "Cet endpoint permet à business-api de confirmer l’émission d’un lot préparé ou de l’abandonner selon la décision du client payé.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après consultation du lot et de sa préparation, avec le même contexte client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ndecision indique la confirmation ou l’abandon du lot.\n\n### Données retournées\n\n- Référence instructionId, état et dates du lot.\n- Nombre total de demandes et compteurs par état.\n- Dates de confirmation, d’expiration ou d’annulation disponibles.\n\n### Conditions et effets\n\nLa décision doit être admissible dans l’état courant et avant l’expiration du lot.\n\n### Erreurs et reprise\n\nLa même décision peut être reconnue comme rejouée ; un état incompatible reçoit 403. Relire le lot après une réponse perdue.\n\n- **403** : Décision ou état du lot incompatible.\n\n- **404** : Lot introuvable pour ce client.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "confirmer_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire du lot.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence du lot Business à consulter ou confirmer.",
            "in": "path",
            "name": "instructionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$DecisionRequest"
              }
            }
          },
          "description": "decision indique la confirmation ou l’abandon du lot.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesGroupesResource$BatchDetailResponse"
                }
              }
            },
            "description": "Référence instructionId, état et dates du lot. Nombre total de demandes et compteurs par état. Dates de confirmation, d’expiration ou d’annulation disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Décision ou état du lot incompatible."
          },
          "404": {
            "description": "Lot introuvable pour ce client."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer ou abandonner un lot de demandes Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements/{txId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver une demande émise ou préparée appartenant au client Business et à la référence txId indiqués.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après création, confirmation ou notification pour afficher son état et ses conditions.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références, montant, parties et état de la demande.\n- Conditions, remises, références documentaires et échéances disponibles.\n- Dates de demande, confirmation et informations de motif connues.\n\n### Conditions et effets\n\nLa consultation est propriétaire : clientId fait partie de la recherche en plus du participant et de txId.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Demande introuvable dans ce périmètre client.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_8",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire de la demande.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence de demande utilisée par ce client.",
            "in": "path",
            "name": "txId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.fasterxml.jackson.databind.JsonNode"
                }
              }
            },
            "description": "Références, montant, parties et état de la demande. Conditions, remises, références documentaires et échéances disponibles. Dates de demande, confirmation et informations de motif connues."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande introuvable dans ce périmètre client."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une demande Business émise par référence client",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-paiements/{txId}/confirmations": {
      "put": {
        "description": "Cet endpoint permet à business-api d’appliquer la décision du client sur une demande de paiement émise en deux temps.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après présentation au client des données du payeur et des conditions conservées dans l’initiation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ndecision est l’accord ou l’abandon du client.\n\n### Données retournées\n\n- État ENVOYE ou ANNULE et date de décision.\n- Conditions préparées de la demande et informations du payeur disponibles.\n\n### Conditions et effets\n\nL’initiation doit appartenir à clientId et rester dans un état et un délai autorisant cette décision.\n\n### Erreurs et reprise\n\nLe service distingue décision appliquée et rejouée ; une décision incompatible ou expirée reçoit 403. Relire l’initiation avant une nouvelle tentative.\n\n- **403** : Confirmation expirée ou décision contradictoire.\n\n- **404** : Initiation introuvable pour ce client.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "confirmer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Client Business propriétaire de l’initiation.",
            "in": "query",
            "name": "clientId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence client de la demande préparée.",
            "in": "path",
            "name": "txId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$ConfirmationRequest"
              }
            }
          },
          "description": "decision est l’accord ou l’abandon du client.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesEmisesResource$ConfirmationResponse"
                }
              }
            },
            "description": "État ENVOYE ou ANNULE et date de décision. Conditions préparées de la demande et informations du payeur disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Confirmation expirée ou décision contradictoire."
          },
          "404": {
            "description": "Initiation introuvable pour ce client."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer ou abandonner une demande Business préparée",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-recues": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les demandes de paiement reçues et de les filtrer avant présentation au client payeur.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour le suivi des factures ou demandes adressées au client et sélectionner celle à consulter.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références et état de la demande de paiement.\n- Alias des parties, montant, motif et conditions disponibles.\n- Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLes filtres portent sur les demandes reçues du participant ; la sélection des demandes autorisées au client relève du canal en amont.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "lister_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Statut Business de la demande.",
            "in": "query",
            "name": "statut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Catégorie de la demande.",
            "in": "query",
            "name": "categorie",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Alias du payeur à filtrer.",
            "in": "query",
            "name": "payeurAlias",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Alias du payé à filtrer.",
            "in": "query",
            "name": "payeAlias",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeListResponse"
                }
              }
            },
            "description": "Références et état de la demande de paiement. Alias des parties, montant, motif et conditions disponibles. Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les demandes reçues dans le parcours Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-recues/{e2e}": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver les conditions et l’état d’une demande reçue à partir de sa référence de bout en bout.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher la demande avant la décision du client et reprendre son suivi ensuite.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références et état de la demande de paiement.\n- Alias des parties, montant, motif et conditions disponibles.\n- Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\ne2e désigne l’EndToEndId d’une demande reçue, pas son identifiant interne UUID.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Demande reçue introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "recuperer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact de la demande reçue.",
            "in": "path",
            "name": "e2e",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeResponse"
                }
              }
            },
            "description": "Références et état de la demande de paiement. Alias des parties, montant, motif et conditions disponibles. Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande reçue introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une demande reçue par son EndToEndId",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/demandes-recues/{e2e}/reponses": {
      "put": {
        "description": "Cet endpoint permet à business-api d’appliquer la réponse du client payeur : payer immédiatement par transfert ou rejeter la demande.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après consultation des conditions et recueil de la décision du client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ndecision est obligatoire ; raison fournit le motif lorsque la demande est refusée.\n\n### Données retournées\n\n- Références et état de la demande de paiement.\n- Alias des parties, montant, motif et conditions disponibles.\n- Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\ndecision=true prépare le paiement ; false applique le refus avec sa raison. L’acceptation ne prouve pas encore le résultat financier définitif.\n\n### Erreurs et reprise\n\nUne décision identique répétée restitue l’état connu ; une décision opposée après traitement reçoit 403. Conserver l’EndToEndId et relire la demande.\n\n- **403** : Décision contradictoire avec le traitement déjà enregistré.\n\n- **404** : Demande reçue introuvable.\n\n- **409** : État de demande non éligible.\n\n- **422** : Conditions ou motif métier refusés.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "repondre",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact de la demande reçue, rendu dans end2endId lors de sa consultation ; ne pas utiliser son txId ni son identifiant interne.",
            "in": "path",
            "name": "e2e",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$ReponseRequest"
              }
            }
          },
          "description": "decision est obligatoire ; raison fournit le motif lorsque la demande est refusée.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessDemandesRecuesResource$DemandeResponse"
                }
              }
            },
            "description": "Références et état de la demande de paiement. Alias des parties, montant, motif et conditions disponibles. Dates de demande, de réponse, d’envoi et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Décision contradictoire avec le traitement déjà enregistré."
          },
          "404": {
            "description": "Demande reçue introuvable."
          },
          "409": {
            "description": "État de demande non éligible."
          },
          "422": {
            "description": "Conditions ou motif métier refusés."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Accepter ou refuser une demande reçue depuis Business",
        "tags": [
          "Business · Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-envoyes": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver les initiations et paiements émis dans son parcours, avec leur état traduit au format Business.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour l’historique et pour reprendre le suivi d’un paiement identifié par txId.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- data : paiements avec références, parties, montants et états.\n- meta.total : nombre de paiements correspondants.\n\n### Conditions et effets\n\nLa liste porte sur le participant ; le périmètre du client final est déterminé en amont par l’application Business.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementEnvoyeLister",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille demandée, bornée entre 1 et 100. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementListResponse"
                }
              }
            },
            "description": "data : paiements avec références, parties, montants et états. meta.total : nombre de paiements correspondants."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les paiements émis par le canal Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de préparer un paiement après recherche des alias des parties et vérification du compte débiteur dans le CBS.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour un paiement unitaire autorisé du client : avec confirmation, conserver l’initiation ; sans confirmation, lancer directement le transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ntxId, payeurAlias, payeAlias et montant décrivent le paiement. confirmation choisit le parcours ; motif, références documentaires et programme complètent l’instruction.\n\n### Données retournées\n\n- Référence txId, EndToEndId, parties et montant.\n- Statut Business, raison de rejet disponible et confirmation attendue ou réalisée.\n- Nom et pays du payé, dates et références documentaires disponibles.\n\n### Conditions et effets\n\nconfirmation=true conserve un paiement INITIE ; false peut lancer l’envoi. Un txId déjà utilisé est rendu en HTTP 200 avec REJETE et DU03 ; il faut donc examiner le statut du corps.\n\n### Erreurs et reprise\n\nNe pas interpréter un deuxième POST comme un rejeu transparent : un txId déjà utilisé est refusé dans le résultat métier. Relire le paiement existant après une réponse perdue.\n\n- **400** : Alias ou compte non exploitable, corps invalide.\n\n- **503** : CBS indisponible ou type non résolu par la matrice.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementCreer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementRequest"
              }
            }
          },
          "description": "txId, payeurAlias, payeAlias et montant décrivent le paiement. confirmation choisit le parcours ; motif, références documentaires et programme complètent l’instruction.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementResponse"
                }
              }
            },
            "description": "Référence txId, EndToEndId, parties et montant. Statut Business, raison de rejet disponible et confirmation attendue ou réalisée. Nom et pays du payé, dates et références documentaires disponibles."
          },
          "400": {
            "description": "Alias ou compte non exploitable, corps invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "503": {
            "description": "CBS indisponible ou type non résolu par la matrice."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer ou envoyer un paiement Business par alias",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-envoyes/{txId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver un paiement émis par sa référence client et de connaître l’état de l’initiation ou du transfert associé.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après création, confirmation ou notification pour afficher le résultat au client.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Référence txId, EndToEndId, parties et montant.\n- Statut Business, raison de rejet disponible et confirmation attendue ou réalisée.\n- Nom et pays du payé, dates et références documentaires disponibles.\n\n### Conditions et effets\n\nLe statut INITIE, ENVOYE, IRREVOCABLE ou REJETE est construit à partir du suivi disponible ; ne pas confondre émission et irrévocabilité.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Paiement émis introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementEnvoyeRecuperer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence métier du paiement ou de la demande dans le parcours Business.",
            "in": "path",
            "name": "txId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementResponse"
                }
              }
            },
            "description": "Référence txId, EndToEndId, parties et montant. Statut Business, raison de rejet disponible et confirmation attendue ou réalisée. Nom et pays du payé, dates et références documentaires disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement émis introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter un paiement Business émis",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-envoyes/{txId}/confirmations": {
      "put": {
        "description": "Cet endpoint permet à business-api d’appliquer la décision de confirmation d’un paiement précédemment préparé en deux temps.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après présentation du bénéficiaire et des conditions au client, pour confirmer ou abandonner selon la décision reçue.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ndecision porte l’accord ou le refus du client pour ce paiement préparé.\n\n### Données retournées\n\n- Référence txId, EndToEndId, parties et montant.\n- Statut Business, raison de rejet disponible et confirmation attendue ou réalisée.\n- Nom et pays du payé, dates et références documentaires disponibles.\n\n### Conditions et effets\n\ndecision=false renvoie ANNULE sans envoyer le paiement, mais cet abandon n’est pas conservé comme un état annulé durable : un appel ultérieur avec decision=true peut encore confirmer. Ne pas présenter cette réponse comme une garantie d’annulation définitive. Une confirmation acceptée reste à suivre jusqu’à son issue financière.\n\n### Erreurs et reprise\n\nRelire le paiement si la réponse est perdue ; ne pas soumettre un nouveau paiement avec un autre txId pour la même décision.\n\n- **400** : Alias ou compte débiteur non exploitable.\n\n- **404** : Paiement introuvable.\n\n- **409** : Initiation non éligible à la confirmation.\n\n- **503** : CBS indisponible lors du contrôle.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementConfirmer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence métier du paiement ou de la demande dans le parcours Business.",
            "in": "path",
            "name": "txId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementConfirmationRequest"
              }
            }
          },
          "description": "decision porte l’accord ou le refus du client pour ce paiement préparé.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsEnvoyesResource$PaiementResponse"
                }
              }
            },
            "description": "Référence txId, EndToEndId, parties et montant. Statut Business, raison de rejet disponible et confirmation attendue ou réalisée. Nom et pays du payé, dates et références documentaires disponibles."
          },
          "400": {
            "description": "Alias ou compte débiteur non exploitable."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement introuvable."
          },
          "409": {
            "description": "Initiation non éligible à la confirmation."
          },
          "503": {
            "description": "CBS indisponible lors du contrôle."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Appliquer la confirmation d’un paiement Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-groupes": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver les lots de paiements du participant et leur état courant.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher un historique de lots puis ouvrir le détail et les compteurs de paiement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références instructionId, états et dates des lots.\n- Métadonnées de liste disponibles.\n\n### Conditions et effets\n\nLe périmètre du client final est déterminé en amont ; cette voie reste interne au participant.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementsGroupeLister",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à demander ; la valeur par défaut et le format sont indiqués dans le schéma de cette route. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Nombre de résultats demandé par page, soumis aux bornes du service. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeListResponse"
                }
              }
            },
            "description": "Références instructionId, états et dates des lots. Métadonnées de liste disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les lots de paiements Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à business-api de traiter plusieurs paiements sous une même référence de lot après recherche de l’alias et du compte du payeur.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour un lot autorisé du client : envoi direct ou préparation avec confirmation globale.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ninstructionId identifie le lot ; payeurAlias, transactions et confirmation définissent le parcours de paiement.\n\n### Données retournées\n\n- instructionId, statut initial et nombre total de transactions.\n\n### Conditions et effets\n\nAvec confirmation=true, les recherches des payés sont poursuivies en arrière-plan ; false traite les éléments directement. Les résultats restent individuels et peuvent comporter des refus.\n\n### Erreurs et reprise\n\nConserver instructionId et les txId des éléments. Après une réponse perdue, consulter le lot avant une nouvelle soumission.\n\n- **400** : Alias ou données du payeur non exploitables.\n\n- **409** : Référence de lot en conflit.\n\n- **503** : CBS indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementGroupeCreer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeRequest"
              }
            }
          },
          "description": "instructionId identifie le lot ; payeurAlias, transactions et confirmation définissent le parcours de paiement.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeCreationResponse"
                }
              }
            },
            "description": "instructionId, statut initial et nombre total de transactions."
          },
          "400": {
            "description": "Alias ou données du payeur non exploitables."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Référence de lot en conflit."
          },
          "503": {
            "description": "CBS indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer ou envoyer un lot de paiements Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-groupes/{instructionId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de relire un lot de paiements par sa référence et d’en calculer le suivi à partir des éléments.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pendant la recherche des payés et après confirmation pour distinguer les éléments prêts, envoyés, irrévocables ou refusés.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Référence, état, dates et compteurs du lot.\n- Informations de préparation et d’issue disponibles selon le schéma.\n\n### Conditions et effets\n\nUn succès partiel doit être présenté comme tel ; l’état du lot ne remplace pas le suivi d’un paiement individuel.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Lot de paiements introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementGroupeConsulter",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence du lot Business à consulter ou confirmer.",
            "in": "path",
            "name": "instructionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeResponse"
                }
              }
            },
            "description": "Référence, état, dates et compteurs du lot. Informations de préparation et d’issue disponibles selon le schéma."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Lot de paiements introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter les compteurs d’un lot de paiements Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-groupes/{instructionId}/confirmations": {
      "put": {
        "description": "Cet endpoint permet à business-api de transmettre la décision du client payeur pour un lot en deux temps. Une décision positive crée les virements des éléments éligibles ; une décision négative abandonne le lot avant envoi.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour confirmer un lot prêt après présentation des bénéficiaires au client payeur, ou pour abandonner un lot non confirmé.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\nLe corps JSON contient obligatoirement decision : true pour confirmer, false pour abandonner. Une décision absente ou nulle est refusée ; elle ne devient pas implicitement un abandon.\n\n### Données retournées\n\n- État et compteurs du lot après confirmation.\n- Informations de suivi des paiements disponibles dans la réponse.\n\n### Conditions et effets\n\nPour confirmer, le lot doit être READY ; sinon l'opération reçoit 403. Les éléments dont le payé n’est pas résolu restent des refus. L'abandon est possible avant confirmation, y compris pendant les recherches, et ne crée aucun virement. Un lot confirmé ne peut plus être abandonné ; un lot abandonné ne peut plus être confirmé. Chaque élément confirmé garde sa transaction indépendante : le refus de l'un ne fait pas annuler tous les autres.\n\n### Erreurs et reprise\n\nRelire le même instructionId après une réponse perdue ; ne pas recréer le lot pour forcer un nouvel envoi.\n\n- **400** : Décision obligatoire absente, nulle ou corps invalide.\n\n- **403** : Lot non prêt, déjà confirmé pour un abandon ou déjà abandonné pour une confirmation.\n\n- **404** : Lot introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementGroupeConfirmer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence du lot Business à consulter ou confirmer.",
            "in": "path",
            "name": "instructionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "decision": true
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeDecisionRequest"
              }
            }
          },
          "description": "Le corps JSON contient obligatoirement decision : true pour confirmer, false pour abandonner. Une décision absente ou nulle est refusée ; elle ne devient pas implicitement un abandon.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsGroupesResource$PaiementGroupeResponse"
                }
              }
            },
            "description": "État et compteurs du lot après confirmation. Informations de suivi des paiements disponibles dans la réponse."
          },
          "400": {
            "description": "Décision obligatoire absente, nulle ou corps invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "Lot non prêt, déjà confirmé pour un abandon ou déjà abandonné pour une confirmation."
          },
          "404": {
            "description": "Lot introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer ou abandonner un lot de paiements Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-recus": {
      "get": {
        "description": "Cet endpoint permet à business-api de consulter les transferts reçus du participant et de les présenter dans le format de suivi Business.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour l’historique des encaissements et le suivi des retours ou demandes d’annulation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLes filtres métier sont appliqués aux lignes de la page lue. meta.total peut donc différer du nombre de lignes après ces filtres ; vérifier les métadonnées de pagination.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementRecuLister",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Canal ou catégorie Business à filtrer.",
            "in": "query",
            "name": "categorie",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Statut de paiement Business.",
            "in": "query",
            "name": "statut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Statut du retour associé.",
            "in": "query",
            "name": "retourStatut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Statut de l’annulation associée.",
            "in": "query",
            "name": "annulationStatut",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Taille demandée, bornée entre 1 et 100. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementListResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les paiements reçus pour le canal Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements-recus/{txId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver un paiement reçu à partir de sa référence métier txId.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher le détail d’un encaissement et les opérations de retour ou d’annulation qui lui sont liées.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLa route exige un transfert reçu ; une référence de transfert émis n’est pas un paiement reçu.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Paiement reçu introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementRecuRecuperer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence métier du paiement ou de la demande dans le parcours Business.",
            "in": "path",
            "name": "txId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement reçu introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter un paiement reçu par sa référence Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements/{end2endId}": {
      "get": {
        "description": "Cet endpoint permet à business-api de retrouver un paiement de son participant à partir de sa référence de bout en bout PI, quel que soit son sens.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque la référence disponible est l’EndToEndId et non le txId Business.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLe périmètre est celui du participant authentifié ; l’autorisation du client à consulter le paiement reste à établir par le canal.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Paiement introuvable par cet EndToEndId.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "paiementVerifier",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact du paiement à retrouver.",
            "in": "path",
            "name": "end2endId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement introuvable par cet EndToEndId."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Vérifier un paiement par son EndToEndId",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements/{end2endId}/annulations": {
      "post": {
        "description": "Cet endpoint permet à business-api de demander l’annulation d’un paiement émis et irrévocable.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après le contrôle du paiement concerné et de la décision du client, puis suivre le paiement et son opération associée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\nraison contient le motif de la demande d’annulation.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLa demande dépend de la décision du payé ; elle ne garantit pas le remboursement. Une réponse HTTP 200 n’atteste pas l’achèvement de l’opération financière asynchrone.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Paiement introuvable.\n\n- **409** : État ou scénario incompatible.\n\n- **503** : Participant indisponible pour cette opération.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "demandeAnnulationEnvoyer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact du paiement à retrouver.",
            "in": "path",
            "name": "end2endId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessRetoursFondsResource$AnnulationRequest"
              }
            }
          },
          "description": "raison contient le motif de la demande d’annulation.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement introuvable."
          },
          "409": {
            "description": "État ou scénario incompatible."
          },
          "503": {
            "description": "Participant indisponible pour cette opération."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander l’annulation d’un paiement émis depuis Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements/{end2endId}/annulations/reponses": {
      "put": {
        "description": "Cet endpoint permet à business-api de appliquer la décision du client payé sur une demande d’annulation reçue.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après le contrôle du paiement concerné et de la décision du client, puis suivre le paiement et son opération associée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données à fournir\n\ndecision indique l’accord ou le refus du client payé.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nL’accord initie un retour ; le refus prépare la réponse d’annulation. La décision doit être compatible avec l’état du paiement. Une réponse HTTP 200 n’atteste pas l’achèvement de l’opération financière asynchrone.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Paiement introuvable.\n\n- **409** : État ou scénario incompatible.\n\n- **503** : Participant indisponible pour cette opération.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "demandeAnnulationRepondre",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact du paiement à retrouver.",
            "in": "path",
            "name": "end2endId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessRetoursFondsResource$AnnulationReponseRequest"
              }
            }
          },
          "description": "decision indique l’accord ou le refus du client payé.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement introuvable."
          },
          "409": {
            "description": "État ou scénario incompatible."
          },
          "503": {
            "description": "Participant indisponible pour cette opération."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Répondre à une demande d’annulation depuis Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/business/paiements/{end2endId}/retours": {
      "put": {
        "description": "Cet endpoint permet à business-api de initier le retour des fonds d’un paiement reçu à la demande du client payé.\n\n### Qui appelle cette opération ?\n\nApplication business-api en liaison serveur à serveur avec le cœur.\n\n### Quand l’utiliser ?\n\nL’utiliser après le contrôle du paiement concerné et de la décision du client, puis suivre le paiement et son opération associée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nCette route interne ne porte pas les scopes OAuth2 du contrat public /piz/v1. business-api établit l’identité du client et son périmètre autorisé en amont ; un clientId, un compte ou un alias fourni en paramètre n’est pas une preuve d’autorisation.\n\n### Données retournées\n\n- Références txId et EndToEndId, parties et montant.\n- Statuts du paiement, du retour et de l’annulation, avec motifs connus.\n- Dates de demande, de réponse et d’irrévocabilité disponibles.\n\n### Conditions et effets\n\nLe cœur applique le scénario client et son motif de retour. Le paiement doit permettre ce retour. Une réponse HTTP 200 n’atteste pas l’achèvement de l’opération financière asynchrone.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Paiement introuvable.\n\n- **409** : État ou scénario incompatible.\n\n- **503** : Participant indisponible pour cette opération.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "retourFondsEnvoyer",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "EndToEndId exact du paiement à retrouver.",
            "in": "path",
            "name": "end2endId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.business.BusinessPaiementsRecusResource$PaiementResponse"
                }
              }
            },
            "description": "Références txId et EndToEndId, parties et montant. Statuts du paiement, du retour et de l’annulation, avec motifs connus. Dates de demande, de réponse et d’irrévocabilité disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Paiement introuvable."
          },
          "409": {
            "description": "État ou scénario incompatible."
          },
          "503": {
            "description": "Participant indisponible pour cette opération."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Retourner les fonds d’un paiement reçu depuis Business",
        "tags": [
          "Business · Paiements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/identity-verifications": {
      "post": {
        "description": "Cet endpoint permet au canal payeur de demander la vérification d’un compte auprès de son participant. La réponse d’identité sera utilisée pour présenter le payé au client et préparer un transfert par numéro de compte.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant le transfert lorsque le bénéficiaire n’est pas désigné par un alias. Conserver verificationId et réutiliser l’EndToEndId de la recherche.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\naccountId est le compte à vérifier ; payeeAgent est son participant. endToEndId peut porter l’identifiant du futur transfert ; sinon le cœur le génère. iban est facultatif.\n\n### Données retournées\n\n- Référence de vérification et données du compte demandé.\n- État de la vérification et horodatage de demande.\n- Location vers la consultation ; Idempotent-Replayed indique une demande déjà existante.\n\n### Conditions et effets\n\naccountId et payeeAgent sont requis. Un iban explicite doit être cohérent avec le compte et le type de participant payé. L’identité n’est pas encore confirmée au seul HTTP 202.\n\n### Erreurs et reprise\n\nRéutiliser l’EndToEndId pour la même recherche et consulter son résultat ; ne pas créer un transfert avant une vérification positive.\n\n- **400** : Compte, participant payé, drapeau IBAN ou EndToEndId invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "request",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IdentityVerificationResource$VerificationRequest"
              }
            }
          },
          "description": "accountId est le compte à vérifier ; payeeAgent est son participant. endToEndId peut porter l’identifiant du futur transfert ; sinon le cœur le génère. iban est facultatif.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IdentityVerificationResource$VerificationResponse"
                }
              }
            },
            "description": "Référence de vérification et données du compte demandé. État de la vérification et horodatage de demande. Location vers la consultation ; Idempotent-Replayed indique une demande déjà existante."
          },
          "400": {
            "description": "Compte, participant payé, drapeau IBAN ou EndToEndId invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Vérifier le titulaire d’un compte bénéficiaire",
        "tags": [
          "Vérification d'identité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/identity-verifications/{verificationId}": {
      "get": {
        "description": "Cet endpoint permet au canal de connaître la réponse à une vérification de compte. Il fournit les informations du titulaire uniquement lorsque la vérification est positive.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour attendre la réponse, afficher le payé au client et identifier un refus ou une expiration.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Compte, participant payé, indicateur IBAN et état.\n- Motif de refus éventuel et données d’identité positives disponibles.\n- Dates de demande et de réponse.\n\n### Conditions et effets\n\nUne réponse en attente ou négative ne doit pas être présentée comme une identité vérifiée.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Vérification introuvable pour ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_7",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la vérification, correspondant à l’EndToEndId de la recherche.",
            "in": "path",
            "name": "verificationId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IdentityVerificationResource$VerificationResponse"
                }
              }
            },
            "description": "Compte, participant payé, indicateur IBAN et état. Motif de refus éventuel et données d’identité positives disponibles. Dates de demande et de réponse."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Vérification introuvable pour ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le résultat d’une vérification d’identité",
        "tags": [
          "Vérification d'identité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/issued-payment-requests": {
      "get": {
        "description": "Cet endpoint permet au canal du payé de retrouver les demandes émises par son participant et leur progression vers le paiement ou le refus.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour le suivi des demandes et pour sélectionner celle à consulter.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Demandes les plus récentes, avec leurs références, parties, montants et états.\n\n### Conditions et effets\n\nLe filtre status porte sur l’état des demandes sortantes. La liste est bornée aux demandes récentes et n’est pas un export comptable exhaustif.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_3",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État de demande sortante recherché, selon le schéma.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Demandes les plus récentes, avec leurs références, parties, montants et états."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les demandes de paiement émises",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet au canal du client payé de demander un paiement à un payeur identifié. Le cœur prépare une demande de paiement et assure son envoi asynchrone vers PI.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour présenter au payeur une facture ou un autre motif de paiement, puis suivre la demande émise.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\npayee identifie le client payé. Fournir payerAlias ou payer complet et endToEndId, ainsi que channel et amount ; les dates, remises, lignes et références dépendent du parcours.\n\n### Données retournées\n\n- Identifiant de demande, EndToEndId, parties et montant.\n- État et dates disponibles de la demande.\n- Location vers sa consultation.\n\n### Conditions et effets\n\npayerAlias déclenche la recherche du payeur ; sans lui, payer et l’EndToEndId de sa recherche doivent être fournis. Les données du payé, le canal et les options doivent satisfaire le profil du parcours. La demande n’est pas un débit.\n\n### Erreurs et reprise\n\nConserver les références de la demande et consulter son état après un timeout. Ne pas recréer une demande pour résoudre l’incertitude de la précédente.\n\n- **400** : Corps ou identifiants invalides.\n\n- **422** : Profil de demande, payeur ou règle métier refusé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.IssuedPaymentRequestResource$CreateRequest"
              }
            }
          },
          "description": "payee identifie le client payé. Fournir payerAlias ou payer complet et endToEndId, ainsi que channel et amount ; les dates, remises, lignes et références dépendent du parcours.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                }
              }
            },
            "description": "Identifiant de demande, EndToEndId, parties et montant. État et dates disponibles de la demande. Location vers sa consultation."
          },
          "400": {
            "description": "Corps ou identifiants invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Profil de demande, payeur ou règle métier refusé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Émettre une demande de paiement comme payé",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/issued-payment-requests/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal du payé de connaître les informations et l’état d’une demande sortante précise.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après création, réception d’un événement ou incident réseau pour savoir si la demande est encore en attente, payée ou refusée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Parties, références, montant et conditions de la demande.\n- État, motif de refus disponible et dates.\n- Référence du transfert associé lorsqu’il existe.\n\n### Conditions et effets\n\nid est l’identifiant interne de la demande émise, pas celui d’une demande reçue.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Demande sortante introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_6",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                }
              }
            },
            "description": "Parties, références, montant et conditions de la demande. État, motif de refus disponible et dates. Référence du transfert associé lorsqu’il existe."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande sortante introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une demande de paiement émise",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/availability/reports/{month}": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les incidents et périodes de disponibilité du participant. Il renvoie le rapport figé lorsqu’il existe ou un calcul provisoire selon la période.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler la période et préparer le rapprochement ou l’envoi du rapport après examen de ses limites.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Rapport du mois : état provisoire ou figé et périodes calculées.\n- Indicateurs et incidents disponibles dans le schéma de rapport.\n\n### Conditions et effets\n\nmonth est au format yyyy-MM. Le même rapport peut être demandé en JSON ou avec Accept: text/csv ; un mois futur est refusé. Un rapport interne ne constitue pas à lui seul une homologation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Format de mois invalide ou période future.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "csv_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Mois du rapport au format yyyy-MM.",
            "in": "path",
            "name": "month",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.AvailabilityReport"
                }
              },
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Rapport du mois : état provisoire ou figé et périodes calculées. Indicateurs et incidents disponibles dans le schéma de rapport."
          },
          "400": {
            "description": "Format de mois invalide ou période future."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le rapport mensuel de disponibilité",
        "tags": [
          "Rapports SLA et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/availability/reports/{month}/regeneration": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de recalculer et figer le rapport de disponibilité d’un mois terminé, en remplaçant le rapport existant lorsque cette action est explicitement confirmée.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser dans une procédure de correction justifiée après vérification du mois et de la pièce qui sera remplacée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Rapport du mois : état provisoire ou figé et périodes calculées.\n- Indicateurs et incidents disponibles dans le schéma de rapport.\n\n### Conditions et effets\n\nLe mois doit être terminé. Remplacer un rapport figé exige confirm=true. Le remplacement est tracé par le service.\n\n### Erreurs et reprise\n\nRelire le rapport après un timeout avant de demander une nouvelle régénération. Cette action remplace une pièce de suivi, elle n’est pas une simple consultation.\n\n- **400** : Mois, motif ou identité d’opérateur manquant ou invalide.\n\n- **409** : Mois non terminé ou rapport figé sans confirmation.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "regenerate_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Mois terminé au format yyyy-MM.",
            "in": "path",
            "name": "month",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Doit être vrai pour remplacer un rapport déjà figé. Valeur par défaut : `false`.",
            "in": "query",
            "name": "confirm",
            "required": false,
            "schema": {
              "default": false,
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.AvailabilityReport"
                }
              }
            },
            "description": "Rapport du mois : état provisoire ou figé et périodes calculées. Indicateurs et incidents disponibles dans le schéma de rapport."
          },
          "400": {
            "description": "Mois, motif ou identité d’opérateur manquant ou invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Mois non terminé ou rapport figé sans confirmation."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Régénérer le rapport mensuel de disponibilité",
        "tags": [
          "Rapports SLA et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/maintenance": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur d’annoncer une maintenance à PI ou d’en demander la fin. Le cœur prépare le message opérationnel correspondant et restitue son état local.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser dans une procédure de maintenance coordonnée, en vérifiant ensuite le statut du participant.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nactive est obligatoire. startsAt et description précisent la maintenance lorsqu’elle est annoncée.\n\n### Données retournées\n\n- 202 : demande prise en charge avec la vue opérationnelle courante.\n- Idempotent-Replayed lorsque l’action a déjà été prise en compte.\n\n### Conditions et effets\n\nactive choisit l’entrée ou la sortie de maintenance ; startsAt et description précisent l’annonce. Les nouveaux transferts peuvent être bloqués pendant la maintenance selon la configuration.\n\n### Erreurs et reprise\n\nIdempotency-Key est facultatif ; avec une clé, conserver le même corps pour la même annonce. Le statut courant doit être consulté après une réponse perdue.\n\n- **400** : Participant, corps ou clé invalide.\n\n- **422** : Clé réutilisée avec d’autres données.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "maintenance",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "active": false
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantOperationsResource$MaintenanceRequest"
              }
            }
          },
          "description": "active est obligatoire. startsAt et description précisent la maintenance lorsqu’elle est annoncée.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.ParticipantOperationsService$StatusView"
                }
              }
            },
            "description": "202 : demande prise en charge avec la vue opérationnelle courante. Idempotent-Replayed lorsque l’action a déjà été prise en compte."
          },
          "400": {
            "description": "Participant, corps ou clé invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Clé réutilisée avec d’autres données."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Annoncer ou terminer une maintenance du participant",
        "tags": [
          "Supervision et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/notifications": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les événements de connectivité et les notifications PI enregistrés par le cœur, les plus récents en premier.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour diagnostiquer un avertissement, un échange de connectivité ou une information reçue de PI.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Notifications enregistrées : type d’événement et informations de suivi disponibles.\n\n### Conditions et effets\n\nLe filtre type est un code d’événement, pas un texte de recherche libre. Cette route ne renvoie pas les notifications client par courrier électronique.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant, type ou limite invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "notifications",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Code d’événement facultatif ; lettres et soulignés, 40 caractères au plus.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nombre de notifications : 50 par défaut, de 1 à 200. Valeur par défaut : `50`.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.ParticipantOperationsService$NotificationView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Notifications enregistrées : type d’événement et informations de suivi disponibles."
          },
          "400": {
            "description": "Participant, type ou limite invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les notifications opérationnelles reçues de PI",
        "tags": [
          "Notifications et reprises"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/participants": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de lire la liste des participants PI telle que le cœur l’a enregistrée à partir des messages de liste reçus.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier le statut connu d’une contrepartie sans envoyer une nouvelle demande de liste à PI.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Participants connus et leurs informations de la vue de liste.\n- État normalisé et code de statut PI brut ; name porte le dernier nom non vide reçu dans camt.014, ou null si aucun nom n’a été reçu.\n\n### Conditions et effets\n\nAucun rafraîchissement distant n’est déclenché. Un participant absent est inconnu et ne doit pas être considéré comme actif.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant local ou filtre d’état invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "peers",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État normalisé facultatif : ACTIVE, INACTIVE, JOINING ou UNKNOWN.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.ParticipantOperationsService$PeerView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Participants connus et leurs informations de la vue de liste. État normalisé et code de statut PI brut ; name porte le dernier nom non vide reçu dans camt.014, ou null si aucun nom n’a été reçu."
          },
          "400": {
            "description": "Participant local ou filtre d’état invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les participants et leur statut connu",
        "tags": [
          "Participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/participants/refresh": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de demander au cœur l’envoi d’une requête de liste à PI. La réponse de PI est reçue ensuite par le callback dédié.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque la liste locale doit être actualisée, puis relire la liste des participants.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- requested : indique si une nouvelle demande a été lancée.\n- Date de dernière demande et date connue de mise à jour de la liste.\n\n### Conditions et effets\n\nUn HTTP 202 ne signifie pas que la liste a déjà été reçue. Une demande trop rapprochée peut rendre requested=false.\n\n### Erreurs et reprise\n\nConsulter les dates et la liste avant de solliciter un autre rafraîchissement ; le service limite les demandes rapprochées.\n\n- **400** : Participant local inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "refreshPeers",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.ParticipantOperationsService$RefreshView"
                }
              }
            },
            "description": "requested : indique si une nouvelle demande a été lancée. Date de dernière demande et date connue de mise à jour de la liste."
          },
          "400": {
            "description": "Participant local inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander le rafraîchissement de la liste des participants",
        "tags": [
          "Participants"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/reglements/garanties": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les derniers événements de garantie enregistrés à la réception des messages de PI.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour examiner une augmentation, diminution ou notification de solde après règlement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Historique récent des événements de garantie, du plus récent au plus ancien.\n- Types et montants disponibles tels qu’enregistrés dans la vue de garantie.\n\n### Conditions et effets\n\nL’historique est borné aux derniers événements. La lecture ne modifie aucune garantie dans STAR ou SAGETIL.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "guaranteeEvents",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.reconciliation.GuaranteeEvent"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Historique récent des événements de garantie, du plus récent au plus ancien. Types et montants disponibles tels qu’enregistrés dans la vue de garantie."
          },
          "400": {
            "description": "Participant inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter les événements de garantie reçus de PI",
        "tags": [
          "Règlements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/reglements/solde-garantie": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter le solde de garantie enregistré pour les participants concernés par ses messages de règlement.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour rapprocher les montants suivis par le cœur avec les notifications reçues de PI.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Solde courant connu pour le participant et les participants concernés, notamment les indirects sponsorisés lorsque présents.\n\n### Conditions et effets\n\nLes valeurs proviennent des mises à jour reçues ; cette route ne demande pas un nouveau solde à PI et ne constitue pas une écriture de garantie.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "guaranteeBalances",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.reconciliation.GuaranteeBalance"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Solde courant connu pour le participant et les participants concernés, notamment les indirects sponsorisés lorsque présents."
          },
          "400": {
            "description": "Participant inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter les soldes de garantie connus du cœur",
        "tags": [
          "Règlements"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/relations": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les relations de sponsorisation actives et passées enregistrées pour son participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour connaître le sponsor ou les indirects concernés et suivre l’issue d’une création ou d’une rupture.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Relations connues, contreparties et informations de suivi disponibles dans le schéma.\n\n### Conditions et effets\n\nLa route lit les relations enregistrées ; elle ne crée ni ne rompt une relation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "relations",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.RelationshipService$RelationView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Relations connues, contreparties et informations de suivi disponibles dans le schéma."
          },
          "400": {
            "description": "Participant inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les relations de sponsorisation",
        "tags": [
          "Relations"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à l’opérateur d’un participant direct ou indirect de demander une sponsorisation ou de confirmer celle demandée par l’autre partie.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après accord entre les participants ; suivre ensuite les demandes en attente et les relations enregistrées.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nFournir sponsorCode ou indirectCode selon le rôle du participant, et limit selon les conditions de sponsorisation.\n\n### Données retournées\n\n- 202 sans corps : demande prise en charge pour envoi asynchrone.\n- Idempotent-Replayed lors d’une restitution sans nouvelle action.\n\n### Conditions et effets\n\nUn indirect désigne sponsorCode ; un direct désigne indirectCode. Un seul est fourni, selon le rôle configuré. limit porte le plafond applicable en XOF.\n\n### Erreurs et reprise\n\nAvec Idempotency-Key, conserver la même clé et les mêmes données. Un nouvel appel sans cette protection peut mettre à jour la demande pour la même contrepartie.\n\n- **400** : Contrepartie, montant ou clé invalide.\n\n- **422** : Rôle du participant ou demande non autorisé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "requestSponsorship",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantOperationsResource$SponsorshipRequest"
              }
            }
          },
          "description": "Fournir sponsorCode ou indirectCode selon le rôle du participant, et limit selon les conditions de sponsorisation.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : demande prise en charge pour envoi asynchrone. Idempotent-Replayed lors d’une restitution sans nouvelle action."
          },
          "400": {
            "description": "Contrepartie, montant ou clé invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Rôle du participant ou demande non autorisé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander ou confirmer une relation de sponsorisation",
        "tags": [
          "Relations"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/relations/requests": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de retrouver les demandes de relation encore en cours avant leur issue définitive.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour suivre une demande émise ou mise en attente et coordonner la confirmation avec l’autre participant.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Demandes de sponsorisation en état SENT ou QUED et leurs références de suivi.\n\n### Conditions et effets\n\nLes négociations entre participants restent extérieures à cette consultation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "pendingRequests",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.RelationshipService$RequestView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Demandes de sponsorisation en état SENT ou QUED et leurs références de suivi."
          },
          "400": {
            "description": "Participant inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les demandes de sponsorisation en attente",
        "tags": [
          "Relations"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/relations/ruptures": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur d’un participant direct de demander la fin de la relation avec l’indirect désigné.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après validation de la décision de rupture, puis consulter les relations après la réponse asynchrone de PI.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nindirectCode identifie le participant indirect de la relation à rompre.\n\n### Données retournées\n\n- 202 sans corps : demande de rupture prise en charge.\n- Idempotent-Replayed si la même action avait déjà été acceptée.\n\n### Conditions et effets\n\nCette action est réservée au rôle participant direct ; un indirect change de sponsor par une nouvelle demande de relation.\n\n### Erreurs et reprise\n\nIdempotency-Key est facultatif ; conserver la même clé pour le même indirect et relire la relation après une réponse perdue.\n\n- **400** : Participant ou corps invalide.\n\n- **422** : Participant indirect ou rôle non autorisé pour la rupture.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "requestBreak",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ParticipantOperationsResource$BreakRequest"
              }
            }
          },
          "description": "indirectCode identifie le participant indirect de la relation à rompre.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : demande de rupture prise en charge. Idempotent-Replayed si la même action avait déjà été acceptée."
          },
          "400": {
            "description": "Participant ou corps invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Participant indirect ou rôle non autorisé pour la rupture."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander la rupture d’une relation comme participant direct",
        "tags": [
          "Relations"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/sla/reports/{month}": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter les indicateurs mesurés côté participant pour les transferts payeur. Il renvoie le rapport figé lorsqu’il existe ou un calcul provisoire selon la période.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour contrôler la période et préparer le rapprochement ou l’envoi du rapport après examen de ses limites.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Rapport mensuel, indicateurs et distributions de délai disponibles.\n- État de gel et limites des données de mesure.\n\n### Conditions et effets\n\nmonth est au format yyyy-MM. Le même rapport peut être demandé en JSON ou avec Accept: text/csv ; un mois futur est refusé. Un rapport interne ne constitue pas à lui seul une homologation.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Format de mois invalide ou période future.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "csv",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Mois du rapport au format yyyy-MM.",
            "in": "path",
            "name": "month",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport"
                }
              },
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Rapport mensuel, indicateurs et distributions de délai disponibles. État de gel et limites des données de mesure."
          },
          "400": {
            "description": "Format de mois invalide ou période future."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le rapport mensuel de qualité de service",
        "tags": [
          "Rapports SLA et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/sla/reports/{month}/regeneration": {
      "post": {
        "description": "Cet endpoint permet à l’opérateur de recalculer et figer le rapport de qualité de service d’un mois terminé, en remplaçant le rapport existant lorsque cette action est explicitement confirmée.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser dans une procédure de correction justifiée après vérification du mois et de la pièce qui sera remplacée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Rapport mensuel, indicateurs et distributions de délai disponibles.\n- État de gel et limites des données de mesure.\n\n### Conditions et effets\n\nLe mois doit être terminé. Remplacer un rapport figé exige confirm=true. Un opérateur identifié et un motif reason sont également exigés pour remplacer la pièce figée.\n\n### Erreurs et reprise\n\nRelire le rapport après un timeout avant de demander une nouvelle régénération. Cette action remplace une pièce de suivi, elle n’est pas une simple consultation.\n\n- **400** : Mois, motif ou identité d’opérateur manquant ou invalide.\n\n- **409** : Mois non terminé ou rapport figé sans confirmation.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "regenerate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Mois terminé au format yyyy-MM.",
            "in": "path",
            "name": "month",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Doit être vrai pour remplacer un rapport déjà figé. Valeur par défaut : `false`.",
            "in": "query",
            "name": "confirm",
            "required": false,
            "schema": {
              "default": false,
              "type": "boolean"
            }
          },
          {
            "description": "Motif de remplacement d’un rapport figé : de 1 à 500 caractères.",
            "in": "query",
            "name": "reason",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.sla.SlaReport"
                }
              }
            },
            "description": "Rapport mensuel, indicateurs et distributions de délai disponibles. État de gel et limites des données de mesure."
          },
          "400": {
            "description": "Mois, motif ou identité d’opérateur manquant ou invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Mois non terminé ou rapport figé sans confirmation."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Régénérer le rapport mensuel de qualité de service",
        "tags": [
          "Rapports SLA et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/operations/status": {
      "get": {
        "description": "Cet endpoint permet à l’opérateur de consulter le statut PI connu du participant et son état de maintenance.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant une intervention ou pour expliquer le refus de nouvelles opérations lorsque le participant est inactif ou en maintenance.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Statut du participant connu du cœur.\n- Informations de maintenance disponibles dans la vue opérationnelle.\n\n### Conditions et effets\n\nCette lecture ne réactive pas le participant et ne remplace pas les tâches de connectivité.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Participant inconnu.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "status",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.operations.ParticipantOperationsService$StatusView"
                }
              }
            },
            "description": "Statut du participant connu du cœur. Informations de maintenance disponibles dans la vue opérationnelle."
          },
          "400": {
            "description": "Participant inconnu."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’état opérationnel du participant",
        "tags": [
          "Supervision et disponibilité"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/catalog": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de découvrir les critères, opérateurs et actions que le moteur de tarification sait interpréter.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour construire un écran d’édition ou vérifier qu’une définition utilise des éléments supportés.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Types de critères et opérateurs disponibles.\n- Types d’actions et schémas de valeurs associés.\n\n### Conditions et effets\n\nLe catalogue décrit les possibilités du moteur ; il ne contient pas la décision de frais d’une transaction.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "catalog",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeCatalogView"
                }
              }
            },
            "description": "Types de critères et opérateurs disponibles. Types d’actions et schémas de valeurs associés."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le catalogue des critères et actions de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/charges": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les prélèvements de frais suivis par le cœur.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour constituer une file d’investigation ou contrôler les dernières opérations de prélèvement.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Référence de transaction, montant et état du prélèvement de frais.\n- Informations de traitement et de reprise CBS disponibles.\n\n### Conditions et effets\n\nSans filtre, les plus récents sont présentés en premier ; avec status, les plus anciens sont présentés en premier pour le traitement de la file.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_8",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État du prélèvement à filtrer selon le schéma.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "PENDING",
                "POSTED",
                "REJECTED",
                "UNCERTAIN",
                "FAILED",
                "TO_RECONCILE"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nombre maximal de prélèvements demandé ; 100 par défaut. Valeur par défaut : `100`.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeChargeView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Référence de transaction, montant et état du prélèvement de frais. Informations de traitement et de reprise CBS disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les prélèvements CBS des frais",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/charges/{transactionRef}": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de suivre le prélèvement CBS associé à une décision de frais.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après un incident ou avant une éventuelle reprise approuvée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Référence de transaction, montant et état du prélèvement de frais.\n- Informations de traitement et de reprise CBS disponibles.\n\n### Conditions et effets\n\nLa décision de calcul et le prélèvement CBS ont des suivis distincts ; le calcul réussi ne prouve pas le prélèvement achevé.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Prélèvement introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "charge",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence exacte de la transaction pour laquelle les frais sont calculés ou prélevés.",
            "in": "path",
            "name": "transactionRef",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeChargeView"
                }
              }
            },
            "description": "Référence de transaction, montant et état du prélèvement de frais. Informations de traitement et de reprise CBS disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Prélèvement introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le prélèvement des frais d’une transaction",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/charges/{transactionRef}/retry": {
      "post": {
        "description": "Cet endpoint permet à un approbateur de relancer le traitement d’un prélèvement refusé, en échec ou à rapprocher, selon son état et les contrôles du service.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après examen de la cause et du résultat CBS connu, avec une identité d’opérateur pour la traçabilité.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Référence de transaction, montant et état du prélèvement de frais.\n- Informations de traitement et de reprise CBS disponibles.\n\n### Conditions et effets\n\nLa reprise ne doit pas reproduire un effet CBS ambigu. Le service détermine l’action autorisée à partir de l’état du prélèvement.\n\n### Erreurs et reprise\n\nRelire le prélèvement après une réponse perdue et ne pas créer une nouvelle référence pour contourner un refus de reprise.\n\n- **400** : Opérateur ou données invalides.\n\n- **404** : Prélèvement introuvable.\n\n- **409** : État du prélèvement non éligible à cette reprise.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "retry",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence exacte de la transaction pour laquelle les frais sont calculés ou prélevés.",
            "in": "path",
            "name": "transactionRef",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeChargeView"
                }
              }
            },
            "description": "Référence de transaction, montant et état du prélèvement de frais. Informations de traitement et de reprise CBS disponibles."
          },
          "400": {
            "description": "Opérateur ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Prélèvement introuvable."
          },
          "409": {
            "description": "État du prélèvement non éligible à cette reprise."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander la reprise d’un prélèvement de frais",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/fees": {
      "post": {
        "description": "Cet endpoint permet au canal d’appliquer le calcul de frais à une transaction : le moteur enregistre sa décision et met à jour le cumul client concerné.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque la transaction doit être prise en compte dans le calcul appliqué, en conservant sa référence stable.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nFournir transactionRef, direction, operationType, amount, currency, channel, catégories des parties et informations de contrepartie. customerId est requis pour une émission ; acceptedAt peut fixer la date d’évaluation. Les montants sont des XOF entiers.\n\n### Données retournées\n\n- Résultat de l’évaluation et règle retenue lorsqu’il y en a une.\n- Frais, taxes, montants calculés et explication disponibles dans le schéma.\n\n### Conditions et effets\n\nCette route a des effets durables, contrairement au devis. Elle ne doit pas être confondue avec une simple simulation ou la preuve d’un prélèvement CBS achevé.\n\n### Erreurs et reprise\n\nL’application est idempotente sur transactionRef : même référence et mêmes données restituent la décision, d’autres données provoquent un conflit.\n\n- **400** : Données de calcul invalides.\n\n- **409** : transactionRef déjà appliquée avec d’autres données.\n\n- **500** : Configuration du moteur incomplète.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "apply",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRequest"
              }
            }
          },
          "description": "Fournir transactionRef, direction, operationType, amount, currency, channel, catégories des parties et informations de contrepartie. customerId est requis pour une émission ; acceptedAt peut fixer la date d’évaluation. Les montants sont des XOF entiers.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult"
                }
              }
            },
            "description": "Résultat de l’évaluation et règle retenue lorsqu’il y en a une. Frais, taxes, montants calculés et explication disponibles dans le schéma."
          },
          "400": {
            "description": "Données de calcul invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "transactionRef déjà appliquée avec d’autres données."
          },
          "500": {
            "description": "Configuration du moteur incomplète."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Calculer et enregistrer une décision de frais",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/fees/quote": {
      "post": {
        "description": "Cet endpoint permet à un canal de calculer les frais à présenter avant confirmation, sans enregistrer une décision appliquée ni modifier le cumul du client.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour l’affichage préalable des frais ; si le calcul doit être enregistré et pris en compte dans les cumuls, utiliser l’application du calcul.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nFournir transactionRef, direction, operationType, amount, currency, channel, catégories des parties et informations de contrepartie. customerId est requis pour une émission ; acceptedAt peut fixer la date d’évaluation. Les montants sont des XOF entiers.\n\n### Données retournées\n\n- Résultat de l’évaluation et règle retenue lorsqu’il y en a une.\n- Frais, taxes, montants calculés et explication disponibles dans le schéma.\n\n### Conditions et effets\n\nAucun rôle PRICING supplémentaire n’est demandé dans ce contrôleur, mais le filtre OIDC du préfixe pricing-engine impose le rôle opérateur du participant. Le devis n’est pas un engagement de débit CBS.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Données de tarification invalides.\n\n- **500** : Configuration du moteur incomplète.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "quote",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRequest"
              }
            }
          },
          "description": "Fournir transactionRef, direction, operationType, amount, currency, channel, catégories des parties et informations de contrepartie. customerId est requis pour une émission ; acceptedAt peut fixer la date d’évaluation. Les montants sont des XOF entiers.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult"
                }
              }
            },
            "description": "Résultat de l’évaluation et règle retenue lorsqu’il y en a une. Frais, taxes, montants calculés et explication disponibles dans le schéma."
          },
          "400": {
            "description": "Données de tarification invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "500": {
            "description": "Configuration du moteur incomplète."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Obtenir un devis de frais sans appliquer le calcul",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/fees/{transactionRef}": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de retrouver la décision de frais enregistrée pour une référence de transaction.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour expliquer les frais appliqués ou résoudre une réponse réseau perdue lors de l’application.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Résultat de l’évaluation et règle retenue lorsqu’il y en a une.\n- Frais, taxes, montants calculés et explication disponibles dans le schéma.\n\n### Conditions et effets\n\nLa route relit une décision ; elle ne la recalcule pas avec la configuration actuelle.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Décision de frais introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "decision",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence exacte de la transaction tarifée.",
            "in": "path",
            "name": "transactionRef",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeResult"
                }
              }
            },
            "description": "Résultat de l’évaluation et règle retenue lorsqu’il y en a une. Frais, taxes, montants calculés et explication disponibles dans le schéma."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Décision de frais introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Relire la décision de frais d’une transaction",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/parameters": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les valeurs datées des paramètres utilisés dans les calculs de frais.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour comprendre les seuils, taux ou taxes applicables à une date d’évaluation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Paramètres du participant, valeurs et dates d’effet.\n\n### Conditions et effets\n\nUne valeur future n’est pas nécessairement celle utilisée pour une transaction passée ; examiner sa date d’effet.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "parameters",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeParameterView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Paramètres du participant, valeurs et dates d’effet."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les paramètres datés de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "put": {
        "description": "Cet endpoint permet à un approbateur de définir une nouvelle valeur de paramètre avec sa date d’effet.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour une modification approuvée d’un seuil, taux ou autre paramètre pris en charge.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nLe corps identifie le paramètre, sa nouvelle valeur et sa date d’effet selon le schéma.\n\n### Données retournées\n\n- Paramètre enregistré avec sa valeur et sa date d’effet.\n\n### Conditions et effets\n\nLe changement a un effet direct à sa date d’application et ne passe pas par la simulation d’une règle. Vérifier le code, la valeur et l’impact avant l’appel.\n\n### Erreurs et reprise\n\nRelire les valeurs datées après une réponse perdue avant d’en définir une autre.\n\n- **400** : Paramètre, valeur ou date invalide.\n\n- **409** : Définition en conflit.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "defineParameter",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeParameterCommand"
              }
            }
          },
          "description": "Le corps identifie le paramètre, sa nouvelle valeur et sa date d’effet selon le schéma.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeParameterView"
                }
              }
            },
            "description": "Paramètre enregistré avec sa valeur et sa date d’effet."
          },
          "400": {
            "description": "Paramètre, valeur ou date invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Définition en conflit."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Définir une valeur datée de paramètre de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de retrouver les règles de frais du participant, avec un filtre facultatif sur leur cycle de vie.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour sélectionner une règle à examiner, modifier, simuler ou remplacer.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nUne règle présente dans la liste n’est pas nécessairement active ; examiner son statut et ses dates.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : État de règle invalide.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État de règle recherché selon l’énumération du schéma.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "PENDING",
                "SIMULATED",
                "ACTIVE",
                "INACTIVE"
              ],
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "400": {
            "description": "État de règle invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les règles de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à un éditeur de créer une règle de frais avec ses critères et actions. La règle est enregistrée en attente et n’est pas encore utilisée comme règle active.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour préparer une politique de tarification avant simulation et approbation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_EDITOR`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nLe corps décrit le code, les critères, les actions et les conditions de validité de la règle selon le schéma.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nLe code doit être disponible et les critères/actions valides. L’opérateur est tracé ; une création n’active pas la règle.\n\n### Erreurs et reprise\n\nAprès un timeout, rechercher la règle par son code avant de recréer une version ; un code déjà pris provoque un conflit.\n\n- **400** : Définition de règle invalide.\n\n- **409** : Code ou définition en conflit.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand"
              }
            }
          },
          "description": "Le corps décrit le code, les critères, les actions et les conditions de validité de la règle selon le schéma.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "400": {
            "description": "Définition de règle invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Code ou définition en conflit."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Créer une règle de tarification en attente",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_EDITOR"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité d’examiner la définition et l’état d’une règle précise du participant.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant une modification, une simulation ou une décision d’approbation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nL’identifiant désigne la règle de ce participant ; la consultation ne change pas son cycle de vie.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Règle introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une règle de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "put": {
        "description": "Cet endpoint permet à un éditeur de modifier une règle PENDING ou SIMULATED. Une règle modifiée revient à l’état PENDING et doit être simulée à nouveau.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour corriger un brouillon ; pour changer une règle active, la dupliquer puis suivre le circuit de validation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_EDITOR`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nFournir la définition complète de la règle modifiée, avec son code conservé.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nLe code de la règle ne peut pas changer. Les règles actives ne sont pas modifiées par cette route.\n\n### Erreurs et reprise\n\nRelire la règle après une réponse perdue ; une modification invalide ne doit pas être contournée par un changement de code.\n\n- **400** : Définition ou code invalide.\n\n- **404** : Règle introuvable.\n\n- **409** : État non modifiable ou critères en conflit.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "update",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleCommand"
              }
            }
          },
          "description": "Fournir la définition complète de la règle modifiée, avec son code conservé.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "400": {
            "description": "Définition ou code invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          },
          "409": {
            "description": "État non modifiable ou critères en conflit."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Modifier une règle de tarification non active",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_EDITOR"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}/activate": {
      "post": {
        "description": "Cet endpoint permet à un approbateur de rendre active une règle dont la simulation a été enregistrée. Il peut remplacer une autre règle active dans la même transaction.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après examen de la définition et des résultats de simulation, dans le circuit de validation du participant.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nLe corps facultatif peut préciser replaceRuleId, identifiant de la règle active à remplacer.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nLa règle doit être SIMULATED. Le contrôle à quatre yeux peut imposer un approbateur différent de l’auteur ; les conflits de critères et le remplacement sont vérifiés.\n\n### Erreurs et reprise\n\nAprès un timeout, relire les états des deux règles avant une nouvelle décision.\n\n- **404** : Règle introuvable.\n\n- **409** : État, séparation des opérateurs, remplacement ou critères incompatibles.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "activate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.FeeRuleResource$ActivateRequest"
              }
            }
          },
          "description": "Le corps facultatif peut préciser replaceRuleId, identifiant de la règle active à remplacer."
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          },
          "409": {
            "description": "État, séparation des opérateurs, remplacement ou critères incompatibles."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Approuver et activer une règle simulée",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}/deactivate": {
      "post": {
        "description": "Cet endpoint permet à un approbateur de désactiver une règle avec un motif tracé.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsqu’une règle ne doit plus être retenue par les évaluations futures, après analyse de l’impact sur la tarification.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nreason justifie la désactivation.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nLa transition doit être autorisée par le cycle de vie. L’action ne recalcule pas les décisions ni les prélèvements déjà enregistrés.\n\n### Erreurs et reprise\n\nRelire le statut après une réponse perdue ; ne pas rejouer des opérations financières pour accompagner cette désactivation.\n\n- **400** : Motif ou identité invalide.\n\n- **404** : Règle introuvable.\n\n- **409** : Transition de règle interdite.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "deactivate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.FeeRuleResource$DeactivateRequest"
              }
            }
          },
          "description": "reason justifie la désactivation.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "400": {
            "description": "Motif ou identité invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          },
          "409": {
            "description": "Transition de règle interdite."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Désactiver une règle de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}/duplicate": {
      "post": {
        "description": "Cet endpoint permet à un éditeur de créer une copie PENDING d’une règle existante, sous un nouveau code.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour préparer l’évolution d’une règle active sans modifier la version actuellement appliquée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_EDITOR`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\ncode est le nouveau code de la copie.\n\n### Données retournées\n\n- Identifiant, code et état de la règle.\n- Critères, actions et périmètre de validité.\n- Métadonnées de création et de validation disponibles.\n\n### Conditions et effets\n\nUne copie de règle active conserve le lien utile à son remplacement lors de la validation. Le nouveau code doit être disponible.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, consulter la liste sous le nouveau code avant de relancer la duplication.\n\n- **400** : Code invalide.\n\n- **404** : Règle source introuvable.\n\n- **409** : Nouveau code déjà utilisé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "duplicate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.FeeRuleResource$DuplicateRequest"
              }
            }
          },
          "description": "code est le nouveau code de la copie.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleView"
                }
              }
            },
            "description": "Identifiant, code et état de la règle. Critères, actions et périmètre de validité. Métadonnées de création et de validation disponibles."
          },
          "400": {
            "description": "Code invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle source introuvable."
          },
          "409": {
            "description": "Nouveau code déjà utilisé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Dupliquer une règle sous un nouveau code",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_EDITOR"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}/history": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de relire les changements de définition et d’état d’une règle, avec leur traçabilité.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour expliquer une activation, une simulation ou une désactivation avant de modifier la configuration.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Événements d’historique, états et métadonnées d’auteur disponibles.\n\n### Conditions et effets\n\nL’historique ne réactive pas une version antérieure.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Règle introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "history_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeRuleHistoryView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Événements d’historique, états et métadonnées d’auteur disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter l’historique des changements d’une règle",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/rules/{id}/simulations": {
      "get": {
        "description": "Cet endpoint permet à un lecteur habilité de consulter les cas de simulation conservés pour une règle.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour examiner la preuve de test avant une approbation ou comprendre le comportement d’une version.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_READER` ou `PRICING_EDITOR` ou `PRICING_APPROVER`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données retournées\n\n- Cas de simulation et résultats enregistrés pour la règle.\n\n### Conditions et effets\n\nCette lecture ne rejoue pas les simulations et n’applique aucun frais.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Règle introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "simulations",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Cas de simulation et résultats enregistrés pour la règle."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les simulations d’une règle",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_READER",
            "PRICING_EDITOR",
            "PRICING_APPROVER"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à un éditeur de tester une règle avec un cas de transaction et de conserver le résultat de simulation.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant l’approbation pour vérifier la règle et produire la preuve de simulation attendue par son cycle de vie.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_EDITOR`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nFournir le cas de transaction et les options de simulation décrits par le schéma.\n\n### Données retournées\n\n- Cas de simulation enregistré et résultat de calcul.\n- Informations de la règle testée et de l’évaluation.\n\n### Conditions et effets\n\nLa simulation ne modifie pas les cumuls ni les décisions appliquées, mais enregistre un cas et peut rendre la règle SIMULATED.\n\n### Erreurs et reprise\n\nUne nouvelle simulation ajoute une trace ; consulter les cas existants après une réponse perdue.\n\n- **400** : Cas de test invalide.\n\n- **404** : Règle introuvable.\n\n- **409** : État de règle non simulable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "simulate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationCommand"
              }
            }
          },
          "description": "Fournir le cas de transaction et les options de simulation décrits par le schéma.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeSimulationView"
                }
              }
            },
            "description": "Cas de simulation enregistré et résultat de calcul. Informations de la règle testée et de l’évaluation."
          },
          "400": {
            "description": "Cas de test invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle introuvable."
          },
          "409": {
            "description": "État de règle non simulable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Simuler une transaction sur une règle",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_EDITOR"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/pricing-engine/simulations/batch": {
      "post": {
        "description": "Cet endpoint permet à un éditeur de tester plusieurs transactions sur une règle ciblée ou sur la configuration active.\n\n### Qui appelle cette opération ?\n\nOpérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour vérifier un ensemble de cas avant de valider une modification de tarification.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec le rôle `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\nContrôle métier supplémentaire : `PRICING_EDITOR`. Il s’applique si pricing-engine.security.enabled=true (dans cet export : false). En OIDC, les en-têtes X-Operator-Id et X-Operator-Roles sont reconstruits depuis le jeton : les envoyer soi-même ne confère aucun droit. En recette OFF, les contrôles métier lisent ces en-têtes lorsqu’ils les exigent.\n\n### Données à fournir\n\nLe corps contient les cas à évaluer ; ruleId cible une règle lorsqu’il est fourni.\n\n### Données retournées\n\n- Résultats par cas et bilan du lot de simulation.\n\n### Conditions et effets\n\nLes cas de simulation ne remplacent pas les décisions appliquées et n’effectuent pas de prélèvement de frais.\n\n### Erreurs et reprise\n\nConserver le bilan ; une nouvelle demande est une nouvelle simulation, pas une reprise financière.\n\n- **400** : Lot de simulation invalide.\n\n- **404** : Règle ciblée introuvable.\n\n- **409** : État de règle incompatible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "batch",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identité de l’opérateur pour l’audit. En OIDC, le cœur la remplace par l’identité du jeton ; l’en-tête de l’appelant ne fait pas autorité.",
            "in": "header",
            "name": "X-Operator-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Rôles métier supplémentaires lorsqu’ils sont exigés. En OIDC, le cœur les reconstruit depuis le jeton et écarte la valeur fournie par l’appelant.",
            "in": "header",
            "name": "X-Operator-Roles",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeBatchSimulationCommand"
              }
            }
          },
          "description": "Le corps contient les cas à évaluer ; ruleId cible une règle lorsqu’il est fourni.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.pricingengine.api.FeeBatchSimulationView"
                }
              }
            },
            "description": "Résultats par cas et bilan du lot de simulation."
          },
          "400": {
            "description": "Lot de simulation invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Règle ciblée introuvable."
          },
          "409": {
            "description": "État de règle incompatible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Simuler un ensemble de cas de tarification",
        "tags": [
          "Tarification"
        ],
        "x-authorization": {
          "additionalRoles": [
            "PRICING_EDITOR"
          ],
          "additionalRolesEnforced": false,
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/qr-codes": {
      "post": {
        "description": "Cet endpoint permet au canal du payé de générer la chaîne de données d’un QR de paiement à partir de son alias et du type de client.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant l’affichage ou l’impression d’un QR ; l’application cliente dessine l’image à partir du payload retourné.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nalias et clientType désignent le payé. dynamic sélectionne le QR dynamique ; amount et txId sont fournis selon le parcours.\n\n### Données retournées\n\n- payload : chaîne du QR à afficher.\n- Canal, indicateur dynamique, alias, montant et pays.\n- Référence de transaction pour le parcours dynamique.\n\n### Conditions et effets\n\nLe QR dynamique n’est pas autorisé pour un client particulier. Les données du QR doivent être valides ; cette génération ne lance aucun paiement.\n\n### Erreurs et reprise\n\nUne répétition génère un contenu à partir des données fournies ; elle ne remplace pas la référence de transaction unique à préparer pour un QR dynamique.\n\n- **400** : Type de client ou données invalides.\n\n- **422** : Format ou parcours QR non autorisé.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "generate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$GenerateRequest"
              }
            }
          },
          "description": "alias et clientType désignent le payé. dynamic sélectionne le QR dynamique ; amount et txId sont fournis selon le parcours.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$QrCodeResponse"
                }
              }
            },
            "description": "payload : chaîne du QR à afficher. Canal, indicateur dynamique, alias, montant et pays. Référence de transaction pour le parcours dynamique."
          },
          "400": {
            "description": "Type de client ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "Format ou parcours QR non autorisé."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Générer le contenu d’un QR de paiement",
        "tags": [
          "QR codes"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/qr-codes/decode": {
      "post": {
        "description": "Cet endpoint permet au canal payeur de décoder une chaîne QR scannée et de vérifier sa structure avant tout parcours de paiement.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher les données du QR ou pour diagnostiquer une chaîne qui ne peut pas être traitée.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\npayload est la chaîne exacte lue par le scanner.\n\n### Données retournées\n\n- Payload et informations décodées : alias, canal, montant, pays et référence disponibles.\n\n### Conditions et effets\n\nLe décodage ne vérifie pas l’identité du bénéficiaire dans PI-RAC et ne confirme pas un transfert.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **422** : QR invalide ou incohérent avec les règles du format.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "decode",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$DecodeRequest"
              }
            }
          },
          "description": "payload est la chaîne exacte lue par le scanner.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$QrCodeResponse"
                }
              }
            },
            "description": "Payload et informations décodées : alias, canal, montant, pays et référence disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "QR invalide ou incohérent avec les règles du format."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lire et valider un QR de paiement",
        "tags": [
          "QR codes"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/qr-codes/initiations": {
      "post": {
        "description": "Cet endpoint permet au canal payeur de décoder le QR et de lancer la recherche de son bénéficiaire dans un même appel.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après scan, avant présentation du payé et confirmation par le client sur la route de confirmation d’initiation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\npayload est la chaîne exacte du QR scanné.\n\n### Données retournées\n\n- QR décodé.\n- Initiation de recherche et informations du bénéficiaire disponibles.\n- Conditions suggérées de confirmation : type, canal, montant et référence.\n\n### Conditions et effets\n\nLe canal, le montant fixé et le TxId du QR s’imposent à la confirmation lorsqu’ils sont présents. Cette préparation ne constitue pas un paiement.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **400** : Recherche ou données invalides.\n\n- **422** : QR non conforme.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "initiate",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$DecodeRequest"
              }
            }
          },
          "description": "payload est la chaîne exacte du QR scanné.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.QrCodeResource$QrInitiationResponse"
                }
              }
            },
            "description": "QR décodé. Initiation de recherche et informations du bénéficiaire disponibles. Conditions suggérées de confirmation : type, canal, montant et référence."
          },
          "400": {
            "description": "Recherche ou données invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "422": {
            "description": "QR non conforme."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Préparer un paiement à partir d’un QR scanné",
        "tags": [
          "QR codes"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/received-payment-requests": {
      "get": {
        "description": "Cet endpoint permet au canal du client payeur de consulter les demandes reçues et le résultat des contrôles effectués à leur réception.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour constituer la liste à présenter au client ; le couple status=RECEIVED et controlResult=PASSED sélectionne les demandes ayant passé les contrôles.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Demandes reçues les plus récentes : références, parties et montant.\n- État et résultat des contrôles.\n- Conditions, échéances et dates disponibles.\n\n### Conditions et effets\n\nUne demande reçue n’est pas automatiquement payable : examiner son état, son contrôle et ses échéances.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_7",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État de demande reçue à filtrer.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Résultat des contrôles : PASSED, REFUSED ou UNAVAILABLE.",
            "in": "query",
            "name": "controlResult",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Demandes reçues les plus récentes : références, parties et montant. État et résultat des contrôles. Conditions, échéances et dates disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les demandes de paiement reçues",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/received-payment-requests/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal payeur de retrouver une demande reçue, ses conditions et le résultat des contrôles avant de demander une décision au client.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher le détail ou pour reprendre le suivi après une réponse de paiement ambiguë.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Références, parties, montant et conditions de la demande.\n- État, contrôles et motifs disponibles.\n- Dates et transfert associé lorsqu’il existe.\n\n### Conditions et effets\n\nLa lecture reste limitée au participant et au sens reçu de la demande.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Demande reçue introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_5",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                }
              }
            },
            "description": "Références, parties, montant et conditions de la demande. État, contrôles et motifs disponibles. Dates et transfert associé lorsqu’il existe."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande reçue introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une demande reçue avant décision",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/received-payment-requests/{id}/acceptance": {
      "put": {
        "description": "Cet endpoint permet au canal payeur d’appliquer la décision du client : payer immédiatement ou programmer le paiement lorsque le parcours le permet.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après présentation des conditions de la demande et accord du client. Pour un paiement immédiat, suivre le transfert retourné.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\npayLater indique le choix de paiement. businessReference identifie le transfert ; amount et les données complémentaires du payeur sont utilisées selon les conditions autorisées de la demande.\n\n### Données retournées\n\n- 200 : demande programmée pour paiement ultérieur.\n- 202 : identifiant du transfert immédiat et Location pour son suivi.\n\n### Conditions et effets\n\npayLater choisit le paiement ultérieur. businessReference est obligatoire pour payer immédiatement ; en paiement ultérieur, sa présence permet le déclenchement automatique à l’échéance. Les coordonnées géographiques vont par paire lorsqu’elles sont fournies.\n\n### Erreurs et reprise\n\nLa demande garde son transfert associé : une acceptation répétée ne doit pas créer un second paiement. Relire la demande si la réponse réseau est perdue.\n\n- **404** : Demande introuvable.\n\n- **409** : État de demande incompatible.\n\n- **422** : Décision, géolocalisation ou conditions de paiement refusées.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "accept",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "businessReference": "demo-rtp-001",
                    "payLater": false
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ReceivedPaymentRequestResource$AcceptanceRequest"
              }
            }
          },
          "description": "payLater indique le choix de paiement. businessReference identifie le transfert ; amount et les données complémentaires du payeur sont utilisées selon les conditions autorisées de la demande.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "object"
                }
              }
            },
            "description": "200 : demande programmée pour paiement ultérieur. 202 : identifiant du transfert immédiat et Location pour son suivi."
          },
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "object"
                }
              }
            },
            "description": "200 : demande programmée pour paiement ultérieur. 202 : identifiant du transfert immédiat et Location pour son suivi."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande introuvable."
          },
          "409": {
            "description": "État de demande incompatible."
          },
          "422": {
            "description": "Décision, géolocalisation ou conditions de paiement refusées."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Accepter une demande reçue et choisir son paiement",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/received-payment-requests/{id}/rejection": {
      "put": {
        "description": "Cet endpoint permet au canal payeur de refuser une demande reçue après décision du client et de transmettre le motif approprié.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le client ne souhaite pas payer cette demande ; consulter ensuite son état.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreason contient le motif du refus.\n\n### Données retournées\n\n- Demande après enregistrement du refus, avec son état et les informations de suivi.\n\n### Conditions et effets\n\nLa demande doit encore pouvoir être refusée et reason doit appartenir aux motifs admissibles du parcours.\n\n### Erreurs et reprise\n\nConserver l’identifiant de la demande et consulter son état avant une décision différente ; ne pas tenter de refuser un paiement déjà engagé.\n\n- **404** : Demande introuvable.\n\n- **409** : Demande dans un état incompatible.\n\n- **422** : Motif ou décision refusé par les règles métier.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "reject",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ReceivedPaymentRequestResource$RejectionRequest"
              }
            }
          },
          "description": "reason contient le motif du refus.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentRequestViews$RequestView"
                }
              }
            },
            "description": "Demande après enregistrement du refus, avec son état et les informations de suivi."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Demande introuvable."
          },
          "409": {
            "description": "Demande dans un état incompatible."
          },
          "422": {
            "description": "Motif ou décision refusé par les règles métier."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Refuser une demande de paiement reçue",
        "tags": [
          "Demandes de paiement"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/scheduled-payments": {
      "get": {
        "description": "Cet endpoint permet au canal de retrouver les programmations enregistrées pour son participant. Il expose les conditions de calendrier et le bénéficiaire associé.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher les ordres programmés et choisir celui à consulter ou à arrêter.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Identifiants et états des programmations.\n- Bénéficiaire et mode de recherche.\n- Prochaines dates, périodes et occurrences restantes.\n\n### Conditions et effets\n\nLa liste n’inclut pas le détail des exécutions ; ouvrir chaque programmation pour ce suivi.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list_1",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$ScheduledPaymentResponse"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Identifiants et états des programmations. Bénéficiaire et mode de recherche. Prochaines dates, périodes et occurrences restantes."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les programmations de paiement",
        "tags": [
          "Paiements programmés"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet au canal payeur d’enregistrer une échéance ou une répétition de paiement à partir d’une initiation existante et des conditions approuvées par le client.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le client souhaite exécuter le paiement plus tard, puis consulter les exécutions pour suivre chaque échéance.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\ninitiationId désigne la recherche initiale ; firstRunAt, period, occurrences et endAt définissent l’échéancier. terms porte les conditions du paiement confirmées par le client.\n\n### Données retournées\n\n- Identifiant et état de la programmation.\n- Bénéficiaire, mode de recherche et prochaine exécution.\n- Période, occurrences restantes et date de fin lorsqu’elles sont définies.\n\n### Conditions et effets\n\nL’initiation et les conditions doivent être admissibles. Les exécutions renouvellent la recherche du payé et utilisent le niveau de service programmé ; la création n’est pas un paiement réalisé.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **400** : Échéancier ou conditions invalides.\n\n- **404** : Initiation introuvable.\n\n- **409** : Initiation ou programmation dans un état incompatible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "create",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$CreateRequest"
              }
            }
          },
          "description": "initiationId désigne la recherche initiale ; firstRunAt, period, occurrences et endAt définissent l’échéancier. terms porte les conditions du paiement confirmées par le client.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$ScheduledPaymentResponse"
                }
              }
            },
            "description": "Identifiant et état de la programmation. Bénéficiaire, mode de recherche et prochaine exécution. Période, occurrences restantes et date de fin lorsqu’elles sont définies."
          },
          "400": {
            "description": "Échéancier ou conditions invalides."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable."
          },
          "409": {
            "description": "Initiation ou programmation dans un état incompatible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Programmer un paiement à partir d’un bénéficiaire vérifié",
        "tags": [
          "Paiements programmés"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/scheduled-payments/{id}": {
      "delete": {
        "description": "Cet endpoint permet au canal payeur d’annuler les prochaines échéances d’une programmation. Il ne rappelle pas les fonds d’un transfert déjà engagé.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le client met fin à son instruction pour les échéances à venir.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Programmation après l’arrêt, avec son état et son calendrier.\n\n### Conditions et effets\n\nPour un transfert déjà exécuté, utiliser le parcours distinct de demande d’annulation ou de retour de fonds.\n\n### Erreurs et reprise\n\nAprès une réponse perdue, relire l’état de la programmation avant toute autre décision.\n\n- **404** : Programmation introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cancel_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$ScheduledPaymentResponse"
                }
              }
            },
            "description": "Programmation après l’arrêt, avec son état et son calendrier."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Programmation introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Arrêter les échéances futures d’un paiement programmé",
        "tags": [
          "Paiements programmés"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "get": {
        "description": "Cet endpoint permet au canal payeur de suivre un paiement programmé et les échéances déjà engagées. Il distingue l’ordre permanent des exécutions qui peuvent produire chacune un transfert.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour expliquer une échéance, retrouver son transfert ou repérer une reconfirmation demandée après changement du payé.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Calendrier, état et bénéficiaire de la programmation.\n- Exécutions : date prévue, état, raison et dates de mise à jour.\n- Identifiants d’initiation, EndToEndId et transfert lorsqu’ils existent.\n\n### Conditions et effets\n\nLe statut de la programmation ne suffit pas à conclure au paiement d’une échéance : lire son exécution et le transfert associé.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Programmation introuvable.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_4",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.ScheduledPaymentResource$ScheduledPaymentResponse"
                }
              }
            },
            "description": "Calendrier, état et bénéficiaire de la programmation. Exécutions : date prévue, état, raison et dates de mise à jour. Identifiants d’initiation, EndToEndId et transfert lorsqu’ils existent."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Programmation introuvable."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter une programmation et ses exécutions",
        "tags": [
          "Paiements programmés"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/scheduled-payments/{id}/executions/{executionId}/reconfirmation": {
      "post": {
        "description": "Cet endpoint permet au canal de recueillir à nouveau l’accord du client lorsque la recherche d’une échéance a révélé un changement du payé. Il déclenche le transfert de cette exécution si les contrôles l’autorisent.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après présentation des nouvelles données du bénéficiaire, pour l’exécution qui attend cette reconfirmation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- 202 : identifiant du transfert accepté et Location pour son suivi.\n- 409 : problème précisant la règle qui a refusé l’exécution.\n\n### Conditions et effets\n\nid désigne la programmation et executionId l’échéance concernée. Une autre exécution ne doit pas être confirmée à sa place.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Programmation ou exécution introuvable.\n\n- **409** : Exécution non éligible ou transfert refusé par une règle.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "reconfirm",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Identifiant de l’exécution du paiement programmé, obtenu dans son suivi.",
            "in": "path",
            "name": "executionId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "type": "object"
                }
              }
            },
            "description": "202 : identifiant du transfert accepté et Location pour son suivi. 409 : problème précisant la règle qui a refusé l’exécution."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Programmation ou exécution introuvable."
          },
          "409": {
            "description": "Exécution non éligible ou transfert refusé par une règle."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Reconfirmer une échéance après changement du bénéficiaire",
        "tags": [
          "Paiements programmés"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfer-initiations": {
      "post": {
        "description": "Cet endpoint permet au canal du client payeur de préparer un transfert en recherchant le bénéficiaire par alias ou en vérifiant son compte. Il crée une initiation et conserve l’EndToEndId à utiliser pour le futur transfert.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser avant de présenter le nom et le pays du payé au client. Après sa confirmation, appeler la confirmation de cette initiation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nalias désigne le bénéficiaire. À défaut, accountId et creditorAgent identifient son compte et son participant ; iban est détecté depuis le compte lorsqu’il est omis.\n\n### Données retournées\n\n- Identifiant de l’initiation et EndToEndId de la recherche.\n- Méthode et état de la recherche ; données du payé lorsqu’il a été trouvé.\n- Dates de création, résolution et confirmation, et identifiant du transfert s’il existe.\n\n### Conditions et effets\n\nFournir soit alias, soit accountId avec creditorAgent. La recherche par compte est asynchrone : consulter l’initiation avant de confirmer. Cette étape ne transfère pas les fonds.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **400** : Alias et compte fournis ensemble, bénéficiaire absent ou paramètres incohérents.\n\n- **503** : Répertoire ou dépendance indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "start",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "alias": "<alias de recette>"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$StartRequest"
              }
            }
          },
          "description": "alias désigne le bénéficiaire. À défaut, accountId et creditorAgent identifient son compte et son participant ; iban est détecté depuis le compte lorsqu’il est omis.",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$InitiationResponse"
                }
              }
            },
            "description": "Identifiant de l’initiation et EndToEndId de la recherche. Méthode et état de la recherche ; données du payé lorsqu’il a été trouvé. Dates de création, résolution et confirmation, et identifiant du transfert s’il existe."
          },
          "400": {
            "description": "Alias et compte fournis ensemble, bénéficiaire absent ou paramètres incohérents."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "503": {
            "description": "Répertoire ou dépendance indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Rechercher le bénéficiaire avant un transfert",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfer-initiations/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal payeur de retrouver une initiation et le résultat de sa recherche préalable. Pour une recherche par compte encore en attente, il reprend la réponse de vérification reçue par le cœur.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour savoir si le bénéficiaire peut être présenté au client, puis pour retrouver le transfert issu de sa confirmation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- État de l’initiation, méthode et EndToEndId.\n- Nom, pays, compte, participant et profil du payé, lorsqu’ils sont résolus.\n- Identifiant du transfert et horodatages disponibles.\n\n### Conditions et effets\n\nUne recherche en attente n’autorise pas encore la confirmation. Une réponse absente, expirée ou rejetée par PI doit être examinée dans le suivi de vérification.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Initiation introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_3",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$InitiationResponse"
                }
              }
            },
            "description": "État de l’initiation, méthode et EndToEndId. Nom, pays, compte, participant et profil du payé, lorsqu’ils sont résolus. Identifiant du transfert et horodatages disponibles."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la recherche du bénéficiaire",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfer-initiations/{id}/confirmation": {
      "post": {
        "description": "Cet endpoint permet au canal payeur de transformer une recherche aboutie en ordre de transfert après accord du client. Le cœur reprend l’EndToEndId et les informations du payé, puis lance le traitement financier.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après présentation du bénéficiaire et validation du montant par le client ; suivre ensuite le transfert indiqué dans Location.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nFournir les conditions confirmées : type, businessReference, amount, debtorAccount, channel et les données complémentaires des parties exigées par le parcours. currency vaut XOF si elle est omise.\n\n### Données retournées\n\n- Identifiant du transfert créé et état de prise en charge.\n- En-tête Location vers la consultation du transfert.\n\n### Conditions et effets\n\nLa recherche doit être résolue et ses informations cohérentes avec la confirmation. Un HTTP 202 signifie prise en charge, pas irrévocabilité ni comptabilisation achevée.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Initiation introuvable.\n\n- **409** : État incompatible avec la confirmation.\n\n- **422** : Données du payé incohérentes, recherche ou règle métier refusée.\n\n- **503** : Participant ou dépendance indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "confirm",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.PaymentInitiationResource$ConfirmRequest"
              }
            }
          },
          "description": "Fournir les conditions confirmées : type, businessReference, amount, debtorAccount, channel et les données complémentaires des parties exigées par le parcours. currency vaut XOF si elle est omise.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.application.TransferAccepted"
                }
              }
            },
            "description": "Identifiant du transfert créé et état de prise en charge. En-tête Location vers la consultation du transfert."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Initiation introuvable."
          },
          "409": {
            "description": "État incompatible avec la confirmation."
          },
          "422": {
            "description": "Données du payé incohérentes, recherche ou règle métier refusée."
          },
          "503": {
            "description": "Participant ou dépendance indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Confirmer le transfert après accord du client",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers": {
      "get": {
        "description": "Cet endpoint permet au canal du participant de consulter ses transferts émis et reçus. La liste donne une vue paginée des opérations, classées par irrévocabilité décroissante (NULLS LAST), puis date de mise à jour, puis transferId.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour afficher un historique ou retrouver une opération à partir de son compte, sa référence métier, son EndToEndId, son lot ou un paiement programmé.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- items : résumés des transferts, avec leurs références, montants, états, irrevocableAt et remittanceInformation.\n- page et size : pagination appliquée.\n- total et totalPages : nombre de résultats et de pages.\n\n### Conditions et effets\n\nfrom/to portent sur la création (borne initiale incluse, finale exclue) ; irrevocableFrom/irrevocableTo portent sur l’irrévocabilité. account filtre debtorAccount ou creditorAccount. Ouvrir le détail pour le suivi comptable complet.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **400** : Filtre, date, pagination invalide ou irrevocableFrom ≥ irrevocableTo.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "list",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "État métier recherché, selon l’énumération du schéma.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Type de transfert recherché.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sens du transfert : émis ou reçu, selon l’énumération du schéma.",
            "in": "query",
            "name": "direction",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Instant de création minimal inclus, au format ISO 8601.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Instant de création maximal exclu, au format ISO 8601.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Identifiant de bout en bout exact à retrouver.",
            "in": "query",
            "name": "endToEndId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence métier exacte fournie par le canal.",
            "in": "query",
            "name": "businessReference",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Référence du lot commune aux éléments recherchés.",
            "in": "query",
            "name": "bulkReference",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Compte payeur ou payé exact (debtorAccount ou creditorAccount).",
            "in": "query",
            "name": "account",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Recherche libre insensible à la casse sur les noms des parties et l’EndToEndId.",
            "in": "query",
            "name": "keyword",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "UUID d’un paiement programmé ; filtre les exécutions liées (ScheduledPaymentExecution).",
            "in": "query",
            "name": "subscriptionId",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Instant d’irrévocabilité minimal inclus, au format ISO 8601.",
            "in": "query",
            "name": "irrevocableFrom",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Instant d’irrévocabilité maximal exclu, au format ISO 8601.",
            "in": "query",
            "name": "irrevocableTo",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Numéro de page à partir de 0. Valeur par défaut : `0`.",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Nombre de résultats par page : 20 par défaut, au maximum 100. Valeur par défaut : `20`.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$TransferPage"
                }
              }
            },
            "description": "items : résumés des transferts, avec leurs références, montants, états, irrevocableAt et remittanceInformation. page et size : pagination appliquée. total et totalPages : nombre de résultats et de pages."
          },
          "400": {
            "description": "Filtre, date, pagination invalide ou irrevocableFrom ≥ irrevocableTo."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Lister les transferts du participant",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      },
      "post": {
        "description": "Cet endpoint permet à un canal qui gère lui-même la recherche préalable de soumettre directement un ordre de transfert. Le cœur contrôle le profil de paiement et la cohérence avec la recherche, puis engage la saga et les opérations CBS nécessaires.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser lorsque le canal dispose déjà d’une recherche aboutie ; préférer le parcours d’initiation puis confirmation lorsque le cœur doit coordonner cette recherche.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nFournir type, businessReference, amount, debtorAccount et les données du payé, ainsi que channel et les informations conditionnelles du parcours. currency vaut XOF et debtorAgent vaut notre participant lorsqu’ils sont omis.\n\n### Données retournées\n\n- Identifiant du transfert et état initial de prise en charge.\n- Location : adresse de consultation du transfert.\n- Idempotent-Replayed : indique la restitution d’une demande déjà acceptée.\n\n### Conditions et effets\n\nPour un transfert inter-participants, endToEndId doit correspondre à la recherche et les données du payé doivent rester cohérentes. Le transfert intra-participant suit le traitement CBS local prévu par le projet. Un 202 ne prouve pas le paiement.\n\n### Erreurs et reprise\n\nAvec Idempotency-Key, rejouer la même demande avec la même clé restitue l’opération initiale. Une clé réutilisée avec d’autres données est refusée ; après un timeout, consulter le transfert existant.\n\n- **400** : Corps, type ou clé d’idempotence invalide.\n\n- **409** : Référence métier ou EndToEndId déjà utilisé.\n\n- **422** : Recherche préalable absente ou incohérente, ou contrôle métier refusé.\n\n- **503** : Participant ou dépendance indisponible.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "submit",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$SubmitRequest"
              }
            }
          },
          "description": "Fournir type, businessReference, amount, debtorAccount et les données du payé, ainsi que channel et les informations conditionnelles du parcours. currency vaut XOF et debtorAgent vaut notre participant lorsqu’ils sont omis.",
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.domain.transfer.application.TransferAccepted"
                }
              }
            },
            "description": "Identifiant du transfert et état initial de prise en charge. Location : adresse de consultation du transfert. Idempotent-Replayed : indique la restitution d’une demande déjà acceptée."
          },
          "400": {
            "description": "Corps, type ou clé d’idempotence invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "409": {
            "description": "Référence métier ou EndToEndId déjà utilisé."
          },
          "422": {
            "description": "Recherche préalable absente ou incohérente, ou contrôle métier refusé."
          },
          "503": {
            "description": "Participant ou dépendance indisponible."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Soumettre un transfert avec une recherche déjà réalisée",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}": {
      "get": {
        "description": "Cet endpoint permet au canal de connaître l’état d’un transfert précis de son participant. Il distingue le résultat métier, la comptabilisation CBS, le retour de fonds et l’annulation éventuelle.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser après la soumission, une erreur réseau ou une notification pour afficher le résultat et déterminer la suite du parcours.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Références, parties, montant, devise, sens et type du transfert.\n- status, accountingStatus, returnStatus et cancellationStatus.\n- Dernière erreur, échéances, détails PI et horodatages mesurés par le participant.\n\n### Conditions et effets\n\nUn résultat PI et un résultat comptable ne sont pas interchangeables. UNKNOWN demande une résolution ; les horodatages absents ne sont pas inventés.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Transfert introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "get_2",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$TransferDetailResponse"
                }
              }
            },
            "description": "Références, parties, montant, devise, sens et type du transfert. status, accountingStatus, returnStatus et cancellationStatus. Dernière erreur, échéances, détails PI et horodatages mesurés par le participant."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter le résultat métier et comptable d’un transfert",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}/cancellation-decision": {
      "post": {
        "description": "Cet endpoint permet au canal du payé d’enregistrer la décision de son client sur une demande d’annulation reçue. Un accord engage le retour de fonds ; un refus prépare la réponse d’annulation.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser uniquement après identification du transfert et de la décision à appliquer ; consulter ensuite le même transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\naccepted indique l’accord du client ; rejectionCode porte le motif autorisé en cas de refus.\n\n### Données retournées\n\n- 202 sans corps : action prise en charge.\n- Location : consultation du transfert.\n- La décision, l’éventuel retour et leur issue se lisent ensuite sur le transfert.\n\n### Conditions et effets\n\nL’état, le sens du transfert et le scénario doivent autoriser cette action. Une prise en charge ne garantit ni l’accord du destinataire ni un retour achevé.\n\n### Erreurs et reprise\n\nConserver Idempotency-Key pour la même décision et le même corps. Un rejeu identique peut restituer l’action initiale avec Idempotent-Replayed ; ne pas créer une nouvelle action pour résoudre une issue inconnue.\n\n- **404** : Transfert introuvable.\n\n- **409** : État, scénario, motif ou décision incompatible.\n\n- **422** : Clé réutilisée avec d’autres données ou validation métier refusée.\n\n- **503** : Participant indisponible pour cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "decideCancellation",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$CancellationDecisionRequest"
              }
            }
          },
          "description": "accepted indique l’accord du client ; rejectionCode porte le motif autorisé en cas de refus.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : action prise en charge. Location : consultation du transfert. La décision, l’éventuel retour et leur issue se lisent ensuite sur le transfert."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable."
          },
          "409": {
            "description": "État, scénario, motif ou décision incompatible."
          },
          "422": {
            "description": "Clé réutilisée avec d’autres données ou validation métier refusée."
          },
          "503": {
            "description": "Participant indisponible pour cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Répondre à une demande d’annulation reçue",
        "tags": [
          "Annulations et retours"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}/cancellations": {
      "post": {
        "description": "Cet endpoint permet au canal du payeur de demander le retour d’un transfert émis devenu irrévocable. Le cœur prépare une demande d’annulation à transmettre au participant payé.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser uniquement après identification du transfert et de la décision à appliquer ; consulter ensuite le même transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreason contient le motif de la demande d’annulation autorisé pour le scénario.\n\n### Données retournées\n\n- 202 sans corps : action prise en charge.\n- Location : consultation du transfert.\n- La demande d’annulation et les décisions ultérieures se suivent dans cancellationStatus.\n\n### Conditions et effets\n\nL’état, le sens du transfert et le scénario doivent autoriser cette action. Une prise en charge ne garantit ni l’accord du destinataire ni un retour achevé.\n\n### Erreurs et reprise\n\nConserver Idempotency-Key pour la même décision et le même corps. Un rejeu identique peut restituer l’action initiale avec Idempotent-Replayed ; ne pas créer une nouvelle action pour résoudre une issue inconnue.\n\n- **404** : Transfert introuvable.\n\n- **409** : État, scénario, motif ou décision incompatible.\n\n- **422** : Clé réutilisée avec d’autres données ou validation métier refusée.\n\n- **503** : Participant indisponible pour cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "cancel",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$ReasonRequest"
              }
            }
          },
          "description": "reason contient le motif de la demande d’annulation autorisé pour le scénario.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : action prise en charge. Location : consultation du transfert. La demande d’annulation et les décisions ultérieures se suivent dans cancellationStatus."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable."
          },
          "409": {
            "description": "État, scénario, motif ou décision incompatible."
          },
          "422": {
            "description": "Clé réutilisée avec d’autres données ou validation métier refusée."
          },
          "503": {
            "description": "Participant indisponible pour cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander l’annulation d’un transfert émis",
        "tags": [
          "Annulations et retours"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}/returns": {
      "post": {
        "description": "Cet endpoint permet au canal du payé de demander le retour des fonds d’un transfert reçu et irrévocable. Le cœur réserve les fonds selon le parcours, puis prépare le message de retour.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser uniquement après identification du transfert et de la décision à appliquer ; consulter ensuite le même transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nreason est le motif du retour ; initiatedBy distingue notamment l’initiative du client et celle du participant.\n\n### Données retournées\n\n- 202 sans corps : action prise en charge.\n- Location : consultation du transfert.\n- La progression du retour et son résultat se suivent dans returnStatus et accountingStatus.\n\n### Conditions et effets\n\nL’état, le sens du transfert et le scénario doivent autoriser cette action. Une prise en charge ne garantit ni l’accord du destinataire ni un retour achevé.\n\n### Erreurs et reprise\n\nConserver Idempotency-Key pour la même décision et le même corps. Un rejeu identique peut restituer l’action initiale avec Idempotent-Replayed ; ne pas créer une nouvelle action pour résoudre une issue inconnue.\n\n- **404** : Transfert introuvable.\n\n- **409** : État, scénario, motif ou décision incompatible.\n\n- **422** : Clé réutilisée avec d’autres données ou validation métier refusée.\n\n- **503** : Participant indisponible pour cette action.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "returnFunds",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Clé stable de la même demande ; lorsqu’elle est facultative, son omission ne crée pas la protection d’un rejeu par clé. Ne pas la réutiliser avec d’autres données.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$ReturnRequest"
              }
            }
          },
          "description": "reason est le motif du retour ; initiatedBy distingue notamment l’initiative du client et celle du participant.",
          "required": true
        },
        "responses": {
          "202": {
            "description": "202 sans corps : action prise en charge. Location : consultation du transfert. La progression du retour et son résultat se suivent dans returnStatus et accountingStatus."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable."
          },
          "409": {
            "description": "État, scénario, motif ou décision incompatible."
          },
          "422": {
            "description": "Clé réutilisée avec d’autres données ou validation métier refusée."
          },
          "503": {
            "description": "Participant indisponible pour cette action."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Initier le retour d’un transfert reçu",
        "tags": [
          "Annulations et retours"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}/status-inquiries": {
      "post": {
        "description": "Cet endpoint permet au canal de demander au cœur une recherche de statut pour un transfert dont l’issue PI reste à établir. Le cœur conserve la corrélation avec l’ordre existant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser dans un parcours de résolution après expiration du délai de confirmation ; ce n’est pas une nouvelle émission du transfert.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- 202 sans corps : demande de recherche prise en charge.\n- Location : détail du transfert à consulter pour le résultat.\n\n### Conditions et effets\n\nLe transfert doit exister et être éligible à une recherche ; un appel avant l’expiration du délai de confirmation est refusé.\n\n### Erreurs et reprise\n\nUne absence de réponse ne prouve pas une absence d’effet. Relire la même ressource avant toute nouvelle action ; conserver les identifiants métier et ne pas reconstruire un nouvel ordre pour résoudre une issue incertaine.\n\n- **404** : Transfert introuvable.\n\n- **409** : Demande prématurée ou état ne permettant pas la recherche.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "inquireStatus",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "202 sans corps : demande de recherche prise en charge. Location : détail du transfert à consulter pour le résultat."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable."
          },
          "409": {
            "description": "Demande prématurée ou état ne permettant pas la recherche."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Demander la résolution du statut PI d’un transfert",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{id}/timeline": {
      "get": {
        "description": "Cet endpoint permet au canal ou au support autorisé de relire les événements enregistrés par la saga d’un transfert. Il complète le détail par la trace des changements et traitements intervenus.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’utiliser pour comprendre une progression, un rejet ou une attente avant de demander une reprise à l’exploitation.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données retournées\n\n- Identifiant de chaque événement.\n- Type d’événement et contenu enregistré.\n- Date de survenue.\n\n### Conditions et effets\n\nLa chronologie est celle enregistrée par le cœur ; elle n’est pas un journal exhaustif de l’infrastructure distante de PI.\n\n### Erreurs et reprise\n\nCet appel ne relance pas une opération financière. Après une erreur réseau, la consultation peut être répétée avec les mêmes paramètres.\n\n- **404** : Transfert introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "timeline",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant de la ressource de cette opération, obtenu lors de sa création ou dans sa liste ; conserver le même contexte participant.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "*/*": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/com.baobab.pispi.apps.api.TransferResource$TransferTimelineItem"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Identifiant de chaque événement. Type d’événement et contenu enregistré. Date de survenue."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Consulter la chronologie d’un transfert",
        "tags": [
          "Transferts"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/api/v1/{participantCode}/transfers/{transferId}/customer-notifications": {
      "post": {
        "description": "Cet endpoint permet à un canal authentifié de fournir au cœur la preuve d’une notification client livrée avec succès pour un transfert. Il alimente l’horodatage de notification utilisé dans les indicateurs du participant.\n\n### Qui appelle cette opération ?\n\nCanal du client ou opérateur habilité du participant.\n\n### Quand l’utiliser ?\n\nL’appeler après confirmation d’une livraison réussie, jamais lors de la simple mise en file d’un message.\n\n### Autorisations nécessaires\n\nEn mode OIDC, fournir Authorization: Bearer <jeton> du royaume `pi-{participantCode}`, avec l’un des rôles `participant.client` ou `participant.ops`. Le jeton d’un autre royaume n’autorise pas ce périmètre. En mode OFF, l’authentification Bearer est désactivée pour le poste local ; le profil prod refuse OFF. Le mode du serveur cible fait foi ; celui de cet export est `OFF`.\n\n### Données à fournir\n\nsentAt est obligatoire et doit être un instant ISO 8601.\n\n### Données retournées\n\n- 204 : preuve prise en compte, sans corps de réponse.\n\n### Conditions et effets\n\nsentAt est l’heure réelle de départ de la notification livrée. Cette attestation ne modifie pas l’issue financière du transfert et ne constitue pas un webhook Business public.\n\n### Erreurs et reprise\n\nUne répétition de la preuve ne doit pas fabriquer un nouvel envoi ni réécrire artificiellement la première preuve retenue.\n\n- **400** : Preuve absente ou instant invalide.\n\n- **404** : Transfert introuvable dans ce participant.\n\nEn OIDC : **401** si le jeton est absent ou invalide ; **403** si le royaume ou les rôles sont insuffisants. Ces refus n’autorisent pas à changer de participant dans l’URL.",
        "operationId": "acknowledge",
        "parameters": [
          {
            "description": "Code membre du participant configuré, qui délimite les données de l’appel. Le paramètre ne confère aucun droit sur un autre participant.",
            "in": "path",
            "name": "participantCode",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Identifiant interne du transfert concerné.",
            "in": "path",
            "name": "transferId",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "recette": {
                  "summary": "Données fictives à adapter à la recette",
                  "value": {
                    "sentAt": "2026-10-23T10:00:00Z"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/com.baobab.pispi.apps.api.CustomerNotificationResource$Evidence"
              }
            }
          },
          "description": "sentAt est obligatoire et doit être un instant ISO 8601.",
          "required": true
        },
        "responses": {
          "204": {
            "description": "204 : preuve prise en compte, sans corps de réponse."
          },
          "400": {
            "description": "Preuve absente ou instant invalide."
          },
          "401": {
            "description": "En mode OIDC : jeton Bearer absent, invalide ou non vérifiable."
          },
          "403": {
            "description": "En mode OIDC : royaume ou rôle insuffisant ; les contrôles métier peuvent aussi refuser l’action."
          },
          "404": {
            "description": "Transfert introuvable dans ce participant."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {}
        ],
        "summary": "Attester l’envoi réussi d’une notification au client",
        "tags": [
          "Notifications et reprises"
        ],
        "x-authorization": {
          "mode": "OFF",
          "realm": "pi-{participantCode}",
          "rolesInOidc": [
            "participant.client",
            "participant.ops"
          ]
        }
      }
    },
    "/comptes/factures": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un relevé de frais ou de facturation émis par PI au participant. Le message camt.086 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour mettre à disposition les éléments de facturation reçus pour le suivi et le rapprochement.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.086. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.086. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un relevé de facturation de PI",
        "tags": [
          "Callbacks · Règlements"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/comptes/soldes": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un relevé des soldes lié à la compensation au participant. Le message camt.053 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter le suivi du règlement et le rapprochement du participant, distincts de l’irrévocabilité de chaque transfert.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.053. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_2",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.053. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir le relevé de compensation du participant",
        "tags": [
          "Callbacks · Règlements"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/demandes-paiement": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande destinée au client payeur du participant au participant. Le message pain.013 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour engager les contrôles de la demande avant sa présentation au client et sa décision.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pain.013. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_16",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pain.013. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande de paiement de PI",
        "tags": [
          "Callbacks · Demandes de paiement"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/demandes-paiement/": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande destinée au client payeur du participant au participant. Le message pain.013 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour engager les contrôles de la demande avant sa présentation au client et sa décision.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pain.013. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_3",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pain.013. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande de paiement de PI",
        "tags": [
          "Callbacks · Demandes de paiement"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/demandes-paiement/rapports": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une réponse ou un rejet du parcours de demande de paiement au participant. Le message pain.014 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour corréler cette issue avec la demande existante ; le paiement lui-même suit le parcours de transfert.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pain.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_6",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pain.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une réponse de refus de demande de paiement",
        "tags": [
          "Callbacks · Demandes de paiement"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/notifications": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une information, un avertissement ou un test de connectivité au participant. Le message admi.004 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter le suivi de connectivité ou la fonction concernée par la notification ; ce message n’est pas une notification HTTP au client Business.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message admi.004. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_19",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message admi.004. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une notification opérationnelle de PI",
        "tags": [
          "Callbacks · Notifications"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/notifications/accuses": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un accusé de notification de connectivité au participant. Le message admi.011 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour compléter le suivi de l’échange opérationnel déjà initié.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message admi.011. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_18",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message admi.011. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir l’accusé d’un échange de connectivité",
        "tags": [
          "Callbacks · Notifications"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/notifications/rejets": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre le rejet d’un message de notification ou de connectivité au participant. Le message admi.002 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour expliquer l’échec de l’échange opérationnel et le rendre disponible à l’exploitation.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_10",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un rejet technique de notification",
        "tags": [
          "Callbacks · Notifications"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/participants/liste/reponses": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une liste ou mise à jour de participants publiée par PI au participant. Le message camt.014 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour mettre à disposition le statut connu des contreparties pour les consultations et les contrôles du cœur.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_21",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir la liste et les statuts des participants",
        "tags": [
          "Callbacks · Participants"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/reglements/garanties": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une notification de garantie ou de solde après règlement au participant. Le message camt.010 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter le suivi des événements et soldes de garantie connus du cœur.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message camt.010. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_14",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message camt.010. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une mise à jour de garantie ou de solde",
        "tags": [
          "Callbacks · Règlements"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/relations/accuses": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un accusé ou statut de traitement de la relation au participant. Le message reda.016 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour suivre la demande de création ou de rupture à laquelle le message fait référence.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message reda.016. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_17",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message reda.016. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir l’accusé PI d’une opération de relation",
        "tags": [
          "Callbacks · Relations"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/relations/creations": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande de création de relation venant de l’autre partie au participant. Le message reda.014 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter le suivi de sponsorisation ; l’accord entre les participants et les confirmations restent à traiter par le parcours de relation.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message reda.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_11",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message reda.014. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande de relation de sponsorisation",
        "tags": [
          "Callbacks · Relations"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/relations/rapports": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre le rapport d’une relation créée ou terminée au participant. Le message reda.017 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour corréler les informations de relation avec le participant concerné et son suivi opérationnel.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message reda.017. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_22",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message reda.017. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir le rapport d’une relation de sponsorisation",
        "tags": [
          "Callbacks · Relations"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/relations/ruptures": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un message relatif à la rupture d’une sponsorisation au participant. Le message reda.031 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour enregistrer sa réception avant son traitement ; la réception HTTP seule ne prouve pas la clôture effective de la relation.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message reda.031. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_4",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message reda.031. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un message de rupture de relation",
        "tags": [
          "Callbacks · Relations"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/transferts": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un ordre destiné au participant payé au participant. Le message pacs.008 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter les contrôles et le parcours de réception du transfert avant la réponse métier.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pacs.008. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_23",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pacs.008. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un ordre de transfert de PI",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/transferts/rapports": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un rapport d’acceptation, d’irrévocabilité ou de rejet au participant. Le message pacs.002 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour corréler le résultat PI au transfert existant et poursuivre son suivi financier et comptable.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pacs.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_13",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pacs.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir le résultat PI d’un transfert",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/transferts/rejets": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre le rejet technique d’un message de transfert envoyé au participant. Le message admi.002 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour examiner le message d’origine et son erreur sans supposer que toute erreur technique autorise un nouvel ordre.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_15",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un rejet technique lié à un transfert",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/transferts/retours": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre un retour de fonds destiné au participant du payeur initial au participant. Le message pacs.004 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour alimenter le parcours de réception du retour et ses contrôles comptables avant la réponse métier.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message pacs.004. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_20",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message pacs.004. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande de retour de fonds de PI",
        "tags": [
          "Callbacks · Transferts"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/verifications-identites": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une demande de vérification visant un compte du participant au participant. Le message acmt.023 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour engager le contrôle du compte et du titulaire avant la réponse de vérification.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message acmt.023. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_9",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message acmt.023. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir une demande de vérification de compte",
        "tags": [
          "Callbacks · Identité"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/verifications-identites/rapports": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre une réponse positive ou négative à une recherche de compte au participant. Le message acmt.024 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour compléter le suivi de vérification et permettre au canal de consulter l’identité du payé lorsqu’elle est confirmée.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message acmt.024. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_12",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message acmt.024. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir le résultat d’une vérification d’identité",
        "tags": [
          "Callbacks · Identité"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    },
    "/verifications-identites/rejets": {
      "post": {
        "description": "Cet endpoint permet à PI de transmettre le rejet technique d’un échange de vérification au participant. Le message admi.002 est contrôlé et enregistré dans l’Inbox avant son traitement asynchrone.\n\n### Qui appelle cette opération ?\n\nPlateforme PI, ou outil de recette explicitement autorisé dans un environnement de test ; cette opération n’est pas destinée à un canal client.\n\n### Quand l’utiliser ?\n\nPI appelle cette route pour identifier la recherche et le message concernés, puis exposer le refus dans le suivi approprié.\n\n### Autorisations nécessaires\n\nSur le canal PI : certificat client mTLS de confiance, identité PI et signature XMLDSig vérifiées. Le destinataire AppHdr/To doit correspondre au participant. Un jeton Bearer client ne remplace pas ces contrôles. Une réception HTTP sans mTLS est une possibilité de recette uniquement si la configuration l’autorise ; les contrôles de signature et d’identité restent applicables. L’en-tête X-PI-Participant-Id est une aide de démonstration désactivable, pas une preuve d’identité.\n\n### Données à fournir\n\nLe corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.\n\n### Données retournées\n\n- 201 sans corps : message enregistré pour traitement.\n- Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie.\n- Date : date de la réponse HTTP.\n\n### Conditions et effets\n\nL’identité PI, la signature XMLDSig, le type de message et AppHdr/To sont contrôlés. Le 201 atteste la réception, pas l’achèvement du traitement métier ni un mouvement comptable définitif.\n\n### Erreurs et reprise\n\nLa réception est dédoublonnée par participant et BizMsgIdr avec vérification du contenu. Un même identifiant avec des octets différents est refusé ; le client métier ne doit pas utiliser cette route pour rejouer un paiement.\n\n- **400** : Message, corrélation ou type de message incompatible avec le chemin.\n\n- **403** : Certificat, identité PI, signature ou destination du message refusé.",
        "operationId": "inbound_1",
        "parameters": [
          {
            "description": "En-tête de démonstration pour le contrôle croisé du destinataire ; ne remplace ni le certificat PI ni la signature et peut être désactivé en production.",
            "in": "header",
            "name": "X-PI-Participant-Id",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/xml": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "Le corps est l’enveloppe XML signée portant un message admi.002. Utiliser le format approuvé du dépôt ; le portail ne fournit pas une commande client JSON pour fabriquer ce message.",
          "required": true
        },
        "responses": {
          "201": {
            "description": "201 sans corps : message enregistré pour traitement. Location : référence de réception dans l’Inbox ; ce n’est pas une route de lecture publique garantie. Date : date de la réponse HTTP."
          },
          "400": {
            "description": "Message, corrélation ou type de message incompatible avec le chemin."
          },
          "403": {
            "description": "Certificat, identité PI, signature ou destination du message refusé."
          }
        },
        "security": [],
        "summary": "Recevoir un rejet technique de vérification d’identité",
        "tags": [
          "Callbacks · Identité"
        ],
        "x-authorization": {
          "bearer": false,
          "messageSignature": "XMLDSig",
          "transport": "mTLS"
        }
      }
    }
  },
  "servers": [
    {
      "url": "http://localhost:8080",
      "description": "Cœur PI Connect — environnement configuré"
    }
  ],
  "tags": [
    {
      "name": "Transferts"
    },
    {
      "name": "Paiements de masse"
    },
    {
      "name": "Paiements programmés"
    },
    {
      "name": "Annulations et retours"
    },
    {
      "name": "Vérification d'identité"
    },
    {
      "name": "Alias"
    },
    {
      "name": "Demandes de paiement"
    },
    {
      "name": "QR codes"
    },
    {
      "name": "Participants"
    },
    {
      "name": "Relations"
    },
    {
      "name": "Règlements"
    },
    {
      "name": "Tarification"
    },
    {
      "name": "Supervision et disponibilité"
    },
    {
      "name": "Rapports SLA et disponibilité"
    },
    {
      "name": "Configuration des participants"
    },
    {
      "name": "Matrice des catégories"
    },
    {
      "name": "Certificats et révocation"
    },
    {
      "name": "Reprises CBS"
    },
    {
      "name": "Notifications et reprises"
    },
    {
      "name": "Provisionnement de démonstration"
    },
    {
      "name": "Callbacks · Transferts",
      "x-displayName": "Transferts"
    },
    {
      "name": "Callbacks · Identité",
      "x-displayName": "Identité"
    },
    {
      "name": "Callbacks · Demandes de paiement",
      "x-displayName": "Demandes de paiement"
    },
    {
      "name": "Callbacks · Notifications",
      "x-displayName": "Notifications"
    },
    {
      "name": "Callbacks · Participants",
      "x-displayName": "Participants"
    },
    {
      "name": "Callbacks · Relations",
      "x-displayName": "Relations"
    },
    {
      "name": "Callbacks · Règlements",
      "x-displayName": "Règlements"
    },
    {
      "name": "Business · Comptes",
      "x-displayName": "Comptes"
    },
    {
      "name": "Business · Alias",
      "x-displayName": "Alias"
    },
    {
      "name": "Business · Paiements",
      "x-displayName": "Paiements"
    },
    {
      "name": "Business · Demandes de paiement",
      "x-displayName": "Demandes de paiement"
    },
    {
      "name": "Business · Transactions",
      "x-displayName": "Transactions"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Domaines métier",
      "tags": [
        "Transferts",
        "Paiements de masse",
        "Paiements programmés",
        "Annulations et retours",
        "Vérification d'identité",
        "Alias",
        "Demandes de paiement",
        "QR codes",
        "Participants",
        "Relations",
        "Règlements",
        "Tarification"
      ]
    },
    {
      "name": "Exploitation",
      "tags": [
        "Supervision et disponibilité",
        "Rapports SLA et disponibilité",
        "Configuration des participants",
        "Matrice des catégories",
        "Certificats et révocation",
        "Reprises CBS",
        "Notifications et reprises",
        "Provisionnement de démonstration"
      ]
    },
    {
      "name": "Callbacks PI",
      "tags": [
        "Callbacks · Transferts",
        "Callbacks · Identité",
        "Callbacks · Demandes de paiement",
        "Callbacks · Notifications",
        "Callbacks · Participants",
        "Callbacks · Relations",
        "Callbacks · Règlements"
      ]
    },
    {
      "name": "Interne Business",
      "tags": [
        "Business · Comptes",
        "Business · Alias",
        "Business · Paiements",
        "Business · Demandes de paiement",
        "Business · Transactions"
      ]
    }
  ]
}
