{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/revolut/main/json-schema/revolut-order-v7-schema.json", "title": "Order v7", "description": "To process the order from a credit or debit card, you create an `Order` object. You can then retrieve, capture, cancel, refund, or pay an order using its unique `id`. Alternatively, you can use its unique `token` to process a card payment with the Revolut Checkout Widget.", "x-generated": "2026-10-12", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/revolut-orders-api-openapi.yml#/components/schemas/Order-v7", "type": "object", "properties": { "id": { "$ref": "#/$defs/Order-Id" }, "token": { "$ref": "#/$defs/Order-Token" }, "type": { "$ref": "#/$defs/Order-Type-v2" }, "state": { "$ref": "#/$defs/Order-State" }, "created_at": { "type": "string", "description": "The date and time the order was created.", "format": "date-time" }, "updated_at": { "type": "string", "description": "The date and time the order was last updated.", "format": "date-time" }, "description": { "$ref": "#/$defs/Order-Description" }, "capture_mode": { "$ref": "#/$defs/Capture-Mode-v2" }, "authorisation_type": { "$ref": "#/$defs/Authorisation-Type" }, "cancel_authorised_after": { "$ref": "#/$defs/Cancel-Authorised-After" }, "amount": { "$ref": "#/$defs/Order-Amount-v2" }, "outstanding_amount": { "$ref": "#/$defs/Outstanding-Amount" }, "refunded_amount": { "$ref": "#/$defs/Refunded-Amount" }, "currency": { "$ref": "#/$defs/Currency" }, "settlement_currency": { "$ref": "#/$defs/Settlement-Currency" }, "customer": { "$ref": "#/$defs/Customer-v2" }, "payments": { "type": "array", "description": "The details of all the payments that have been made towards this order (successful or unsuccessful).", "items": { "$ref": "#/$defs/Payment-v3" } }, "incremental_authorisations": { "$ref": "#/$defs/Incremental-Authorisations" }, "location_id": { "$ref": "#/$defs/Location-Id" }, "metadata": { "$ref": "#/$defs/Metadata" }, "industry_data": { "$ref": "#/$defs/Industry-Data-v3" }, "merchant_order_data": { "$ref": "#/$defs/Merchant-Order-Data" }, "upcoming_payment_data": { "$ref": "#/$defs/Upcoming-Payment" }, "checkout_url": { "$ref": "#/$defs/Checkout-Url" }, "redirect_url": { "$ref": "#/$defs/Redirect-Url" }, "shipping": { "$ref": "#/$defs/Shipping" }, "enforce_challenge": { "$ref": "#/$defs/Enforce-Challenge-v2" }, "line_items": { "$ref": "#/$defs/Line-Items" }, "statement_descriptor_suffix": { "$ref": "#/$defs/Statement-Descriptor-Suffix" }, "related_order_id": { "$ref": "#/$defs/Related-Order-Id" }, "subscription_data": { "$ref": "#/$defs/Subscription-Data" } }, "$defs": { "Address-v2": { "type": "object", "description": "Object containing address details.", "properties": { "street_line_1": { "type": "string", "description": "Street line 1 information.", "maxLength": 100 }, "street_line_2": { "type": "string", "description": "Street line 2 information.", "maxLength": 100 }, "region": { "type": "string", "description": "The region associated with the address.", "maxLength": 100 }, "city": { "type": "string", "description": "The city associated with the address.", "maxLength": 100 }, "country_code": { "type": "string", "description": "The 2-letter country code of the country associated with the address.", "maxLength": 2 }, "postcode": { "type": "string", "description": "The postcode associated with the address.", "maxLength": 100 } }, "required": [ "country_code", "postcode" ] }, "Address-v3": { "type": "object", "description": "Details of a physical address.", "properties": { "street_line_1": { "type": "string", "description": "Primary address line.", "maxLength": 100 }, "street_line_2": { "type": "string", "description": "Secondary address line, such as floor and apartment number.", "maxLength": 100 }, "region": { "type": "string", "description": "State or province of the address.", "maxLength": 100 }, "city": { "type": "string", "description": "City of the address.", "maxLength": 100 }, "country_code": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 2-letter country code.", "minLength": 2, "maxLength": 2 }, "postcode": { "type": "string", "description": "Postal code of the address.", "maxLength": 100 } }, "required": [ "street_line_1", "city", "country_code", "postcode" ] }, "Address-v4": { "type": "object", "description": "Details of a physical address.", "properties": { "street_line_1": { "type": "string", "description": "Primary address line.", "maxLength": 100 }, "street_line_2": { "type": "string", "description": "Secondary address line, such as floor and apartment number.", "maxLength": 100 }, "region": { "type": "string", "description": "State or province of the address.", "maxLength": 100 }, "city": { "type": "string", "description": "City of the address.", "maxLength": 100 }, "country_code": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 2-letter country code.", "minLength": 2, "maxLength": 2 }, "country_subdivision_code": { "type": "string", "pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$", "description": "The subdivision code represents the state, province, or region within the country, following the [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) standard. This code uniquely identifies subdivisions within a country. \n\nFor example, for London in the United Kingdom, use `GB-LND`.\n\n:::warning\nThe parameter is required for countries listed on the [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) page.\n:::", "minLength": 5, "maxLength": 6 }, "postcode": { "type": "string", "description": "Postal code of the address.", "maxLength": 100 } }, "required": [ "street_line_1", "city", "country_code", "postcode" ] }, "Airline-Data-v2": { "type": "object", "description": "Object containing additional information about an airline booking associated with the order.\n\nUse this object to provide required data to enable **Revolut Flight Alerts**. This feature allows users to receive real-time flight updates such as check-in reminders, boarding alerts, and notifications for cancellations or delays in the Revolut app.\n\nTo enable **Revolut Flight Alerts** functionalities in the Revolut app, the following fields are **required** on order creation or update, before capturing the order:\n ```\n tickets_purchase,\n journey_legs,\n booking_url\n ```\n\n:::note\nThese are the specific data field requirements for merchants who must provide airline data. Note that these requirements can be extended on a case by case basis as decided by Revolut.\n\n| Required for airline/charter merchants | Required for OTA merchants |\n| -------------------------------------- | -------------------------- |\n| | |\n:::", "properties": { "booking_id": { "$ref": "#/$defs/Booking-Id" }, "fulfillment_date": { "type": "string", "format": "date-time", "description": "The UTC date and time of the final journey leg.\n\n:::warning\nThe following limitations apply:\n - When creating or updating an order, `fulfillment_date` cannot be set to a date in the past.\n - When updating an order, if the current `fulfillment_date` value is already in the past, it cannot be modified. The date must remain as is to maintain data integrity for completed transactions.\n:::" }, "tickets_purchase": { "type": "boolean", "description": "Flag indicating whether the order includes actual ticket purchases. Set to `true` if the order contains ticket purchases, and `false` if it does not (e.g., it **only** contains seat reservations, or baggage upgrades).\n\n:::info\nThis field is required for activating **Revolut Flight Alerts** functionalities within the Revolut app.\n\nProvide the info on order creation or update, before capturing the order.\n:::" }, "ticket_type": { "type": "string", "enum": [ "fixed", "flexible" ], "description": "The type of the ticket.\n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `fixed` | Non-modifiable once confirmed. |\n| `flexible` | Allows modifications or cancellations under specified conditions. |" }, "crs_code": { "type": "string", "maxLength": 4, "description": "The code of the Computer Reservation System (CRS) used to make the booking and purchase the ticket." }, "ticket_change_indicator": { "type": "string", "enum": [ "new", "modification" ], "description": "Parameter indicating whether this order is related to a new ticket reservation or a modification of an existing one." }, "refundability": { "$ref": "#/$defs/Refundability" }, "passengers": { "$ref": "#/$defs/Passengers" }, "journey_legs": { "$ref": "#/$defs/Journey-Legs" }, "booking_url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "URL to the online portal for managing the airline booking, which includes check-in functionality. This URL may be a personalised, pre-populated check-in link specific to the user or a generic link, and it is essential for enabling direct access to booking details within the Revolut app.\n\n:::info\nThis field is required for activating **Revolut Flight Alerts** functionalities within the Revolut app.\n\nProvide the info on order creation or update, before capturing the order.\n:::\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" } }, "required": [ "booking_id" ] }, "Apple-Pay": { "type": "object", "description": "Object containing details of a card used via Apple Pay.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "card_brand": { "type": "string", "description": "The type of the card.", "enum": [ "visa", "mastercard", "american_express" ] }, "funding": { "type": "string", "description": "The type of card funding.", "enum": [ "credit", "debit", "prepaid" ] }, "card_country_code": { "type": "string", "description": "The 2-letter country code of the country where the card was issued." }, "card_bin": { "type": "string", "description": "The BIN of the card.", "minLength": 6, "maxLength": 6 }, "card_last_four": { "type": "string", "description": "The last four digits of the card number.", "minLength": 4, "maxLength": 4 }, "card_expiry": { "type": "string", "format": "MM/YY", "description": "The expiry date of the card in the format of MM/YY." }, "cardholder_name": { "type": "string", "description": "The name of the cardholder." }, "checks": { "$ref": "#/$defs/Card-Checks-v2" }, "authorisation_code": { "$ref": "#/$defs/Authorisation-Code" }, "arn": { "$ref": "#/$defs/Arn" }, "capture_deadline": { "$ref": "#/$defs/Capture-Deadline" }, "terminal_hardware_id": { "$ref": "#/$defs/Terminal-Hardware-Id" }, "fingerprint": { "$ref": "#/$defs/Fingerprint" }, "network_transaction_id": { "$ref": "#/$defs/Network-Transaction-Id" } }, "required": [ "type" ] }, "Arn": { "type": "string", "description": "Acquirer Reference Number (ARN) of the payment.\n\n:::note\nOnly returned for refund payments made by a card.\n:::", "minLength": 23, "maxLength": 23 }, "Authentication-Challenge-Type": { "type": "string", "enum": [ "three_ds", "three_ds_fingerprint" ], "description": "Type of the authentication challenge the payment triggers." }, "Authentication-Challenge-v2": { "type": "object", "description": "Details about the authentication challenge that should be performed to complete the authentication process. For more information about Revolut's 3DS solution, see: [3D Secure overview](https://developer.revolut.com/docs/guides/merchant/reference/3d-secure).\n\nOnly returned if the payment's state is `authentication_challenge`.", "oneOf": [ { "$ref": "#/$defs/Three-Ds" }, { "$ref": "#/$defs/Three-Ds-Fingerprint-v2" } ] }, "Authorisation-Code": { "type": "string", "description": "The authorisation code (or auth code) is a short, alphanumeric code returned by the cardholder's issuing bank to the merchant's terminal or payment gateway.\n\nIt serves as confirmation that the transaction has been approved and funds are available.", "pattern": "^[a-zA-Z0-9]{2,6}$", "minLength": 2, "maxLength": 6 }, "Authorisation-Type": { "type": "string", "description": "The type of authorisation for the order. Used with manual capture mode. If omitted, `final` is used by default.\n\n### Pre-authorisation\n\nPre-authorisation allows you to reserve funds on a customer's card without immediately capturing them. This is useful for scenarios like:\n\n- Hotel bookings where the final amount may vary\n- Car rentals where additional charges may apply\n- Deposits that need to be held temporarily\n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `final` | Standard authorisation for immediate or near-immediate capture. |\n| `pre_authorisation` | Reserve funds for later capture, used with manual capture mode. |\n\n:::note\nPre-authorisation must be used with `capture_mode: manual`. For more information, see [Capture an order](https://developer.revolut.com/docs/api/merchant#capture-order).\n:::", "default": "final", "enum": [ "final", "pre_authorisation" ] }, "Bank-Message": { "type": "string", "description": "The reason for a `failed` or `declined` payment, sent by the financial institution processing the payment." }, "Booking-Id": { "type": "string", "description": "A unique identifier provided by the merchant associated with the order. \n\nThis `booking_id` is used to reference and correlate booking information with the Merchant API and the merchant's internal system." }, "Cancel-Authorised-After": { "type": "string", "format": "duration", "description": "Automatic cancellation period for uncaptured orders, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. \n\nAfter this period, the authorised payment is automatically cancelled and the order is cancelled. Maximum: 7 days = `P7D`.\n\n:::note\nThe following limitations apply:\n - Cannot be a negative value.\n - Cannot be updated if the new value is less than or equal to the elapsed time since authorisation. \n\n **Failing scenario:**\n - Original value: 7 days\n - Time since authorisation: 3 days\n - Update value: 2 days\n \n In this scenario, an error is returned.\n \n **Successful scenario:**\n - Original value: 7 days\n - Time since authorisation: 3 days\n - Update value: 4 days\n\n In this scenario, the parameter can be updated.\n\n - Cannot be updated if cancellation is ≤ 30 minutes away.\n\n **Failing scenario:**\n - Original value: 12 hours\n - Time since authorisation: 11 hours 40 minutes\n \n In this scenario, an error is returned.\n \n **Successful scenario:** \n - Original value: 12 hours\n - Time since authorisation: 11 hours 20 minutes\n\n In this scenario, the parameter can be updated.\n:::" }, "Capture-Deadline": { "type": "string", "format": "date-time", "description": "The date and time by which the payment must be captured.\n\nAfter this deadline, the authorised funds may be automatically released by the card issuer." }, "Capture-Mode-v2": { "type": "string", "description": "The capture mode of the order. `automatic` is used by default.\n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `automatic` | The order is captured automatically after payment authorisation. |\n| `manual` | The order is not captured automatically. You must manually capture the order later. |\n\n:::info\nFor more information, see [Capture an order](https://developer.revolut.com/docs/api/merchant#capture-order).\n:::", "default": "automatic", "enum": [ "automatic", "manual" ] }, "Car-Rental-v2": { "type": "object", "description": "Object containing additional information about a car rental booking associated with the order.\n\n:::info\nThese are the specific data field requirements for merchants offering car rental. Note that these requirements can be extended on a case by case basis as decided by Revolut.\n\n```\nbooking_id\ndrop_off_date\nrefundability\n```\n:::", "properties": { "booking_id": { "$ref": "#/$defs/Booking-Id" }, "pick_up_date": { "type": "string", "format": "date-time", "description": "The UTC date and time of the pick-up." }, "pick_up_location": { "$ref": "#/$defs/Address-v2" }, "drop_off_date": { "type": "string", "format": "date-time", "description": "The UTC date and time of the drop-off." }, "drop_off_location": { "$ref": "#/$defs/Address-v2" }, "refundability": { "$ref": "#/$defs/Refundability" }, "distance_limit": { "type": "object", "description": "Object containing distance limit information.", "properties": { "limit": { "type": "integer", "description": "The maximum distance allowed." }, "unit": { "type": "string", "description": "The unit of distance.", "enum": [ "miles", "km" ] }, "additional_distance_cost": { "type": "object", "description": "Cost for exceeding the distance limit.", "properties": { "amount": { "type": "integer", "description": "The amount of the cost in minor currency units. For example, enter `7034` for €70.34." }, "currency": { "$ref": "#/$defs/Currency" } } } } } }, "required": [ "booking_id", "drop_off_date" ] }, "Card": { "type": "object", "description": "Object containing details of the card used for the payment.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "card_brand": { "type": "string", "description": "The type of the card.", "enum": [ "visa", "mastercard", "american_express" ] }, "funding": { "type": "string", "description": "The type of card funding.", "enum": [ "credit", "debit", "prepaid" ] }, "card_country_code": { "type": "string", "description": "The 2-letter country code of the country where the card was issued." }, "card_bin": { "type": "string", "description": "The BIN of the card.", "minLength": 6, "maxLength": 6 }, "card_last_four": { "type": "string", "description": "The last four digits of the card number.", "minLength": 4, "maxLength": 4 }, "card_expiry": { "type": "string", "format": "MM/YY", "description": "The expiry date of the card in the format of MM/YY." }, "cardholder_name": { "type": "string", "description": "The name of the cardholder." }, "checks": { "$ref": "#/$defs/Card-Checks-v2" }, "authorisation_code": { "$ref": "#/$defs/Authorisation-Code" }, "arn": { "$ref": "#/$defs/Arn" }, "capture_deadline": { "$ref": "#/$defs/Capture-Deadline" }, "terminal_hardware_id": { "$ref": "#/$defs/Terminal-Hardware-Id" }, "fingerprint": { "$ref": "#/$defs/Fingerprint" }, "network_transaction_id": { "$ref": "#/$defs/Network-Transaction-Id" } }, "required": [ "type" ] }, "Card-Checks-v2": { "type": "object", "description": "The details of the check for card payment. Only for orders with successful payments.", "properties": { "three_ds": { "type": "object", "description": "The details of the 3D Secure check. Only for orders with successful payments.\n\n:::note\nNot returned for Apple Pay and Google Pay payments.\n:::", "properties": { "eci": { "type": "string", "description": "The Electronic Commerce Indicator (ECI) value corresponds to the authentication result and indicates the level of security used when the payment information was provided." }, "state": { "type": "string", "description": "The result of 3D Secure check.", "enum": [ "verified", "failed", "challenge" ] }, "version": { "type": "integer", "description": "The 3D Secure version." } } }, "cvv_verification": { "type": "string", "description": "The result of CVV verification.\n\n| Parameter value | Description |\n| ----- | ----------- |\n| `match` | CVV matches the card's CVV |\n| `not_match` | CVV does not match the card's CVV |\n| `incorrect` | CVV format is incorrect for this type of card |\n| `not_processed` | CVV verification was not performed |", "enum": [ "match", "not_match", "incorrect", "not_processed" ] }, "address": { "type": "string", "description": "The result of address verification.", "enum": [ "match", "not_match", "n_a", "invalid" ] }, "postcode": { "type": "string", "description": "The result of postcode verification.", "enum": [ "match", "not_match", "n_a", "invalid" ] }, "cardholder": { "type": "string", "description": "The result of cardholder verification.", "enum": [ "match", "not_match", "n_a", "invalid" ] } } }, "Checkout-Url": { "type": "string", "description": "Link to a checkout page hosted by Revolut.", "format": "uri" }, "Contact": { "type": "object", "description": "Contact details for someone responsible for the shipment.\n\n:::warning\nAt least `email` or `phone` is required.\n:::", "properties": { "name": { "type": "string", "description": "Full name of the contact person.", "maxLength": 250 }, "email": { "type": "string", "format": "email", "description": "Email address of the contact person." }, "phone": { "type": "string", "description": "Phone number of the contact person." } } }, "Crypto-Transaction": { "type": "object", "properties": { "id": { "type": "string", "maxLength": 255, "description": "The public transaction hash of the crypto transaction." }, "status": { "type": "string", "enum": [ "pending", "failed", "cancelled", "completed" ], "description": "The status of the crypto transaction." }, "recipient_wallet_id": { "type": "string", "maxLength": 255, "description": "The wallet ID of the recipient.\n\n:::note\nAt least one of the parameters: `recipient_user_id` or `recipient_wallet_id` is required.\n::: " }, "recipient_user_id": { "type": "string", "maxLength": 255, "description": "The user ID of the recipient.\n\n:::note\nAt least one of the parameters: `recipient_user_id` or `recipient_wallet_id` is required.\n::: " } }, "required": [ "id", "status", "recipient" ] }, "Crypto-Transactions-v3": { "type": "object", "description": "Object containing information about crypto transactions associated with the order.\n\n:::info\nProcessing crypto on-ramp transactions with Revolut has additional compliance requirements. Please reach out to your account executive for additional details.\n\n**Required data fields for crypto services:**\n\n```\ntransactions[].id\ntransactions[].status\ntransactions[].recipient_wallet_id\nseller.id\nseller.name\nseller.website\nseller.phone\nseller.address\nseller.mcc\ncustomer.full_name\ncustomer.date_of_birth\n```\n\nNote that these requirements can be extended on a case by case basis as decided by Revolut.\n:::", "properties": { "transactions": { "type": "array", "description": "Array of crypto transaction data associated with the order.", "items": { "$ref": "#/$defs/Crypto-Transaction" }, "minItems": 1 }, "seller": { "type": "object", "description": "Information about the crypto conversion affiliate.\n\nThis should be provided when a customer completes a payment on a subseller's website rather than directly on the merchant's website, providing insight into the type of business conducted by the subseller.\n\n:::note\nThis needs to be provided only by crypto on-ramp providers for payments they are processing for conversion affiliates.\n\nFor their own payments, `seller` can be omitted.\n:::", "properties": { "mcc": { "type": "string", "description": "A string representing the four-digit [Merchant Category Code (MCC)](https://en.wikipedia.org/wiki/Merchant_category_code) of the conversion affiliate.", "maxLength": 4, "minLength": 4, "pattern": "^\\d{4}$" }, "id": { "type": "string", "description": "The ID of the seller in the merchant's internal system.", "minLength": 1, "maxLength": 15 }, "name": { "type": "string", "description": "The business or legal name of the seller.", "minLength": 1, "maxLength": 50 }, "website": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 255, "description": "The URL of the website of the seller.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `255`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" }, "phone": { "type": "string", "description": "The phone number of the seller." }, "address": { "$ref": "#/$defs/Address-v4" } }, "required": [ "id", "name", "website", "phone", "address", "mcc" ] } }, "required": [ "transactions" ] }, "Currency": { "type": "string", "format": "ISO 4217", "minLength": 3, "maxLength": 3, "description": "[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.\n\n:::info\nFor more information about the supported currencies, see: [Help Center](https://help.revolut.com/business/help/merchant-accounts/payments/in-which-currencies-can-i-accept-payments/).\n:::" }, "Customer-v2": { "type": "object", "description": "Object containing information about a customer.\n\nIf you have it, we strongly advise providing at least either `id`, `phone`, or `email`.\n\nUsing the [Customers operations](https://developer.revolut.com/docs/api/merchant#tag-customers), you can manage customer instances.\n\nThe following behaviours apply to different use cases:\n\n | Use case | API behavior |\n | -------- | ------------ |\n | Existing customer | If `id` was provided, we ignore other customer details and associate the customer with the order.

If either `email`, `phone`, or `full_name` was provided (without an existing customer's `id`), we always create a new customer, irrespective of another, existing customer object having the same details. |\n | New customer | If either `email`, `phone`, or `full_name` was provided, we create a new customer, irrespective of another customer object having the same details.

If `id` of a non-existent customer was provided, we return a `404` error, irrespective of other details provided. |\n\n:::note\nTo avoid unintentional duplication of customer records, search for an existing customer by email or phone using the [List customers](https://developer.revolut.com/docs/api/merchant#retrieve-customer-list) endpoint first, then provide `customer.id` in the order.\n:::", "properties": { "id": { "type": "string", "format": "uuid", "description": "Permanent ID of a customer used to retrieve, update, delete a customer. This ID can also be used to link customer to an order.\n\n:::note\nIf you provide the customer's ID during order creation, no other customer data is required, they will be parsed automatically from the referenced customer object.\n:::" }, "full_name": { "$ref": "#/$defs/Full-Name" }, "phone": { "$ref": "#/$defs/Phone" }, "email": { "$ref": "#/$defs/Email" }, "date_of_birth": { "$ref": "#/$defs/Date-Of-Birth" } } }, "Date-Of-Birth": { "type": "string", "format": "date", "description": "The birth date of the customer." }, "Decline-Reason-v2": { "type": "string", "description": "The reason for a `failed` or `declined` payment.\n\nA failed or declined payment can result from multiple reasons. To learn more, check our [failure reasons](https://developer.revolut.com/docs/guides/merchant/reference/error-codes/decline-reasons).", "enum": [ "3ds_challenge_abandoned", "3ds_challenge_failed_manually", "cardholder_name_missing", "customer_challenge_abandoned", "customer_challenge_failed", "customer_name_mismatch", "do_not_honour", "expired_card", "high_risk", "insufficient_funds", "invalid_address", "invalid_amount", "invalid_card", "invalid_country", "invalid_cvv", "invalid_email", "invalid_expiry", "invalid_merchant", "invalid_phone", "invalid_pin", "issuer_not_available", "pick_up_card", "rejected_by_customer", "restricted_card", "suspected_fraud", "technical_error", "transaction_not_allowed_for_cardholder", "unknown_card", "withdrawal_limit_exceeded" ] }, "Discount": { "type": "object", "description": "Details of a discount applied to the line item, including its name and monetary value.", "properties": { "name": { "type": "string", "maxLength": 100, "description": "The specific name or label of the discount applied to the line item." }, "amount": { "type": "integer", "format": "int64", "minimum": 0, "description": "The monetary value of the discount. " } }, "required": [ "name", "amount" ] }, "Email": { "type": "string", "format": "email", "description": "The email address of the customer." }, "Enforce-Challenge-v2": { "type": "string", "description": "The enforce challenge mode. `automatic` is used by default.\n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `automatic` | The payments created for an order will have challenge requirement calculated by our fraud mechanisms. Not all payments will trigger a 3DS challenge. |\n| `forced` | The payments created for an order will always require a 3DS challenge. Currently only supported for card payments. |", "default": "automatic", "enum": [ "automatic", "forced" ] }, "Event": { "type": "object", "description": "Object containing booking information about a specific event. ", "properties": { "start_date": { "type": "string", "format": "date-time", "description": "[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time when the event starts." }, "end_date": { "type": "string", "format": "date-time", "description": "[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time when the event ends." }, "supplier": { "type": "string", "description": "Legal name of the ticket vendor/event organiser." }, "supplier_payment_date": { "$ref": "#/$defs/Supplier-Payment-Date" }, "name": { "type": "string", "description": "The name of the event." }, "location": { "type": "object", "description": "The address of the event location.", "properties": { "street_line_1": { "type": "string", "description": "Primary address line.", "maxLength": 100 }, "street_line_2": { "type": "string", "description": "Secondary address line, such as floor and apartment number.", "maxLength": 100 }, "region": { "type": "string", "description": "State or province of the address.", "maxLength": 100 }, "city": { "type": "string", "description": "City of the address.", "maxLength": 100 }, "country_code": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 2-letter country code.", "minLength": 2, "maxLength": 2 }, "postcode": { "type": "string", "description": "Postal code of the address.", "maxLength": 100 } }, "required": [ "street_line_1", "city", "country_code", "postcode" ] }, "category": { "type": "string", "enum": [ "concert", "conference", "convention", "exhibition", "festival", "party", "performance", "other" ], "description": "The type of the event." }, "market": { "type": "string", "enum": [ "primary", "secondary" ], "description": "Indicates the relationship between the ticket vendor and the event organiser. \n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `primary` | The merchant is the organiser and primary distributor of the tickets. |\n| `secondary` | The merchant is a reseller, only distributing the tickets. |" }, "tickets": { "type": "array", "items": { "$ref": "#/$defs/Ticket" }, "description": "A list of tickets associated with the booking." } } }, "Events-v2": { "type": "object", "description": "Object containing booking information for a list of event tickets associated with the order.\n\n:::info\nThese are the specific data field requirements for merchants who must provide event data. Note that these requirements can be extended on a case by case basis as decided by Revolut.\n\n```\nbooking_id\nevents[].start_date\nevents[].end_date\nevents[].supplier\nevents[].tickets[].id\n```\n:::", "properties": { "booking_id": { "$ref": "#/$defs/Booking-Id" }, "events": { "type": "array", "description": "A list of events associated with the booking.", "items": { "$ref": "#/$defs/Event" } } }, "required": [ "booking_id" ] }, "Fee": { "type": "object", "properties": { "type": { "type": "string", "description": "The type of the order fee.", "enum": [ "fx", "acquiring" ] }, "amount": { "type": "integer", "description": "The amount of the payment fee (minor currency unit). For example, enter `7034` for €70.34 in the field." }, "currency": { "type": "string", "description": "The currency of the payment fee. [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.\n\n:::info\nFor more information about the supported currencies, see: [Help Center](https://help.revolut.com/business/help/merchant-accounts/payments/in-which-currencies-can-i-accept-payments/).\n:::" } } }, "Fees": { "type": "array", "description": "The details of the order fee.", "items": { "$ref": "#/$defs/Fee" } }, "Fingerprint": { "type": "string", "minLength": 44, "maxLength": 44, "description": "A unique identifier for a payment method, always 44 characters long. This fingerprint can be used to uniquely identify various payment methods.\n\n#### Fingerprint generation\n\n| Payment method | Description |\n| -------- | ----------- |\n| **All payment methods** | A fingerprint is generated for all payment methods, including cards, Revolut Pay (card, account-to-account payments), Apple Pay, and Google Pay. |\n| **Cards (Revolut Pay & Card Gateway)** | For cards, the fingerprint is based on the PAN. Cards processed via Revolut Pay and our card gateway will share the same fingerprint. Renewed cards (new expiry/CVV) retain the same fingerprint for efficient blocking. |\n| **Apple Pay & Google Pay** | Since Apple Pay and Google Pay provide us Device PANs (DPAN), the fingerprint is based on the DPAN provided by Apple/Google, not the connected card's PAN. This means that a new DPAN (and fingerprint) is generated for cards in case they are re-added to the customer's digital wallet, or added to different devices. |\n\n#### Detecting duplicate payment methods\n\nFingerprints are a valuable tool for detecting duplicate payment methods by identifying if a payment method has been seen before. This capability, in turn, helps in preventing various types of misuse (e.g., exploitation of free trials, or association with known problematic accounts, which can be a form of fraud). To effectively use fingerprints for this purpose, you will need to create and maintain your own lists (e.g., blocklists of known problematic fingerprints, allowlists for trusted customers, or tracking frequently used fingerprints). \n\nThe ideal way to utilise fingerprints is by combining them with a manual capture process. While automatic capture with subsequent refunds for problematic payments is possible, manual capture based on fingerprint validation is recommended.\n\nDuring your manual capture workflow, after a payment was authorised:\n \n - Check the fingerprint status by comparing it against your maintained lists and internal business rules.\n - If you decide to proceed with the payment (e.g., the fingerprint is not on a blocklist, or matches a trusted customer's previous payment method): [Capture the order](https://developer.revolut.com/docs/api/merchant#capture-order).\n - If you decide not to proceed with the payment (e.g., the fingerprint matches a known fraudulent fingerprint, or exhibits suspicious patterns): [Cancel the order](https://developer.revolut.com/docs/api/merchant#cancel-order)." }, "Full-Name": { "type": "string", "description": "The full name of the customer." }, "Google-Pay": { "type": "object", "description": "Object containing details of a card used via Google Pay.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "card_brand": { "type": "string", "description": "The type of the card.", "enum": [ "visa", "mastercard", "american_express" ] }, "funding": { "type": "string", "description": "The type of card funding.", "enum": [ "credit", "debit", "prepaid" ] }, "card_country_code": { "type": "string", "description": "The 2-letter country code of the country where the card was issued." }, "card_bin": { "type": "string", "description": "The BIN of the card.", "minLength": 6, "maxLength": 6 }, "card_last_four": { "type": "string", "description": "The last four digits of the card number.", "minLength": 4, "maxLength": 4 }, "card_expiry": { "type": "string", "format": "MM/YY", "description": "The expiry date of the card in the format of MM/YY." }, "cardholder_name": { "type": "string", "description": "The name of the cardholder." }, "checks": { "$ref": "#/$defs/Card-Checks-v2" }, "authorisation_code": { "$ref": "#/$defs/Authorisation-Code" }, "arn": { "$ref": "#/$defs/Arn" }, "capture_deadline": { "$ref": "#/$defs/Capture-Deadline" }, "terminal_hardware_id": { "$ref": "#/$defs/Terminal-Hardware-Id" }, "fingerprint": { "$ref": "#/$defs/Fingerprint" }, "network_transaction_id": { "$ref": "#/$defs/Network-Transaction-Id" } }, "required": [ "type" ] }, "Guest": { "type": "object", "properties": { "first_name": { "type": "string", "description": "Guest's first name." }, "last_name": { "type": "string", "description": "Guest's last name." } }, "required": [ "first_name", "last_name" ] }, "Guests": { "type": "array", "items": { "$ref": "#/$defs/Guest" }, "description": "List of guests associated with the booking." }, "Image-Url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "URL to an image associated with the line item.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" }, "Increment-Reference": { "type": "string", "maxLength": 255, "description": "External reference for this incremental authorisation.\n\n:::tip\nUse your internal charge or invoice ID. This reference is returned in webhooks for easy matching to your system.\n:::" }, "Incremental-Authorisation": { "type": "object", "description": "Represents a single incremental authorisation attempt on an order.\n\nThe `incremental_authorisations` array tracks all increment attempts (successful and failed) in chronological order.", "properties": { "new_amount": { "type": "integer", "description": "The new total amount requested in this increment (in minor units)." }, "old_amount": { "type": "integer", "description": "The previously authorised amount before this increment (in minor units)." }, "state": { "type": "string", "enum": [ "pending", "processing", "authorised", "declined", "failed" ], "description": "The state of this incremental authorization attempt.\n\n| State | Description |\n|-------|-------------|\n| `pending` | Increment registered in system, not yet submitted to card network |\n| `processing` | Increment is being processed by card network |\n| `authorised` | Increment was successfully authorised |\n| `declined` | Increment was declined by card issuer |\n| `failed` | Increment failed due to technical error (not an issuer decline) |" }, "reference": { "$ref": "#/$defs/Increment-Reference" }, "line_items": { "type": "array", "description": "Line items associated with this increment (if provided).\n\n:::note\nIf the increment is successful, these line items will override the existing order line items.\n:::", "items": { "$ref": "#/$defs/Line-Item" } }, "reason": { "type": "string", "description": "Reason why increment was declined or failed.\n\n:::note\nOnly present when `state` is `declined` or `failed`.\n:::" } } }, "Incremental-Authorisations": { "type": "array", "description": "History of incremental authorisation attempts for this order.\n\nOnly present for orders with `authorisation_type: pre_authorisation`.\n\nContains all increment attempts in chronological order.", "items": { "$ref": "#/$defs/Incremental-Authorisation" } }, "Industry-Data-v3": { "type": "object", "description": "Object containing industry-specific information associated with the order.\n\nYou can provide data for one or multiple industries in a single order.\n\n:::info\nIn the following cases, industry-specific info is required. Omitting this information may trigger additional scrutiny and risk mitigation actions by the Revolut risk team.\n\n | Transaction type | Required for |\n | ---------------- | ----------- |\n | `airline` | Airlines and Online Travel Agencies (OTAs). |\n | `car_rental` | Car Rental Merchants and Online Travel Agencies (OTAs). |\n | `crypto` | Crypto merchants. |\n | `marketplace` | Marketplace merchants. |\n | `event` | Event ticket sellers. |\n | `lodging` | Lodging providers. |\n:::", "properties": { "airline": { "$ref": "#/$defs/Airline-Data-v2" }, "car_rental": { "$ref": "#/$defs/Car-Rental-v2" }, "crypto": { "$ref": "#/$defs/Crypto-Transactions-v3" }, "marketplace": { "$ref": "#/$defs/Marketplace-v3" }, "event": { "$ref": "#/$defs/Events-v2" }, "lodging": { "$ref": "#/$defs/Lodging-v3" } } }, "Journey-Leg": { "type": "object", "properties": { "sequence": { "type": "integer", "description": "Sequence of the journey legs. Increment by 1 for each flight included in the ticket.\n\nFor example: For a `FRA > LHR > DUB > LHR > FRA` journey the sequence will be assigned as:\n - `FRA > LHR`: 1\n - `LHR > DUB`: 2\n - `DUB > LHR`: 3\n - `LHR > FRA`: 4" }, "departure_airport_code": { "type": "string", "description": "The [IATA](https://www.iata.org/en/services/codes) 3-letter airport code for the departure airport." }, "arrival_airport_code": { "type": "string", "description": "The [IATA](https://www.iata.org/en/services/codes) 3-letter airport code for the arrival airport." }, "flight_number": { "type": "string", "description": "The flight identifier, without airline code." }, "fare_base_code": { "type": "string", "description": "The fare base code for the given journey leg." }, "travel_date": { "type": "string", "format": "date-time", "description": "The UTC date and time of the flight departure for the given journey leg." }, "airline_name": { "type": "string", "description": "The name of the airline associated with the journey leg." }, "airline_code": { "type": "string", "description": "The IATA 2-letter accounting code identifying the airline associated with the journey leg." }, "pnr": { "type": "string", "format": "alphanumeric", "pattern": "^[a-zA-Z0-9]*$", "maxLength": 20, "description": "The Passenger Name Record (PNR) for the journey leg issued by the airline. \n\nPNR is a unique identifier for the booking, acting as a digital certificate allowing passengers to retrieve or manage their booking details.\n\n:::warning\nThis is a required field for OTAs.\n:::" } }, "required": [ "sequence", "departure_airport_code", "arrival_airport_code", "travel_date", "airline_name", "airline_code" ] }, "Journey-Legs": { "type": "array", "description": "Array containing information of journey legs associated with the booking.\n\n:::info\nThis field is required for activating **Revolut Flight Alerts** functionalities within the Revolut app. \n\nThis information is used to compile a tracking widget that provides real-time updates on flight status and sends notifications, such as a check-in reminders, boarding alerts, and notifications for cancellations or delays. \n\nTo enable the widget the following fields are required on order creation or update, before capturing the order:\n\n ```\n sequence,\n departure_airport_code,\n arrival_airport_code,\n flight_number,\n travel_date,\n airline_name,\n airline_code,\n ```\n:::", "items": { "$ref": "#/$defs/Journey-Leg" } }, "Line-Item": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 250, "description": "Name of the line item." }, "type": { "type": "string", "enum": [ "physical", "service" ], "description": "Type of the line item." }, "quantity": { "$ref": "#/$defs/Quantity" }, "unit_price_amount": { "type": "integer", "format": "int64", "minimum": 0, "description": "The unit price of the line item." }, "total_amount": { "type": "integer", "format": "int64", "description": "The total amount to be paid for the line item, including taxes and discounts." }, "external_id": { "type": "string", "maxLength": 250, "description": "Unique identifier of line item in the merchant's system." }, "discounts": { "type": "array", "maxItems": 50, "description": "A list of discounts applied to the line item. Each discount should be subtracted from the total amount payable for the item.", "items": { "$ref": "#/$defs/Discount" } }, "taxes": { "type": "array", "maxItems": 50, "description": "A list of taxes applied to the line item. Each tax should be added to the total amount payable for the item.", "items": { "$ref": "#/$defs/Tax" } }, "image_urls": { "type": "array", "maxItems": 50, "description": "A list of URLs pointing to images related to the line item. These images can provide visual details or representations of the item.", "items": { "$ref": "#/$defs/Image-Url" } }, "description": { "type": "string", "maxLength": 1024, "description": "Description of the line item." }, "url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "An HTTP/HTTPS URL that links to more information about the line item, such as a product page or details.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" } }, "required": [ "name", "unit_price_amount", "total_amount", "quantity", "type" ] }, "Line-Items": { "type": "array", "maxItems": 250, "description": "An array of line items included in the order. Each line item represents an individual product or service, along with its quantity, price, taxes, and discounts.\n\n:::info\nRequired for merchants collecting payment for one or multiple products/services in one transaction. Omitting this information may trigger additional scrutiny and risk mitigation actions by Revolut.\n:::", "items": { "$ref": "#/$defs/Line-Item" } }, "Location-Id": { "type": "string", "format": "uuid", "description": "Unique ID representing the location where merchants sells products.\n\n:::info\nFor more information, see: [Locations](https://developer.revolut.com/docs/api/merchant#tag-locations).\n::: " }, "Lodging-Booking-Type": { "type": "string", "enum": [ "fixed", "flexible" ], "description": "Indicates whether the booking terms are fixed or flexible.\n\n| Parameter value | Description |\n| --------------- | ----------- |\n| `fixed` | Non-modifiable once confirmed. |\n| `flexible` | Allows modifications or cancellations under specified conditions." }, "Lodging-Category": { "type": "string", "enum": [ "bed_and_breakfast", "hostel", "hotel", "short_term_rental", "other" ], "description": "The type of the accommodation associated with the booking." }, "Lodging-Check-In-Date": { "type": "string", "format": "date-time", "description": "[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time of the check-in." }, "Lodging-Check-Out-Date": { "type": "string", "format": "date-time", "description": "[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time of the check-out." }, "Lodging-Item": { "type": "object", "description": "Object containing details of an individual lodging entry.", "properties": { "check_in_date": { "$ref": "#/$defs/Lodging-Check-In-Date" }, "check_out_date": { "$ref": "#/$defs/Lodging-Check-Out-Date" }, "category": { "$ref": "#/$defs/Lodging-Category" }, "supplier": { "$ref": "#/$defs/Lodging-Supplier" }, "booking_type": { "$ref": "#/$defs/Lodging-Booking-Type" }, "refundability": { "$ref": "#/$defs/Refundability" }, "location": { "$ref": "#/$defs/Lodging-Location" }, "guests": { "$ref": "#/$defs/Guests" } } }, "Lodging-Location": { "type": "object", "description": "Address of the accommodation.", "properties": { "street_line_1": { "type": "string", "description": "Primary address line.", "maxLength": 100 }, "street_line_2": { "type": "string", "description": "Secondary address line, such as floor and apartment number.", "maxLength": 100 }, "region": { "type": "string", "description": "State or province of the address.", "maxLength": 100 }, "city": { "type": "string", "description": "City of the address.", "maxLength": 100 }, "country_code": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 2-letter country code.", "minLength": 2, "maxLength": 2 }, "postcode": { "type": "string", "description": "Postal code of the address.", "maxLength": 100 } }, "required": [ "street_line_1", "city", "country_code", "postcode" ] }, "Lodging-Supplier": { "type": "object", "description": "Object containing supplier information about the lodging provider.", "properties": { "id": { "type": "string", "description": "Unique identifier of the lodging supplier." }, "name": { "type": "string", "description": "Legal name of the lodging supplier." }, "payment_date": { "$ref": "#/$defs/Supplier-Payment-Date" } } }, "Lodging-v3": { "type": "object", "description": "Object containing details of a lodging booking.\n\n:::info\nThese are the specific data field requirements for merchants who must provide lodging data. Note that these requirements can be extended on a case by case basis as decided by Revolut.\n\n```\nbooking_id\nlodgings[].check_in_date\nlodgings[].check_out_date\nlodgings[].supplier.payment_date\n```\n:::", "properties": { "booking_id": { "$ref": "#/$defs/Booking-Id" }, "lodgings": { "type": "array", "description": "List of lodging entries associated with this booking.", "items": { "$ref": "#/$defs/Lodging-Item" } } }, "required": [ "booking_id" ] }, "Marketplace-v3": { "type": "object", "description": "This object is required by Mastercard and Visa for merchants operating as marketplaces under the Merchant Category Code (MCC) `5262`. The marketplace object ensures compliance with the card schemes' regulations by providing detailed information about the seller involved in the transaction.\n\n:::info\nThese are the specific data field requirements for merchants who must provide marketplace data.\n\n```\nseller.id\nseller.name\nseller.website\nseller.phone\nseller.address\n```\n:::", "properties": { "seller": { "type": "object", "description": "Information about the subseller on the marketplace platform.", "properties": { "id": { "type": "string", "description": "The ID of the seller in the merchant's internal system.", "minLength": 1, "maxLength": 15 }, "name": { "type": "string", "description": "The business or legal name of the seller.", "minLength": 1, "maxLength": 50 }, "website": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 255, "description": "The URL of the website of the seller.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `255`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" }, "phone": { "type": "string", "description": "The phone number of the seller." }, "address": { "$ref": "#/$defs/Address-v4" } }, "required": [ "id", "name", "website", "phone", "address" ] } }, "required": [ "seller" ] }, "Merchant-Order-Data": { "type": "object", "description": "Object for providing additional information stored in the merchant's order management system. ", "properties": { "url": { "$ref": "#/$defs/Merchant-Order-Url" }, "reference": { "$ref": "#/$defs/Merchant-Order-External-Reference" } } }, "Merchant-Order-External-Reference": { "type": "string", "description": "Merchant order ID for external reference.\n\nUse this field to set the ID that your own system can use to easily track orders." }, "Merchant-Order-Url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "The URL of the order stored in the merchant's order management system.\n\nThis URL will be included in the order confirmation email for payments made via Revolut Pay. If specified, this URL will override the default link to the merchant's **Business website** configured in the Revolut Business account.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" }, "Metadata": { "type": "object", "description": "Additional information to track your orders in your system, by providing custom metadata using `\"\" : \"\"` pairs.\n\n:::warning\n**Restrictions:**\n\n- Both keys and values must be `string`s\n- Values cannot be `null`.\n- Max number of key-value pairs: `50`\n- Max length of values: `500` characters\n- Format of keys: Must start with a letter and contain only letters, digits, and underscores. Max 40 characters. Pattern: `^[a-zA-Z][a-zA-Z\\\\d_]{0,39}$`\n:::", "maxProperties": 50, "additionalProperties": { "type": "string", "maxLength": 500, "description": "Additional metadata value provided with the corresponding metadata key." } }, "Network-Transaction-Id": { "type": "string", "description": "The Network Transaction ID (NTI) is a unique identifier assigned by the card scheme (e.g., Visa or Mastercard) to a card transaction.\n\nIt can be used to trace the transaction across the payment network, link recurring or instalment payments to the original authorisation, and support dispute resolution." }, "Order-Amount-v2": { "type": "integer", "description": "The order total expressed in minor currency units, according to the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217). For example, `7034` in `EUR` corresponds to €70.34.\n\n:::info\n- Conversion between major and minor units varies by currency. For instance, `100` minor units equal £1.00 in `GBP`, whereas in `ISK` they represent 100 units. For more details, see the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217).\n- If `line_items` are provided, the order `amount` must equal the sum of all line items' `total_amount`.\n- For card payments with a non-zero amount, the order `amount` must be at least **$0.005** (or equivalent in different currencies, calculated using Revolut's exchange rate on the payment date). Otherwise, card payments can't be performed.\n:::" }, "Order-Description": { "type": "string", "description": "The description of the order." }, "Order-Id": { "type": "string", "format": "uuid", "description": "Permanent order ID used to retrieve, capture, cancel, or refund an order after authorization." }, "Order-State": { "type": "string", "description": "The state of the order in its lifecycle.\n\n| State | Description |\n|-------|-------------|\n| `pending` | Order created, awaiting payment |\n| `processing` | Payment is being processed |\n| `authorised` | Payment authorised but not yet captured (for manual capture) |\n| `completed` | Payment successfully captured and settled |\n| `cancelled` | Order was cancelled |\n| `failed` | Payment failed |\n\n:::info\nFor more information, see: [Order and payment lifecycle](https://developer.revolut.com/docs/guides/merchant/reference/order-lifecycle)\n:::", "enum": [ "pending", "processing", "authorised", "completed", "cancelled", "failed" ] }, "Order-Token": { "type": "string", "description": "Temporary ID for the order, which expires when the payment is authorised.\n\nThe order `token` is used for [token-based initialisation](https://developer.revolut.com/docs/sdks/merchant-web-sdk/initialisation/token-based), and is returned by the `createOrder` callback in the following payment methods:\n\n- [Embedded Checkout](https://developer.revolut.com/docs/sdks/merchant-web-sdk/payment-methods/embedded-checkout#embedded-checkout-options-interface)\n- [Revolut Pay](https://developer.revolut.com/docs/sdks/merchant-web-sdk/payment-methods/revolut-pay#widget-payments-revolut-pay-options)\n- [Apple Pay and Google Pay](https://developer.revolut.com/docs/sdks/merchant-web-sdk/payment-methods/apple-pay-google-pay#payment-request-options-interface)\n- [Pay by Bank](https://developer.revolut.com/docs/sdks/merchant-web-sdk/payment-methods/pay-by-bank#pay-by-bank-options-interface)" }, "Order-Type-v2": { "type": "string", "description": "The type of the order.", "enum": [ "payment", "payment_request", "refund", "chargeback", "chargeback_reversal", "credit_reimbursement" ] }, "Outstanding-Amount": { "type": "integer", "description": "The amount not yet paid for a given order (in minor currency units). For example, `7034` represents €70.34. \n\nThe value in this field may differ from `amount` if there are partial payments associated with the order." }, "Passenger": { "type": "object", "properties": { "first_name": { "type": "string", "description": "Passenger's first name." }, "last_name": { "type": "string", "description": "Passenger's last name." } }, "required": [ "first_name", "last_name" ] }, "Passengers": { "type": "array", "description": "Array containing information of passengers associated with the booking.", "items": { "$ref": "#/$defs/Passenger" } }, "Payer": { "title": "Payer", "type": "object", "description": "The person who made the payment. This object is present when an email or phone number is provided during the payment flow.\n\nCapturing payer details lets you identify exactly who authorised the charge, reach the right person for receipts or refund queries, and support compliance or fraud-review workflows where the paying identity matters.", "properties": { "email": { "$ref": "#/$defs/Email", "description": "The email of the person who made the payment." }, "phone": { "$ref": "#/$defs/Phone", "description": "The phone number of the payer in [E.164 format](https://en.wikipedia.org/wiki/E.164)." } } }, "Payment-Amount": { "type": "integer", "format": "int64", "minimum": 0, "description": "The payment amount in minor units (e.g., cents). The value of this field depends on the payment type and state.\n\n| Payment type | State | Amount value |\n|--------------|-------|--------------|\n| Standard payment | Any | Total payment amount |\n| Pre-authorised payment | `authorisation_started` | New amount being authorised (during increment processing) |\n| Pre-authorised payment | `authorised` | Currently authorised amount (equals `authorised_amount`) |\n\n:::info\nFor pre-authorised payments, see the `authorised_amount` field for tracking the currently authorised amount separately.\n:::" }, "Payment-Authorised-Amount": { "type": "integer", "description": "The currently authorised amount for this payment (in minor units).\n\nFor pre-authorised payments with incremental authorization:\n- Initially equals the `amount` field\n- Remains unchanged during increment processing\n- Updates to new amount upon successful increment\n- Remains at original amount if increment is declined\n\nFor standard payments, this field may not be present or will equal the `amount` field." }, "Payment-Created": { "type": "string", "format": "date-time", "description": "The date and time the payment was created." }, "Payment-Id": { "type": "string", "format": "uuid", "description": "The ID of the payment." }, "Payment-Method-Type": { "type": "string", "enum": [ "apple_pay", "card", "google_pay", "revolut_pay_card", "revolut_pay_account", "sepa_direct_debit" ], "description": "The type of payment method used to pay for the order.\n\nAvailable values:\n\n| Payment method `type` | Description |\n| --------------------- | ----------- |\n| `apple_pay` | The customer paid the order using Apple Pay. |\n| `card` | The customer paid the order using their credit or debit card. |\n| `google_pay` | The customer paid the order using Google Pay. |\n| `revolut_pay_card` | The customer paid the order via Revolut Pay using their credit or debit card. |\n| `revolut_pay_account` | The customer paid the order via Revolut Pay using their Revolut account. |\n| `sepa_direct_debit` | The customer paid the order using SEPA Direct Debit. |" }, "Payment-Method-v2": { "type": "object", "description": "The details of the payment method used to make the payment.", "oneOf": [ { "$ref": "#/$defs/Apple-Pay" }, { "$ref": "#/$defs/Card" }, { "$ref": "#/$defs/Google-Pay" }, { "$ref": "#/$defs/Revolut-Pay-Card" }, { "$ref": "#/$defs/Revolut-Pay-Account" }, { "$ref": "#/$defs/Sepa-Direct-Debit" } ] }, "Payment-Risk-Level": { "type": "string", "description": "The risk level of the card.\n\nIf the risk level is `high`, the payment might be declined.", "enum": [ "low", "high" ] }, "Payment-Settled-Amount": { "type": "integer", "description": "The amount of the settled payment (minor currency unit). For example, `7034` stands for €70.34." }, "Payment-Settled-Currency": { "type": "string", "description": "The currency of the settled payment. [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.\n\n:::info\nFor more information about the supported currencies, see: [Help Center](https://help.revolut.com/business/help/merchant-accounts/payments/in-which-currencies-can-i-accept-payments/).\n:::" }, "Payment-State-v2": { "type": "string", "description": "The status of the payment.", "enum": [ "pending", "authentication_challenge", "authentication_verified", "authorisation_started", "authorisation_passed", "authorised", "capture_started", "captured", "refund_validated", "refund_started", "cancellation_started", "declining", "completing", "cancelling", "failing", "completed", "declined", "soft_declined", "cancelled", "failed" ] }, "Payment-Token": { "type": "string", "format": "uuid", "description": "Temporary token of the payment used to fetch the reward offer during checkout and link user registrations to the given offers. \n\nThe token is only valid for a limited time." }, "Payment-Updated": { "type": "string", "format": "date-time", "description": "The date and time the payment was last updated." }, "Payment-v3": { "type": "object", "description": "Represents a payment for an order.\n\nFor pre-authorised payments, the `authorised_amount` field tracks the currently authorised amount, which may differ from `amount` during incremental authorisation processing.", "properties": { "id": { "$ref": "#/$defs/Payment-Id" }, "state": { "$ref": "#/$defs/Payment-State-v2" }, "decline_reason": { "$ref": "#/$defs/Decline-Reason-v2" }, "bank_message": { "$ref": "#/$defs/Bank-Message" }, "created_at": { "$ref": "#/$defs/Payment-Created" }, "updated_at": { "$ref": "#/$defs/Payment-Updated" }, "token": { "$ref": "#/$defs/Payment-Token" }, "amount": { "$ref": "#/$defs/Payment-Amount" }, "authorised_amount": { "$ref": "#/$defs/Payment-Authorised-Amount" }, "currency": { "$ref": "#/$defs/Currency" }, "settled_amount": { "$ref": "#/$defs/Payment-Settled-Amount" }, "settled_currency": { "$ref": "#/$defs/Payment-Settled-Currency" }, "payment_method": { "$ref": "#/$defs/Payment-Method-v2" }, "authentication_challenge": { "$ref": "#/$defs/Authentication-Challenge-v2" }, "billing_address": { "$ref": "#/$defs/Address-v2" }, "risk_level": { "$ref": "#/$defs/Payment-Risk-Level" }, "fees": { "$ref": "#/$defs/Fees" }, "payer": { "$ref": "#/$defs/Payer" } }, "required": [ "id", "state", "created_at", "updated_at", "amount" ] }, "Phone": { "type": "string", "description": "The phone number of the customer in [E.164 format](https://en.wikipedia.org/wiki/E.164)." }, "Quantity": { "type": "object", "description": "Object representing the quantity details of a line item, including the amount and its associated unit of measurement.", "properties": { "value": { "type": "number", "format": "double", "minimum": 0, "description": "The number of units of the line item." }, "unit": { "type": "string", "maxLength": 100, "description": "The measurement unit for the quantity, such as `cm`, or `kg`." } }, "required": [ "value" ] }, "Redirect-Url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "The URL your customer will be redirected to after a successful payment on the hosted checkout page (`checkout_url` parameter's value of the order).\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::\n\n:::info\nFor more information on how to use the `redirect_url`, see: [Custom redirection via the API](https://developer.revolut.com/docs/guides/merchant/accept-payments/online-payments/hosted-checkout-page/api#custom-post-payment-redirection-optional)\n:::" }, "Refundability": { "type": "string", "enum": [ "refundable", "non_refundable", "partially_refundable" ], "description": "Parameter indicating whether the booking is refundable, partially refundable, or not refundable." }, "Refunded-Amount": { "type": "integer", "description": "The amount that was refunded from the order (in minor currency units). For example, `7034` represents €70.34. \n\nThis applies to orders that have been refunded (i.e., orders of type `payment` that have a related `refund` order)." }, "Related-Order-Id": { "type": "string", "format": "uuid", "description": "The unique ID of the original order that was refunded and this refund is associated with. You can use this ID to get more information about the related order using the [Retrieve an order](https://developer.revolut.com/docs/api/merchant#retrieve-order) operation.\n\n:::note\nThis field is only returned for orders with `type: refund`.\n:::" }, "Revolut-Pay-Account": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "fingerprint": { "$ref": "#/$defs/Fingerprint" } }, "required": [ "type" ] }, "Revolut-Pay-Card": { "type": "object", "description": "Object containing details of a card used via Revolut Pay.", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "card_brand": { "type": "string", "description": "The type of the card.", "enum": [ "visa", "mastercard", "american_express" ] }, "funding": { "type": "string", "description": "The type of card funding.", "enum": [ "credit", "debit", "prepaid" ] }, "card_country_code": { "type": "string", "description": "The 2-letter country code of the country where the card was issued." }, "card_bin": { "type": "string", "description": "The BIN of the card.", "minLength": 6, "maxLength": 6 }, "card_last_four": { "type": "string", "description": "The last four digits of the card number.", "minLength": 4, "maxLength": 4 }, "card_expiry": { "type": "string", "format": "MM/YY", "description": "The expiry date of the card in the format of MM/YY." }, "cardholder_name": { "type": "string", "description": "The name of the cardholder." }, "checks": { "$ref": "#/$defs/Card-Checks-v2" }, "authorisation_code": { "$ref": "#/$defs/Authorisation-Code" }, "arn": { "$ref": "#/$defs/Arn" }, "capture_deadline": { "$ref": "#/$defs/Capture-Deadline" }, "terminal_hardware_id": { "$ref": "#/$defs/Terminal-Hardware-Id" }, "fingerprint": { "$ref": "#/$defs/Fingerprint" }, "network_transaction_id": { "$ref": "#/$defs/Network-Transaction-Id" } }, "required": [ "type" ] }, "Sepa-Direct-Debit": { "type": "object", "description": "Object containing details of a SEPA Direct Debit payment.\n\n:::info\nFor more information, see: [SEPA Direct Debit server-to-server integration](https://developer.revolut.com/docs/guides/merchant/accept-payments/payment-methods/sepa-direct-debit/server-to-server)\n:::", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID of the saved payment method.\n\n:::note\nThe `id` parameter is only returned when the payment method is saved for the merchant.\n:::" }, "type": { "$ref": "#/$defs/Payment-Method-Type" }, "debtor_iban_last_four": { "$ref": "#/$defs/Sepa-Direct-Debit-Debtor-Iban-Last-Four" }, "debtor_name": { "$ref": "#/$defs/Sepa-Direct-Debit-Debtor-Name" }, "mandate_reference": { "$ref": "#/$defs/Sepa-Direct-Debit-Mandate-Reference" } }, "required": [ "type" ] }, "Sepa-Direct-Debit-Debtor-Iban-Last-Four": { "type": "string", "description": "The last four digits of the debtor's IBAN.", "minLength": 4, "maxLength": 4 }, "Sepa-Direct-Debit-Debtor-Name": { "type": "string", "description": "The full name of the debtor as provided in the mandate." }, "Sepa-Direct-Debit-Mandate-Reference": { "type": "string", "description": "The unique mandate reference generated by Revolut. Include this in pre-debit notifications sent to your customers." }, "Settlement-Currency": { "type": "string", "description": "[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case. \n\nIf `settlement_currency` is different from the value of `currency`, the money will be exchanged when the amount is settled to your merchant account. In case of a refund or chargeback, the money will be exchanged to the order's initial `currency`.\n\nIf `settlement_currency` is not specified, this value is taken from `currency`.\n\n:::info\nFor more information about the supported currencies, see: [Help Center](https://help.revolut.com/business/help/merchant-accounts/payments/in-which-currencies-can-i-accept-payments/).\n:::" }, "Shipment": { "type": "object", "description": "Details of an individual shipment.", "properties": { "shipping_company_name": { "type": "string", "maxLength": 250, "description": "Name of the company handling the shipment." }, "tracking_number": { "type": "string", "maxLength": 500, "description": "Unique tracking number for the shipment." }, "estimated_delivery_date": { "type": "string", "format": "date-time", "description": "Estimated delivery date and time for the shipment. \nThe time should also include the customer's timezone." }, "tracking_url": { "type": "string", "format": "uri", "pattern": "^https?:\\/{2}.+/gi", "maxLength": 2000, "description": "An HTTP/HTTPS URL where the shipment can be tracked.\n\n:::warning\nRestrictions:\n- Must be a valid URI as defined by [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986)\n- URI scheme is required and must be either `http` or `https`\n- URI host is required and cannot be `localhost` or an IP address\n- Max length: `2000`\n- Reserved or invalid characters must be percent-encoded (for example, use `%20` instead of a space)\n:::" } }, "required": [ "shipping_company_name", "tracking_number" ] }, "Shipments": { "type": "array", "description": "List of individual shipment details.", "maxItems": 50, "items": { "$ref": "#/$defs/Shipment" } }, "Shipping": { "type": "object", "description": "Details about the shipping related to the order, including address, contact information, and individual shipments.\n\n:::info\nRequired for merchants shipping physical goods. Omitting this information may trigger additional scrutiny and risk mitigation actions by Revolut.\n:::", "properties": { "address": { "$ref": "#/$defs/Address-v3" }, "contact": { "$ref": "#/$defs/Contact" }, "shipments": { "$ref": "#/$defs/Shipments" } } }, "Statement-Descriptor-Suffix": { "type": "string", "description": "You can set a dynamic statement descriptor for your orders by providing a custom suffix. \n\nA statement descriptor is the text shown on cardholders' bank or card statements, helping them recognise a transaction or merchant. This field can be used to send extra information with the statement descriptor for card transactions.\n\nThe complete descriptor is built using the following format: `{base}*{suffix}`, where:\n \n - **`{base}`** is the existing descriptor configured in the Revolut Business dashboard (**Settings > Business account > Merchant profile > Statement descriptor**). \n - **`{suffix}`** is defined by the `statement_descriptor_suffix` field.\n\n:::note\n- If the combined descriptor's length (base + suffix) exceeds the character limits of card scheme providers, the final value will be truncated. For example if the limit is 22 characters, the base descriptor is `\"base\"` and the suffix is `\"testdescriptorsuffix\"`, the final descriptor becomes `\"base*testdescriptorsuf\"`.\n- The final statement descriptor shown on a cardholder's statement may vary by issuing bank, as some banks apply their own custom formatting or truncation rules.\n:::", "minLength": 1, "maxLength": 19, "pattern": "^[^*\\n\\r\\\\]+$" }, "Subscription-Active-Cycle-Id": { "type": "string", "format": "uuid", "description": "The unique identifier of the active (pre-paid) subscription cycle that this order collects payment for.\n\nThis is the current billing cycle whose recurring charges are being collected in advance by this order. For example, if a subscription cycle covers 1-31 July and the order is generated on 1 July, this field identifies that July cycle." }, "Subscription-Data": { "title": "Subscription data", "type": "object", "required": [ "subscription_id", "billing_reason" ], "description": "Subscription details linked to the order. Use this object to match an order with its underlying subscription and understand the billing context in which the order was created.\n\nOnly present on orders created by a subscription.", "properties": { "subscription_id": { "$ref": "#/$defs/Subscription-Id" }, "active_cycle_id": { "$ref": "#/$defs/Subscription-Active-Cycle-Id" }, "settled_cycle_id": { "$ref": "#/$defs/Subscription-Settled-Cycle-Id" }, "billing_reason": { "$ref": "#/$defs/Subscription-Order-Billing-Reason" } } }, "Subscription-Id": { "type": "string", "format": "uuid", "description": "Unique identifier for the subscription." }, "Subscription-Order-Billing-Reason": { "type": "string", "enum": [ "cycle_billing", "final_settlement", "setup_intent" ], "description": "The reason this subscription order was created.\n\n| Value | Description |\n| ----- | ----------- |\n| `cycle_billing` | The order was automatically generated to collect payment for an ongoing subscription cycle. `active_cycle_id` is present; `settled_cycle_id` is present if the previous cycle included usage-based products. |\n| `final_settlement` | The order was automatically generated after the subscription ended to collect outstanding usage-based charges. `active_cycle_id` is absent; `settled_cycle_id` is present. |\n| `setup_intent` | The order was manually created by the merchant or customer to update the payment method on file. `active_cycle_id` is absent; `settled_cycle_id` is absent. |" }, "Subscription-Settled-Cycle-Id": { "type": "string", "format": "uuid", "description": "The unique identifier of the settled (post-paid) subscription cycle whose usage-based charges this order collects.\n\nThis is the previous billing cycle whose usage is being settled by this order. For example, if a subscription cycle covers usage from 1-30 June and the order is generated on 10 July, this field identifies that June cycle." }, "Supplier-Payment-Date": { "type": "string", "format": "date-time", "description": "[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time when the funds are released to merchants." }, "Tax": { "type": "object", "description": "Details about a tax applied to the line item, including its name and the corresponding amount.", "properties": { "name": { "type": "string", "description": "The specific name or designation of the tax applied to the line item.", "maxLength": 100 }, "amount": { "type": "integer", "format": "int64", "description": "The monetary value of the tax in minor currency units (e.g., cents for EUR).", "minimum": 0 } }, "required": [ "name", "amount" ] }, "Terminal-Hardware-Id": { "type": "string", "description": "The hardware identifier of the Revolut Terminal device used to process the payment.\n\n:::note\nOnly present for card-present transactions processed via Revolut Terminal.\n:::" }, "Three-Ds": { "title": "three_ds", "type": "object", "description": "Information about the 3DS challenge.", "properties": { "type": { "$ref": "#/$defs/Authentication-Challenge-Type" }, "acs_url": { "type": "string", "format": "url", "description": "The URL of the authentication challenge." } }, "required": [ "type", "acs_url" ] }, "Three-Ds-Fingerprint-v2": { "title": "three_ds_fingerprint", "type": "object", "description": "Information about the 3DS fingerprint challenge.", "properties": { "type": { "$ref": "#/$defs/Authentication-Challenge-Type" }, "fingerprint_html": { "type": "string", "format": "byte", "description": "Base64-encoded HTML string for the 3DS fingerprint challenge. This HTML is fully\nconstructed by Revolut — no modifications are needed.\n\nDecode this value using a `base64` decoder and render the resulting HTML in your\nfront-end application. Revolut automatically moves the payment to the full 3DS\nchallenge if the fingerprint is not handled within 15 seconds." } }, "required": [ "type", "fingerprint_html" ] }, "Ticket": { "type": "object", "description": "Object containing information about a ticket associated with the booking.", "properties": { "id": { "type": "string", "description": "A unique identifier provided by the merchant associated with the ticket." }, "transferable": { "type": "boolean", "description": "Indicates whether the ticket is transferable to another buyer." }, "refundability": { "$ref": "#/$defs/Refundability" } }, "required": [ "id" ] }, "Upcoming-Payment": { "type": "object", "description": "Object containing information about upcoming payments associated with the order.", "properties": { "date": { "type": "string", "format": "date-time", "description": "The date and time in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601) when the upcoming payment is scheduled to be executed." }, "payment_method_id": { "type": "string", "description": "The unique ID of the customer's payment method used to complete the scheduled payment.\n\n:::info\nFor more information about operations related to customer's payment methods, see:\n - [Retrieve payment method list of a customer](https://developer.revolut.com/docs/api/merchant#retrieve-payment-method-list)\n - [Retrieve a customer's payment method](https://developer.revolut.com/docs/api/merchant#retrieve-payment-method)\n - [Update a customer's payment method](https://developer.revolut.com/docs/api/merchant#update-payment-method)\n - [Delete a customer's payment method](https://developer.revolut.com/docs/api/merchant#delete-payment-method)\n:::" } }, "required": [ "date", "payment_method_id" ] } } }