Skip to content

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

HeaderDescription
LocationURL of the created payment resource — /open-finance/payment/v2.1/payments/{PaymentId}
x-fapi-interaction-idEcho of the interaction ID from the request
x-idempotency-keyEcho of the idempotency key from the request

Response body — Data

FieldRequiredDescription
PaymentIdYesLFI-assigned unique identifier for this payment resource (use this to poll for status)
ConsentIdYesThe consent this payment is bound to
StatusYesCurrent payment status — see status lifecycle below
StatusUpdateDateTimeYesISO 8601 datetime of the last status change
CreationDateTimeYesISO 8601 datetime when the payment resource was created
Instruction.AmountYesEchoes back the amount and currency from the request
PaymentPurposeCodeYesEchoes back the payment purpose code
OpenFinanceBillingYesEchoes back the billing parameters
PaymentTransactionIdNoEnd-to-end transaction ID generated by the Aani payment rails once the payment is submitted for settlement. Not present at Pending.
DebtorReferenceNoEchoes back the debtor reference if provided
RejectReasonCodeNoArray of { Code, Message } objects — present only when Status is Rejected

Status lifecycle

StatusDescription
PendingThe payment has been accepted by the LFI and queued for processing. This is the typical status immediately after creation.
AcceptedSettlementCompletedThe debtor's account has been debited.
AcceptedWithoutPostingThe receiving LFI has accepted the payment but has not yet credited the creditor account.
AcceptedCreditSettlementCompletedThe creditor account has been credited. Payment is fully settled.
RejectedThe payment was rejected. Inspect RejectReasonCode for the reason.
FieldDescription
SelfURL to this payment resource — use for status polling
RelatedURL 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.