A successful POST /payments
A 201 Created response is returned as a signed JWT (application/jwt). Verify the signature using the LFI's public signing key before reading the payload.
Response headers
| Header | Description |
|---|---|
Location | URL of the created payment resource — /open-finance/payment/v2.1/payments/{PaymentId} |
x-fapi-interaction-id | Echo of the interaction ID from the request |
x-idempotency-key | Echo of the idempotency key from the request |
Response body — Data
| Field | Required | Description |
|---|---|---|
PaymentId | Yes | LFI-assigned unique identifier for this payment resource (use this to poll for status) |
ConsentId | Yes | The consent this payment is bound to |
Status | Yes | Current payment status — see status lifecycle below |
StatusUpdateDateTime | Yes | ISO 8601 datetime of the last status change |
CreationDateTime | Yes | ISO 8601 datetime when the payment resource was created |
Instruction.Amount | Yes | Echoes back the amount and currency from the request |
PaymentPurposeCode | Yes | Echoes back the payment purpose code |
OpenFinanceBilling | Yes | Echoes back the billing parameters |
PaymentTransactionId | No | End-to-end transaction ID generated by the Aani payment rails once the payment is submitted for settlement. Not present at Pending. |
DebtorReference | No | Echoes back the debtor reference if provided |
RejectReasonCode | No | Array of { Code, Message } objects — present only when Status is Rejected |
Status lifecycle
| Status | Description |
|---|---|
Pending | The payment has been accepted by the LFI and queued for processing. This is the typical status immediately after creation. |
AcceptedSettlementCompleted | The debtor's account has been debited. |
AcceptedWithoutPosting | The receiving LFI has accepted the payment but has not yet credited the creditor account. |
AcceptedCreditSettlementCompleted | The creditor account has been credited. Payment is fully settled. |
Rejected | The payment was rejected. Inspect RejectReasonCode for the reason. |
Links
| Field | Description |
|---|---|
Self | URL to this payment resource — use for status polling |
Related | URL to the associated consent — /open-finance/v2.1/payment-consents/{ConsentId} |
Example response payload
The payload is the verified body of the signed JWT. Per AEPaymentIdResponseSigned, Data and Links are wrapped in a message envelope.
json
{
"message": {
"Data": {
"PaymentId": "83b47199-90c2-4c05-9ef1-aeae68b0fc7c",
"ConsentId": "b8f42378-10ac-46a1-8d20-4e020484216d",
"Status": "Pending",
"StatusUpdateDateTime": "2026-05-03T15:46:01+00:00",
"CreationDateTime": "2026-05-03T15:46:01+00:00",
"Instruction": {
"Amount": {
"Amount": "100.00",
"Currency": "AED"
}
},
"PaymentPurposeCode": "ACM",
"DebtorReference": "Invoice 1234",
"OpenFinanceBilling": {
"Type": "PushP2P"
}
},
"Links": {
"Self": "https://api.lfi.example/open-finance/payment/v2.1/payments/83b47199-90c2-4c05-9ef1-aeae68b0fc7c",
"Related": "https://api.lfi.example/open-finance/v2.1/payment-consents/b8f42378-10ac-46a1-8d20-4e020484216d"
}
}
}Store the PaymentId
Persist PaymentId immediately — it is required to poll GET /payments/{PaymentId} for status updates. A payment typically moves from Pending to a terminal status within seconds, but network conditions may require polling.
See the POST /payments API reference for the full request and response schema.
