Skip to main content

Handle Reservations

Last updated on Apr 10, 2026 at 10:35 PM

This section describes the Funds Reservation APIs used by ImPAI during instant payment processing.
Reservations ensure that sufficient funds are blocked before continuing the payment workflow, preventing overdrafts and race-conditions in high-speed processing scenarios.

The reservation module exposes two API endpoints:

  • Funds Reservation Request
    Creates or updates a liquidity block on the debtor account. The request is forwarded to the configured reservation engine (e.g., Core Banking System).

  • Reservation Release
    Releases a previously blocked reservation once the payment is completed, cancelled, or otherwise no longer requires reserved funds.

Both APIs follow a consistent structure and provide traceability through standardized header metadata.


1️⃣ Funds Reservation Request​

This endpoint is used to create a new reservation or update an existing one during the payment lifecycle.
It is typically invoked:

  • before initiating an SCT Inst payment
  • during internal pre-check flows
  • when re-validating liquidity for repeated attempts
  • during pre-authorization procedures

The service forwards the request to the external reservation engine and returns the resulting status, including the assigned reservation identifier.

Request Structure

❢ reservationRequest

The group reservationRequest defines the reservation parameters.

FieldTypeRequiredDescriptionConstraints
identifiers.reservationIdStringNoUsed when updating an existing reservationmax. 36 chars
identifiers.transactionIdStringYesId of the underlying transaction1-36 chars
account.accountIdStringYesDebtor account to reserve funds on1-34 chars
account.accountTypeStringYesType of the account identifierEnum:
IBAN
ACCOUNT_NUMBER
amount.valueNumberYesAmount to be blocked
amount.currencyStringYesISO-4217 currency code3 chars
agent.bicStringNoBank identification11 chars, BIC format
reservationTypeStringYesType of reservationEnum:
CREDIT
DEBIT

Example Request:

{
"reservationRequest": {
"identifiers": {
"transactionId": "PAI0500000123456"
},
"account": {
"accountId": "DE22123412341234",
"accountType": "IBAN"
},
"amount": {
"value": 250.00,
"currency": "EUR"
},
"reservationType": "DEBIT"
}
}
Response Structure
🟒 Success β€” HTTP 200
{
"header": {
"responseId": "0a00f05f-c688-44db-b49a-af9aeed1a7ef",
"originalRequestId": "ReqId-419578",
"responseTime": "2025-05-30T10:45:31.002Z"
},
"reservationResponse": {
"status": "Reserved",
"reservationId": "RSV12345678",
"reservationType": "DEBIT",
"balanceDetails": {
"coreBalance": 1234.56,
"holdBalance": 250.00,
"availableBalance": 984.56,
"lastUpdatedAt": "2025-05-30T10:45:31.001Z"
}
}
}
πŸ”΄ Error β€” HTTP 400
{
"header": {
"responseId": "0a00f05f-c688-44db-b49a-af9aeed1a7ef",
"originalRequestId": "ReqId-419578",
"responseTime": "2025-05-30T10:45:31.002Z"
},
"reservationResponse": {
"status": "Failed",
"message": "The reservation request cannot be fulfilled.",
"errors": [
{
"code": "amount",
"message": "Requested amount exceeds available balance."
}
]
}
}
🟑 Error β€” HTTP 500

Responses for HTTP 500 β€” Server Error errors are returned on unexpected server-side failures and contain:

GroupDescription
errorCodeApplication-level error identifier (e.g. 500_INTERNAL_ERROR)
messageBrief description such as "Time-out" or "Something went wrong"

Example:

{
"errorCode": "500_INTERNAL_ERROR",
"message": "Something went wrong"
}
POST/api/sbl/v1/reservation/createCreate a new Funds Reservation

2️⃣ Reservation Release​

This endpoint releases a previously created reservation. A release is triggered when:

  • the payment is successfully executed (final settlement),
  • the payment is cancelled or rejected,
  • the reservation expires,
  • the orchestration layer determines that the reservation is no longer required.

The service notifies the reservation engine and returns the release status.

Request Structure

The request payload for releasing a reservation is structured into the following components:

❢  header (common metadata)

FieldTypeRequiredDescriptionConstraints
requestIdStringYesUnique client-side request identifier1-36 chars
entityIdStringNoProcessing entity (bank, branch, or tenant)max.36 chars
userIdStringNoUser or service initiating the requestmax. 36 chars
sourceSysStringYesOrigin of the request (channel, orchestration component, etc.)1-35 chars
clientIdStringYesApplication/client identifier1-36 chars
clientIPStringNoSource IP address
creationTimeStringYesRequest creation timestamp

❷  identifiers

The identifiers section provides references to previously created funds reservations and links the release request to the original reservation:

FieldTypeRequiredDescriptionConstraints
reservationIdStringYesReservation identifier to release1-35 chars

Example Request:

{
"header": {
"requestId": "ReqId-419578",
"entityId": "Im-Par",
"userId": "user123",
"sourceSys": "OnlineBanking",
"clientId": "1234",
"clientIP": "192.168.0.1",
"creationTime": "2025-06-02T14:15:22Z",
},
"identifiers": {
"reservationId": "RSV12345678"
}
}
Response Structure
🟒 Success β€” HTTP 200

HTTP 200 – OK responses for successfully processed messages include:

GroupDescription
headerA group containing responseId, originalRequestId, responseTime
bodyAn object with detailed information like the new status and the reservationId of the underlying reservation.

Example:

{
"header": {
"responseId": "0a00f05f-c688-44db-b49a-af9aeed1a7ef",
"originalRequestId": "ReqId-419578",
"responseTime": "2025-05-30T10:45:31.002Z"
},
"body": {
"status": "Success",
"reservationId": "RSV12345678",
"message": "Funds released"
}
}
πŸ”΄ Error β€” HTTP 400
{
"header": {
"responseId": "0a00f05f-c688-44db-b49a-af9aeed1a7ef",
"originalRequestId": "ReqId-419578",
"responseTime": "2025-05-30T10:45:31.002Z"
},
"body": {
"status": "Failed",
"reservationId": "RSV12345678",
"message": "Reservation not found or already released.",
"errors": [
{
"code": "reservationId",
"message": "Not found or invalid."
}
]
}
}
🟑 Error β€” HTTP 500

Responses for HTTP 500 β€” Server Error errors are returned on unexpected server-side failures and contain:

GroupDescription
errorCodeApplication-level error identifier (e.g. 500_INTERNAL_ERROR)
messageBrief description such as "Time-out" or "Something went wrong"

Example:

{
"errorCode": "500_INTERNAL_ERROR",
"message": "Something went wrong"
}
POST/api/sbl/v1/reservation/releaseRelease a previous Funds Reservation

Summary β€” Handling Reservations​

This page explains how to create and release fund reservations in ImPAI. Reservations ensure that sufficient liquidity is blocked before processing a payment or workflow step.

The system exposes two reservation operations:

  • Create / Update Reservation β€” blocks a specific amount on an account and returns a reservationId maintained by the external reservation engine.

  • Release Reservation β€” frees a previously created reservation when the payment is completed, cancelled, or no longer requires blocked funds.

Each Reservation operation:

  • uses standard ImPAI metadata headers,
  • communicates asynchronously with the external reservation engine,
  • returns technical identifiers and status information,
  • and provides consistent success and error response structures.