Apple Pay Recurring Payments (MPAN)
To process recurring payments with Apple Pay using MPAN (Multi-Use Payment Token), include the recurrenceMetadata object in the order creation within paymentDetails. If the data is sent in the order it will also be returned in the payment callback.
All information regarding accepted formats and descriptions of the new fields is in section 6. Field appendix.
General Validation Rules
recurrenceMetadata is optional, but if included:
intervalUnit,intervalCount,managementUrl, andsubscriptionare mandatory- If both
startDateandendDateare provided,startDatemust be ≤endDate managementUrlmust begin withhttps://
MPAN Creation
Important: If recurrenceMetadata is not included in the Apple Pay payment request, the system will attempt to create a DPAN (Dedicated Payment Account Number) instead of an MPAN.
Regarding recurrenceMetadata for Apple Pay and MPAN creation:
The information provided in the recurrenceMetadata fields is used SOLELY FOR DISPLAY PURPOSES within the Apple Pay interface and for tokenization.
THESE FIELDS DO NOT EXECUTE OR SCHEDULE PAYMENTS.
The recurring payment execution and scheduling must be managed separately through Revup's subscription system or your own recurring payment logic. The MPAN token created through this process can be used for subsequent payments, but the recurrence metadata itself does not trigger automatic billing.
| FIELD | TYPE | REQUIRED | MAX LENGHT / ENUM | VALIDATION RULES | NOTES |
|---|---|---|---|---|---|
| startDate | string | No | ISO-8601 UTC | Must be a valid ISO-8601 UTC string | Optional. If provided, must be ≤ endDate |
| endDate | string | No | ISO-8601 UTC | Must be a valid ISO-8601 UTC string and ≥ startDate | Optional. Can be omitted if subscription is indefinite |
| intervalUnit | string | Yes (if recurrenceMetadata) | "day", "week", "month", "year" | Must be one of the enumerated values | Defines frequency unit |
| intervalCount | integer | Yes (if recurrenceMetadata) | - | Must be ≥ 1 | Number of units per interval (e.g., every 1 month) |
| managementUrl | string | Yes (if recurrenceMetadata) | - | Must be valid HTTPS URL | Used to manage/cancel subscription. Must begin with https:// |
| FIELD | TYPE | REQUIRED | MAX LENGHT / ENUM | VALIDATION RULES | NOTES |
|---|---|---|---|---|---|
| amount | number | No | - | Must be ≥ 0 | Trial charge (typically 0.00) |
| currency | string | No | ISO 4217 (e.g., EUR, USD) | Must be valid ISO 4217 code | Matches payment currency |
| label | string | No | - | Optional descriptive label | e.g., "trial" |
| duration | integer | No | - | Must be ≥ 1 | Length of trial period |
| durationUnit | string | No | "day", "week", "month", "year" | Must be one of the enumerated values | Defines unit of trial duration (e.g., 7 days) |
| FIELD | TYPE | REQUIRED | MAX LENGHT / ENUM | VALIDATION RULES | NOTES |
|---|---|---|---|---|---|
| amount | number | Yes | - | Must be ≥ 0 | Charge per interval |
| currency | string | Yes | ISO 4217 (e.g., EUR, USD) | Must be valid ISO 4217 code | Matches system-supported currencies |
| label | string | Yes | - | Optional descriptive label | e.g., "Basic Plan", "Subscription" |
Additional General Validations
The recurrenceMetadata field is optional, but if it is included:
- intervalUnit, intervalCount, managementUrl, and subscription are required.
- If startDate and endDate are provided, then startDate must be less than or equal to (≤) endDate.
- managementUrl must begin with https://.
Request Body Example - Apple Pay with Recurrence Metadata
{
"money": {
"amount": 49,
"currency": "USD"
},
"concept": "Test concept",
"userInformation": {
"ip": "61.251.115.6",
"email": "qa@1eqa.net",
"country": "es",
"language": "es",
"phone": "666111222",
"billingAddress": {
"name": "Test",
"street": "Testing St.",
"city": "City",
"postcode": "01101",
"country": "US",
"state": "us-al"
},
"browserInformation": {
"userAgentHeader": "userAgent",
"acceptHeader": "accept",
"screenHeight": 1080,
"screenColorDepth": 24,
"enableJava": true,
"windowSize": "max",
"timeZone": 1,
"enableJavaScript": true,
"screenWidth": 720
}
},
"items": [
{
"name": "Test2",
"quantity": 1,
"unitPrice": 27.01,
"sku": "ABCD100",
"url": "https://www.test.com",
"category": "TestCategory",
"tax": 0.21
}
],
"generateToken": true,
"domain": "https://www.test.com",
"customTag": "custom",
"paymentDetails": {
"type": "credit_card_present",
"recurrenceMetadata": {
"startDate": "2026-01-01T15:00:00.000Z",
"intervalUnit": "month",
"intervalCount": 1,
"endDate": "2027-01-01T15:00:00.000Z",
"managementUrl": "https://www.test.com/es",
"trial": {
"amount": 20,
"currency": "USD",
"label": "Trial payment",
"duration": 7,
"durationUnit": "month"
},
"subscription": {
"amount": 20,
"currency": "USD",
"label": "Subscription"
}
}
},
"redirectUrl": {
"success": "https://api.qai.1eqa.net/callback/success",
"fail": "https://api.qai.1eqa.net/callback/failed",
"threeDSChallengeResult": "https://api.qai.1eqa.net/challenge?v=2&chll=done"
},
"purchaseId": "1763452974328",
"threeDSSupport": "no_3ds"
}