Learn · Understand · Build

Emirates ID on Long-Lived Payments — Sending It as a TPP, Checking It as an LFI

CategoryPaymentsRead6 minUpdated4 Nov 2026

A long-lived payment consent is authorized once and then pays many times. From v2.2, the TPP sends a retail User's Emirates ID in Risk.DebtorIndicators.EmiratesId on every POST /payments under such a consent, so the LFI can confirm that each payment is being made for the same User who authorized the consent.

PaymentsEmirates IDRisk
01 What it is

One identifier, on every payment

A Single Instant Payment consent is authorized and used once. Every other payment consent is long-lived: the User authorizes it at the LFI once, and the TPP then initiates payments under it for weeks or months, often with the User not present. Each of those later payments reaches the LFI with no authentication of its own — only the consent it was made under.

v2.1 identifies the User initiating a payment in Risk.DebtorIndicators only by name. v2.2 adds EmiratesId (changelog §21), and for long-lived consents the TPP requirements make it mandatory for retail Users. The LFI compares it with the Emirates ID it holds for the PSU behind the consent.

WhoWhatWhen
TPPCaptures the retail User's Emirates IDBefore the first payment under the consent
TPPSends it in Risk.DebtorIndicators.EmiratesId inside the encrypted PIIEvery POST /payments under a long-lived consent
LFICompares it with the Emirates ID held for the PSUOn receiving POST /payments at its Ozone Connect endpoint
Only the LFI reads it

Risk is part of the payment PII, which the TPP signs and encrypts to the LFI. The API Hub passes it through without decrypting it, so the Emirates ID is never held centrally. See Payment PII Encryption.

02 Long-lived consents

Every payment type except Single Instant Payment

The requirement applies to the seven multi-payment types. An LFI can tell them apart from a Single Instant Payment consent by its ControlParameters:

Payment typeIdentified on the consent byTPP requirements
Fixed Defined ScheduleConsentSchedule.MultiPaymentPayment Initiation
Fixed Periodic ScheduleConsentSchedule.MultiPaymentPayment Initiation
Fixed On DemandConsentSchedule.MultiPaymentPayment Initiation
Variable Defined ScheduleConsentSchedule.MultiPaymentPayment Initiation
Variable Periodic ScheduleConsentSchedule.MultiPaymentPayment Initiation
Variable On DemandConsentSchedule.MultiPaymentPayment Initiation
Delegated SCAIsDelegatedAuthentication: true, with an empty ConsentSchedulePayment Initiation

A Single Instant Payment consent carries ConsentSchedule.SinglePayment instead, and is out of scope.

03 For TPPs

Capture it, then send it on every payment

  • For a retail User, the TPP MUST capture the User's Emirates ID before initiating payments under a long-lived consent.
  • The TPP MUST send it in Risk.DebtorIndicators.EmiratesId in the PII of every POST /payments under that consent — not only the first.
  • The value must match ^784-?[0-9]{4}-?[0-9]{7}-?[0-9]{1}$: the 15 digits of the Emirates ID, with or without hyphens.
PII — Risk (excerpt)json
{
  "Risk": {
    "DebtorIndicators": {
      "EmiratesId": "784-1990-1234567-1",
      "Authentication": { "...": "..." },
      "...": "..."
    },
    "TransactionIndicators": { "...": "..." },
    "CreditorIndicators": { "...": "..." }
  }
}

The rule is listed in the Payment Initiation requirements of each multi-payment type (linked above), and the field is described on the Risk page.

A missing Emirates ID can fail the payment

An LFI that checks the Emirates ID rejects a payment under a long-lived consent that does not carry one, as well as one that carries the wrong one. Both come back as 400 Consent.BusinessRuleViolation — see For LFIs.

04 For LFIs

Compare it with the PSU behind the consent

When your Ozone Connect POST/payments endpoint receives a payment, you can check the Emirates ID as part of validating the PII:

StepWhat to do
1Identify the consent from o3-consent-id and check that it is long-lived — it does not carry ConsentSchedule.SinglePayment.
2Identify the customer from o3-psu-identifier — the reference your LFI patched onto the consent when the User authorized it — and check that the customer is retail.
3Read Risk.DebtorIndicators.EmiratesId from the decrypted payment-time PII.
4Compare it with the Emirates ID you hold for that customer, ignoring hyphens.
typescript
// The pattern makes the hyphens optional, so 784-1990-1234567-1 and
// 784199012345671 are the same Emirates ID. Compare the digits only.
const digits = (id: string) => id.replace(/-/g, '')

// Single Instant Payment is the only consent that carries
// ControlParameters.ConsentSchedule.SinglePayment; every other payment
// consent is long-lived.
const isLongLived = (consent: PaymentConsent) =>
  !consent.ControlParameters.ConsentSchedule?.SinglePayment

function checkEmiratesId(
  consent: PaymentConsent,   // the consent identified by o3-consent-id
  customer: Customer,        // resolved from o3-psu-identifier
  pii: PaymentPII,           // the decrypted payment-time PII
): ErrorResponse | null {
  if (!isLongLived(consent) || customer.type !== 'Retail') return null

  const sent = pii.Risk?.DebtorIndicators?.EmiratesId
  if (!sent) {
    return {
      errorCode: 'Consent.BusinessRuleViolation',
      errorMessage: 'Validation failed for AEPaymentPII: risk.debtorIndicators.emiratesID is required for a long-lived payment consent',
    }
  }
  if (digits(sent) !== digits(customer.emiratesId)) {
    return {
      errorCode: 'Consent.BusinessRuleViolation',
      errorMessage: 'Validation failed for AEPaymentPII: risk.debtorIndicators.emiratesID does not match the PSU ID',
    }
  }
  return null
}

Error responses

Reject the payment with 400 and Consent.BusinessRuleViolation:

ConditionerrorCodeerrorMessage
EmiratesId is absentConsent.BusinessRuleViolationValidation failed for AEPaymentPII: risk.debtorIndicators.emiratesID is required for a long-lived payment consent
EmiratesId does not match the PSUConsent.BusinessRuleViolationValidation failed for AEPaymentPII: risk.debtorIndicators.emiratesID does not match the PSU ID
400 — Emirates ID missingjson
{
  "errorCode": "Consent.BusinessRuleViolation",
  "errorMessage": "Validation failed for AEPaymentPII: risk.debtorIndicators.emiratesID is required for a long-lived payment consent"
}
400 — Emirates ID does not matchjson
{
  "errorCode": "Consent.BusinessRuleViolation",
  "errorMessage": "Validation failed for AEPaymentPII: risk.debtorIndicators.emiratesID does not match the PSU ID"
}
Retail customers only

The check applies to retail customers. The requirement on the TPP covers retail Users only, so a payment for a business customer may arrive without an Emirates ID and is not rejected for it.