Lean Technologies Account On File API
The Account On File API from Lean Technologies — 2 operation(s) for account on file.
The Account On File API from Lean Technologies — 2 operation(s) for account on file.
openapi: 3.1.0
info:
title: Consents Account Controls (New) Account Controls (New) Account On File API
version: v0.2.3
servers:
- url: https://sandbox.leantech.me
description: Sandbox
- url: https://api2.leantech.me
description: Production
security:
- bearerAuth: []
tags:
- name: Account On File
paths:
/consents/account-on-file:
post:
summary: Create a new non-authorized AoF consent
description: This operation will result in creation of non-authorized consent of Account-On-File type.
operationId: createAccountOnFileConsent
tags:
- Account On File
security:
- OAuth2:
- api
requestBody:
content:
application/json:
schema:
type: object
required:
- customer_id
- destination_account_id
- currency
- reference
- purpose
- control_parameters
properties:
customer_id:
type: string
format: uuid
description: The unique identifier of the customer for whom the consent is being created.
example: acc176ca-7716-4fbb-a735-d0e3dec24b40
destination_account_id:
type: string
format: uuid
description: The unique identifier of the account acting as a consent beneficiary.
example: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
currency:
$ref: '#/components/schemas/Currency'
reference:
$ref: '#/components/schemas/Reference'
purpose:
$ref: '#/components/schemas/PaymentPurposeCode'
control_parameters:
$ref: '#/components/schemas/AccountOnFileControlParameters'
government_identifier:
description: "Unique government identifier of the customer making the payment. \nAs required by the UAE Open Finance standard, it ensures the debtor can be uniquely recognized.\nThis field supports providing or updating the identifier on-the-fly when creating a consent."
allOf:
- $ref: '#/components/schemas/GovernmentIdentifierRequest'
start_date_time:
type: string
format: date-time
nullable: true
example: '2025-07-11T16:58:03.559872Z'
description: "The date and time when the consent becomes active. \n**Optional.** Defaults to the current date and time if not provided.\n"
expiration_date_time:
type: string
format: date-time
nullable: true
example: '2026-07-11T16:58:03.559872Z'
description: "The date and time when the consent expires. \n**Optional.** Defaults to one year after `start_date_time` if not provided.\n"
examples:
minimal:
summary: Minimal Request
description: The minimum required fields to create a new Account On File consent.
value:
customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
destination_account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
currency: AED
reference: ACME-ACCOUNT-LINK-2025-001
purpose: GDS
control_parameters:
period_type: Day
max_individual_amount: '1000.00'
complete:
summary: Complete Request
description: The complete set of fields to create a new Account On File consent.
value:
customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
destination_account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
currency: AED
reference: ACME-ACCOUNT-LINK-2025-001
purpose: GDS
control_parameters:
period_type: Day
max_individual_amount: '1000.00'
max_cumulative_amount: '10000.00'
max_cumulative_number_of_payments: 100
max_cumulative_amount_per_period: '3000.00'
max_cumulative_number_of_payments_per_period: 10
government_identifier:
type: EMIRATES_ID
value: 784-1234-1234-1234
start_date_time: '2025-12-01T12:00:00.559872Z'
expiration_date_time: '2026-12-10T16:00:00.559872Z'
description: Request to create a new Account on File consent
required: true
responses:
'200':
description: Consent created successfully
content:
application/json:
schema:
type: object
required:
- id
- application_id
- start_date_time
- expiration_date_time
- customer_id
- status
- destination_account_id
- reference
- currency
- payment_purpose
- control_parameters
properties:
id:
type: string
format: uuid
description: The unique identifier for the consent. Provided as a UUID.
application_id:
type: string
description: Application identifier owning this consent
start_date_time:
type: string
format: date-time
description: Date and time from when the consent will be active
expiration_date_time:
type: string
format: date-time
description: Date and time of the expiration of this consent
customer_id:
type: string
format: uuid
description: Id of a customer that this consent belongs to
status:
type: string
enum:
- AWAITING_AUTHORISATION
- AUTHORISED
- REVOKED
- REJECTED
- EXPIRED
- CONSUMED
- SUSPENDED
description: Current status of this consent.
destination_account_id:
type: string
format: uuid
description: Account id that this consent allows payments to
reference:
type: string
description: A reason or reference in relation to a payment. Passed as a part of OF `creditor_reference`. This value will be used as default reference for payments made with this consent.
currency:
$ref: '#/components/schemas/Currency'
purpose:
$ref: '#/components/schemas/PaymentPurposeCode'
control_parameters:
$ref: '#/components/schemas/AccountOnFileControlParameters'
examples:
minimal:
summary: Minimal Response
value:
id: 123e4567-e89b-12d3-a456-426655440000
status: AWAITING_AUTHORISATION
customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
destination_account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
currency: AED
reference: ACME-ACCOUNT-LINK-2025-001
purpose: GDS
control_parameters:
period_type: Day
max_individual_amount: '1000.00'
complete:
summary: Complete Response
value:
id: 123e4567-e89b-12d3-a456-426655440000
status: AWAITING_AUTHORISATION
customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
destination_account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
currency: AED
reference: ACME-ACCOUNT-LINK-2025-001
purpose: GDS
start_date_time: '2025-07-11T16:58:03.559872Z'
expiration_date_time: '2026-07-11T16:58:03.559872Z'
control_parameters:
period_type: Day
max_individual_amount: '1000.00'
max_cumulative_amount: '10000.00'
max_cumulative_number_of_payments: 100
max_cumulative_amount_per_period: '3000.00'
max_cumulative_number_of_payments_per_period: 10
/payments/account-on-file:
post:
summary: Initiate a AoF payment
description: Endpoint responsible for initiating a AoF payment against an existing, authorized consent
tags:
- Account On File
security:
- OAuth2:
- api
parameters:
- name: Idempotency-Key
in: header
required: true
description: 'Unique key used to ensure idempotency of requests.
Must be unique per operation.
'
schema:
type: string
requestBody:
content:
application/json:
schema:
description: Request to initiate a new account on file payment
type: object
required:
- consent_id
- amount
- risk_details
properties:
consent_id:
type: string
format: uuid
description: An id of an authorized consent that should be used to authorize this payment
amount:
type: number
format: double
description: The amount to be paid.
purpose:
$ref: '#/components/schemas/PaymentPurposeCode'
risk_details:
allOf:
- $ref: '#/components/schemas/RiskDetails'
reference:
type: string
nullable: true
description: The reference submitted to the bank as a reference when initiating a payment. Can be used for reconciliation.
example:
consent_id: 123e4567-e89b-12d3-a456-426655440000
amount: 130.52
purpose: GDS
reference: INV-2025-004321
risk_details:
transaction_indicators:
channel: WEB
debtor_indicators:
geo_location:
latitude: 25.2048
longitude: 55.2708
responses:
'200':
description: "Indicates that request was processed and payment initiation request was sent to the bank. \nThis does not mean that the payment was successful!"
content:
application/json:
schema:
$ref: '#/components/schemas/Payments20InitiateAccountOnFilePaymentResponse'
examples:
minimal:
summary: Minimal Response
value:
id: 341c3308-408d-48d9-ae44-c98eb1aa9a6f
account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
application_id: 21ecf613-adaa-4c6b-8cd5-827de43bbe52
consent_id: 123e4567-e89b-12d3-a456-426655440000
status: CREATED
reference: ACME-ACCOUNT-LINK-2025-001
amount:
currency: AED
value: 130.52
type: ACCOUNT_ON_FILE
sender_customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
complete:
summary: Complete Response
value:
id: 341c3308-408d-48d9-ae44-c98eb1aa9a6f
account_id: 911f30d8-8fc8-4fe9-86a1-3f9fea11a674
application_id: 21ecf613-adaa-4c6b-8cd5-827de43bbe52
consent_id: 123e4567-e89b-12d3-a456-426655440000
status: FAILED
reference: ACME-ACCOUNT-LINK-2025-001
amount:
currency: AED
value: 130.52
type: ACCOUNT_ON_FILE
sender_customer_id: acc176ca-7716-4fbb-a735-d0e3dec24b40
failure_details:
code: BANK_ISSUE
details: The banks is having a technical issues. Please try again later.
components:
schemas:
AppInformation:
title: AppInformation
type: object
description: Mobile application specific information.
properties:
app_version:
type: string
description: Version of the mobile application.
package_name:
type: string
description: Application package identifier.
build_number:
type: string
description: Application build number.
PeriodType:
type: string
title: PeriodType
description: "Defines the time period used for applying limits on a long‑lived consent. \nThis value determines how consumption limits (e.g., maximum amounts or number of payments) are calculated within each period.\n\n**Supported values:**\n- `Day` – A single calendar day (00:00 to 23:59).\n- `Week` – Seven consecutive days.\n- `Month` – A full calendar month (from the 1st to the last day).\n- `Year` – A full calendar year (12 consecutive months)."
enum:
- Day
- Week
- Month
- Year
ScreenInformation:
title: ScreenInformation
type: object
properties:
pixel_density:
type: number
format: double
orientation:
type: string
enum:
- PORTRAIT
- LANDSCAPE
AccountRiskIndicators:
title: AccountRiskIndicators
description: Risk indicators related to the account.
type: object
properties:
user_onboarding_date_time:
type: string
format: date-time
description: The exact date and time when the User account was activated.
last_account_change_date:
type: string
description: Date that the User's account was last changed.
last_password_change_date:
type: string
description: Date of the last password change by the User.
suspicious_activity:
type: string
enum:
- NO_SUSPICIOUS_ACTIVITY
- SUSPICIOUS_ACTIVITY_DETECTED
transaction_history:
$ref: '#/components/schemas/TransactionHistory'
PossessionFactor:
title: PossessionFactor
description: The User's possession, that only the User possesses
type: object
properties:
is_used:
type: boolean
type:
type: string
enum:
- FIDO2_SECURITY_KEY
- PASSKEY
- OTP_DEVICE
- OTP_APP
- SMS_OTP
- EMAIL_OTP
- PUSH_NOTIFICATION
- WEBAUTHN_TOKEN
- SECURE_ENCLAVE_KEY
- HARDWARE_OTP_KEY
- TRUSTED_DEVICE
- OTHER
Currency:
type: string
pattern: ^[A-Z]{3}$
description: The ISO 3 letter currency code.
example: AED
GeoLocation:
title: GeoLocation
description: GPS to identify and track the whereabouts of the connected electronic device.
type: object
properties:
latitude:
type: number
format: double
longitude:
type: number
format: double
TransactionHistory:
title: TransactionHistory
type: object
properties:
last_day:
type: integer
description: Total transactions made by the account in the last 24 hours.
last_year:
type: integer
description: Total transactions made by the account in the past year.
ChannelType:
type: string
description: Where the payment has been initiated from
enum:
- WEB
- MOBILE
TransactionIndicators:
title: TransactionIndicators
type: object
required:
- channel
properties:
is_customer_present:
type: boolean
description: This field differentiates between automatic and manual initiation.
is_contract_present:
type: boolean
description: Indicates if the Creditor has a contractual relationship.
channel:
$ref: '#/components/schemas/ChannelType'
channel_type:
description: The channel through which the transaction is being conducted.
type: string
enum:
- ECOMMERCE
- IN_STORE
- IN_APP
- TELEPHONE
- MAIL
- RECURRING_PAYMENT
- OTHER
sub_channel_type:
description: More specific classification of the transaction channel.
type: string
enum:
- WEB_BROWSER
- MOBILE_APP
- SMART_TV
- WEARABLE_DEVICE
- POS_TERMINAL
- ATM
- KIOSK_TERMINAL
- OTHER
merchant_risk:
$ref: '#/components/schemas/MerchantRisk'
supplementary_data:
type: object
description: Additional information that cannot be captured in the structured fields and/or any other specific block.
DeviceType:
type: string
title: DeviceType
enum:
- MOBILE
- DESKTOP
- TABLET
- WEARABLE
- OTHER
AccountOnFileControlParameters:
title: AccountOnFileControlParameters
description: "Defines the control parameters for a Account On File (AoF) consent. \nThese parameters specify the applicable limits for individual payments, cumulative amounts, and the number of payments allowed within a defined period or across the consent's lifetime.\nAt least one of `max_individual_amount`, `max_cumulative_amount`, or `max_cumulative_number_of_payments` must be provided."
type: object
required:
- period_type
properties:
period_type:
$ref: '#/components/schemas/PeriodType'
max_individual_amount:
type: number
description: Maximum amount allowed for a single payment
minimum: 0.01
max_cumulative_amount:
type: number
description: Maximum cumulative amount allowed across all payments
minimum: 0.01
max_cumulative_number_of_payments:
type: integer
description: Maximum number of payments allowed in total
minimum: 1
max_cumulative_amount_per_period:
type: number
description: Maximum cumulative amount allowed per period
minimum: 0.01
max_cumulative_number_of_payments_per_period:
type: integer
description: Maximum number of payments allowed per period
minimum: 1
ConnectionType:
type: string
title: ConnectionType
enum:
- WIFI
- CELLULAR
- OTHER
DebtorIndicators:
title: DebtorIndicators
type: object
description: Debtor (User) Indicators
properties:
authentication:
$ref: '#/components/schemas/Authentication'
user_name:
$ref: '#/components/schemas/Name'
geo_location:
$ref: '#/components/schemas/GeoLocation'
device_information:
$ref: '#/components/schemas/DeviceInformation'
biometric_capabilities:
$ref: '#/components/schemas/BiometricCapabilities'
app_information:
$ref: '#/components/schemas/AppInformation'
browser_information:
$ref: '#/components/schemas/BrowserInformation'
user_behavior:
$ref: '#/components/schemas/UserBehavior'
account_risk_indicators:
$ref: '#/components/schemas/AccountRiskIndicators'
supplementary_data:
type: object
description: Additional information that cannot be captured in the structured fields and/or any other specific block. This may include information that is not available in the structured fields, such as a user's behavioural data like their typing speed and typing patterns.
ReorderItemsIndicator:
type: string
title: ReorderItemsIndicator
description: Indicates if the transaction is a reorder
enum:
- FIRST_TIME_ORDER
- REORDER
Authentication:
title: Authentication
description: The authentication method used by the User to access their account
type: object
properties:
authentication_channel:
$ref: '#/components/schemas/ChannelType'
possession_factor:
$ref: '#/components/schemas/PossessionFactor'
knowledge_factor:
$ref: '#/components/schemas/KnowledgeFactor'
inherence_factor:
$ref: '#/components/schemas/InherenceFactor'
challenge_outcome:
type: string
enum:
- PASS
- FAIL
- NOT_PERFORMED
authentication_flow:
type: string
enum:
- MFA
- OTHER
authentication_value:
type: string
description: Cryptographic proof of authentication where supported by the device and protocol.
challenge_date_time:
type: string
format: date-time
Reference:
title: Reference
description: A reason or reference in relation to a payment. Maximum 64 chars
type: string
maxLength: 64
example: 'Invoice #12345'
DeliveryTimeframe:
type: string
title: DeliveryTimeframe
description: Timeframe for the delivery of purchased items
enum:
- ELECTRONIC_DELIVERY
- SAME_DAY_SHIPPING
- OVERNIGHT_SHIPPING
- MORE_THAN_1_DAY_SHIPPING
CurrencyAmount:
type: object
properties:
currency:
$ref: '#/components/schemas/Currency'
amount:
type: number
required:
- currency
- amount
BatteryStatus:
title: BatteryStatus
type: object
properties:
level:
type: number
format: double
is_charging:
type: boolean
RiskDetails:
title: RiskDetails
type: object
description: The Risk section is used to specify additional details for risk/fraud scoring regarding Payments
properties:
debtor_indicators:
$ref: '#/components/schemas/DebtorIndicators'
destination_delivery_address:
$ref: '#/components/schemas/DestinationDeliveryAddress'
transaction_indicators:
$ref: '#/components/schemas/TransactionIndicators'
Payments20InitiateAccountOnFilePaymentResponse:
type: object
required:
- id
- account_id
- application_id
- consent_id
- status
- amount
- sender_customer_id
- created_at
- last_modified_at
- type
properties:
id:
type: string
format: uuid
description: The unique identifier for the payment.
account_id:
type: string
format: uuid
description: The account id that the payment is being made to.
application_id:
type: string
format: uuid
description: The application id that the payment is being made to.
consent_id:
type: string
format: uuid
description: The consent id that the payment is being made under.
status:
type: string
description: "Reflects the latest known state of processing in Lean’s systems and bank.\n\n**Possible values:**\n\n- **`CREATED`** — \n An internal transaction record has been created, but **no interaction with the bank has occurred yet**. \n This includes any validation steps required before initiation. \n Detailed progress within the approval flow may be represented through *sub-statuses*.\n\n- **`PROCESSING`** — \n The transaction has been **submitted or is being attempted at the bank**. \n Multiple initiation attempts may occur under this state. \n More granular progress can be indicated by *sub-statuses*.\n\n- **`PROCESSED`** — \n The **final successful** state. \n The payment has been confirmed as completed by the payment status tracking process.\n Sub-statuses or other technology-specific codes may appear to indicate settlement details.\n\n- **`FAILED`** — \n The **final unsuccessful** state. \n Failure may occur:\n - before any bank initiation (e.g. validation issues),\n - after repeated unsuccessful initiation attempts (e.g. bank unavailable, other technical issues), or\n - even after an initially successful initiation followed by a **reversal detected by payment status tracking** before final reporting.\n---\n**Notes:**\n- `CREATED` and `PROCESSING` are transitional states. \n- `PROCESSED` and `FAILED` are terminal states. \n- Sub-statuses provide additional context.\n"
enum:
- CREATED
- PROCESSING
- PROCESSED
- FAILED
sub_status:
type: string
description: 'Provides additional detail about the current lifecycle stage of the payment.
It can represent intermediate workflow steps, bank-specific responses or system conditions that further qualify the main status.'
reference:
type: string
description: A reason or reference in relation to a payment. Passed as a part of OF `creditor_reference`. This value will be used as default reference for payments made with this consent.
amount:
$ref: '#/components/schemas/CurrencyAmount'
type:
type: string
enum:
- ACCOUNT_ON_FILE
sender_customer_id:
type: string
format: uuid
description: The customer id of the sender.
created_at:
type: string
format: date-time
description: The date and time when the payment was created.
last_modified_at:
type: string
format: date-time
description: The date and time when the payment was last modified.
failure_details:
type: object
properties:
code:
type: string
description: The error code.
details:
type: string
description: The error details.
ScrollBehavior:
title: ScrollBehavior
type: object
properties:
direction:
type: string
enum:
- UP
- DOWN
- BOTH
speed:
description: Average scroll speed in pixels per second.
type: number
format: double
frequency:
description: Number of scroll events per minute
type: number
format: double
PreOrderPurchaseIndicator:
type: string
title: PreOrderPurchaseIndicator
description: Indicates if this is a pre-ordered item
enum:
- MERCHANDISE_AVAILABLE
- FUTURE_AVAILABILITY
BrowserInformation:
title: BrowserInformation
type: object
description: Browser-specific information
properties:
user_agent:
description: Complete browser user agent string
type: string
is_cookies_enabled:
description: Whether cookies are enabled in the browser.
type: boolean
available_fonts:
description: List of available fonts.
type: array
items:
type: string
plugins:
description: List of installed browser plugins.
type: array
items:
type: string
pixel_ratio:
description: Device pixel ratio for scaling.
type: number
format: double
InherenceType:
type: string
title: InherenceType
enum:
- BIOMETRIC
- FINGERPRINT
- FACE_RECOGNITION
- IRIS_SCAN
- VOICE_RECOGNITION
- FIDO_BIOMETRIC
- DEVICE_BIOMETRICS
- OTHER
DestinationDeliveryAddress:
title: DestinationDeliveryAddress
type: object
properties:
recipient_type:
type: string
enum:
- INDIVIDUAL
- CORPORATE
recipient_name:
$ref: '#/components/schemas/Name'
national_address:
type: array
items:
$ref: '#/components/schemas/Address'
DeviceManufacturer:
title: DeviceManufacturer
type: object
properties:
model:
type: string
manufacturer:
type: string
PaymentPurposeCode:
type: string
title: PaymentPurposeCode
description: "A category code that relates to the type of services or goods that corresponds to the underlying purpose of the payment. \nThe code must conform to the payment purpose code list. \n**Supported values:** \n- `FIS` – Financial services\n- `TCS` – Telecommunication services\n- `MWP` – Mobile wallet card payments\n- `OAT` – Own account transfer\n- `IFS` – Information services\n- `RNT` – Rent payments\n- `LNC` – Loan charges\n- `PIN` – Personal investments\n- `GDS` – Goods bought or sold"
enum:
- FIS
- TCS
- MWP
- OAT
- IFS
- RNT
- LNC
- PIN
- GDS
DeviceEnvironmentContext:
type: string
enum:
- VPN_DETECTED
- EMULATOR_DETECTED
TouchSupport:
title: TouchSupport
type: object
properties:
supported:
type: boolean
max_touch_points:
type: integer
BiometricType:
type: string
title: BiometricType
enum:
- FINGERPRINT
- FACIAL_RECOGNITION
- IRIS
- VOICE_PRINT
- OTHER
Name:
type: object
properties:
en:
type: string
ar:
type: string
MotionSensors:
title: MotionSensors
type: object
properties:
status:
type: string
enum:
- IN_MOTION
- STATIONARY
accelerometer:
type: boolean
gyroscope:
type: boolean
BiometricCapabilities:
title: BiometricCapabilities
properties:
supports_biometric:
type: boolean
biometric_types:
type: array
items:
$ref: '#/components/schemas/BiometricType'
AddressMatchLevel:
type: string
title: AddressMatchLevel
description: Level of match between delivery and billing addresses
enum:
- FULL_MATCH
- PARTIAL_MATCH
- NO_MATCH
- NOT_APPLICABLE
UserBehavior:
title: UserBehavior
type: object
properties:
scroll_behavior:
$ref: '#/components/schemas/ScrollBehavior'
MerchantRisk:
title: MerchantRisk
type: object
required:
- delivery_timeframe
- reorder_items_indicator
- pre_order_purchase_indicator
- is_gift_card_purchase
- is_deliver_address_matching_billing
- address_match_level
properties:
delivery_timeframe:
$ref: '#/components/schemas/DeliveryTimeframe'
reorder_items_indicator:
$ref: '#/components/schemas/ReorderItemsIndicator'
pre_order_purchase_indicator:
$ref: '#/components/schemas/PreOrderPurchaseIndicator'
is_gift_card_purchase:
type: boolean
description: Indicates if the transaction includes a gift card
is_delivery_address_matching_billing:
type: boolean
description: Indicates if delivery address matches billing address
address_match_level:
$ref: '#/components/schemas/AddressMatchLevel'
KnowledgeFactor:
title: KnowledgeFactor
description: The User's knowledge, that only the User knows
type: object
properties:
is_used:
type: boolean
type:
ty
# --- truncated at 32 KB (35 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lean-technologies/refs/heads/main/openapi/lean-technologies-account-on-file-api-openapi.yml