Repeat payments
Take further payments from a card on our payment page using the Repeat request. Use recurring payments for subscriptions and instalment payments for a fixed series, such as repaying a loan.
The hosted session that establishes the series sets either transaction.recurring or transaction.instalment to true. Once the session has completed, each subsequent Repeat request references the transactionId of that original transaction:
POST /acceptor/rest/transactions/{instId}/{transactionId}/repeat
We automatically classify the initial and subsequent transactions under the Stored Credentials Framework. If the card scheme returns a scheme reference, we store it with the original transaction and presents it on subsequent repeats.
You are responsible for obtaining the cardholder's agreement and managing the timing of recurring and instalment payments. You can do this in your own system or include a schedule in the request.
Recurring payments
Use recurring payments when the number or total value of payments is not fixed in advance, such as an ongoing subscription.
Set transaction.recurring to true on the session that initiates the series, whether it is a payment, a pre-authorisation or an account verification. For a series using 3D Secure 2, also provide continuousAuthorityAgreement.expiry and continuousAuthorityAgreement.minFrequency.
Payment session initiating a recurring series
POST /hosted/rest/sessions/{instId}/payments{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/payments" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjr0rN8Vx0bKf1Iw7bNSCQED",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjr0rN8Vx0bKf1Iw7bNSCQED/begin/SMjr0rN8Vx0bKf1Iw7bNSCQED",
"status": "SUCCESS"
}The same applies to a pre-authorisation, which adds transaction.deferred, and to an account verification, which is sent to /verify with verification.acquirerPaymentMethod and carries no amount.
Pre-authorisation session initiating a recurring series
POST /hosted/rest/sessions/{instId}/payments{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"deferred": true,
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/payments" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"deferred": true,
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjrS7UD2tImEO0TLkHgecm7y",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjrS7UD2tImEO0TLkHgecm7y/begin/SMjrS7UD2tImEO0TLkHgecm7y",
"status": "SUCCESS"
}Verification session initiating a recurring series
POST /hosted/rest/sessions/{instId}/verify{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP"
},
"merchantReference": "aReference"
},
"verification": {
"acquirerPaymentMethod": true
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/verify" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"recurring": true,
"continuousAuthorityAgreement": {
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP"
},
"merchantReference": "aReference"
},
"verification": {
"acquirerPaymentMethod": true
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjrkMnf3KHKEq4KPGWkkkQsC",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjrkMnf3KHKEq4KPGWkkkQsC/begin/SMjrkMnf3KHKEq4KPGWkkkQsC",
"status": "SUCCESS"
}minFrequency is the minimum expected number of days between payments and must be at least 1. expiry is the future date, in YYYY-MM-DD format, when the agreement expires or must be authenticated again. If the agreement details are omitted, 3D Secure 2 is not available for the transaction.
Instalment payments
Use instalment payments when the cardholder agrees to a fixed number of payments, such as repaying a loan.
Set transaction.instalment to true on the session that initiates the series. For a series using 3D Secure 2, provide continuousAuthorityAgreement.expiry, continuousAuthorityAgreement.minFrequency and continuousAuthorityAgreement.numberOfInstalments.
Payment session initiating an instalment series
POST /hosted/rest/sessions/{instId}/payments{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/payments" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjrvyyYEOMQSouAXtpu3AUgx",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjrvyyYEOMQSouAXtpu3AUgx/begin/SMjrvyyYEOMQSouAXtpu3AUgx",
"status": "SUCCESS"
}Pre-authorisation session initiating an instalment series
POST /hosted/rest/sessions/{instId}/payments{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"deferred": true,
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/payments" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"deferred": true,
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP",
"amount": {
"fixed": 25.00
}
},
"merchantReference": "aReference"
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjrOcFlBKkNnztRanl5cznd8",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjrOcFlBKkNnztRanl5cznd8/begin/SMjrOcFlBKkNnztRanl5cznd8",
"status": "SUCCESS"
}Verification session initiating an instalment series
POST /hosted/rest/sessions/{instId}/verify{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP"
},
"merchantReference": "aReference"
},
"verification": {
"acquirerPaymentMethod": true
}
}curl -X POST "{targetEnvironmentPath}/hosted/rest/sessions/{instId}/verify" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"session": {
"returnUrl": {
"url": "https://www.example.com/return"
}
},
"transaction": {
"instalment": true,
"continuousAuthorityAgreement": {
"numberOfInstalments": 3,
"expiry": "2030-12-31",
"minFrequency": 30
},
"money": {
"currency": "GBP"
},
"merchantReference": "aReference"
},
"verification": {
"acquirerPaymentMethod": true
}
}'HTTP/1.1 201 Created
{
"sessionId": "SMjriAi80Bf1PotaV9e7rNFHx",
"redirectUrl": "https://secure.mite.pay360.com/hosted/SMjriAi80Bf1PotaV9e7rNFHx/begin/SMjriAi80Bf1PotaV9e7rNFHx",
"status": "SUCCESS"
}numberOfInstalments is the total number of payments in the series, including the initial payment, and must be between 2 and 999.
3D Secure and new sequences
continuousAuthorityAgreement is what makes 3D Secure 2 available when you establish a sequence, and setting one up is a case where a challenge is required: we override any strongCustomerAuthentication.challengeRequested you send in the session request, so expect the cardholder to be challenged on the payment page.
Our payment page redirects the cardholder to our 3D Secure Server, receives them back and resumes the transaction for you, as described in 3D Secure payments — the session requests above need nothing added for it. The authentication result is on the transaction rather than the session status, so retrieve the transaction if you want to see threeDSecure and the receivedSchemeReference we present on later repeats.
The repeats that follow are merchant-initiated: they reference the stored credential rather than the cardholder, so they are not authenticated again.
Retrieve the transaction id
Repeats need the transaction id of the initiating transaction, which you get by retrieving the session status once the session has completed with a successful transaction: the id is in hostedSessionStatus.transactionState.id.
Repeat the original transaction
Send an empty JSON object to repeat the original amount, currency and payment type. Use the initiating transaction's transactionId, not the ID of a previous repeat.
Repeat a recurring payment
POST /acceptor/rest/transactions/{instId}/{transactionId}/repeat{}curl -X POST "{targetEnvironmentPath}/acceptor/rest/transactions/{instId}/{transactionId}/repeat" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{}'HTTP/1.1 201 Created
{
"processing": {
"model": "MANAGE",
"authResponse": {
"statusCode": "00",
"acquirerName": "Barclays Merchant Services",
"message": "AUTH CODE:958261",
"authCode": "958261",
"gatewayReference": "d64a53c63da7e0831597a3441d2668bc",
"gatewayMessage": "AUTH CODE:958261",
"avsAddressCheck": "FULL_MATCH",
"avsPostcodeCheck": "FULL_MATCH",
"cv2Check": "NOT_CHECKED",
"status": "AUTHORISED"
},
"route": "CPE"
},
"paymentMethod": {
"registered": false,
"card": {
"cardFingerprint": "l313hfHapXJiLXyROD3X6P75k9E=",
"new": false,
"cardType": "VISA_DEBIT",
"cardUsageType": "DEBIT",
"cardScheme": "VISA",
"cardCategory": "DEBIT",
"maskedPan": "990200******0018",
"expiryDate": "1230",
"issuer": "PAY360 TESTING",
"issuerCountry": "GBR",
"cardHolderName": "John Smith"
},
"billingAddress": {
"line1": "21 A Street",
"city": "Bath",
"postcode": "BA1 234",
"country": "United Kingdom",
"countryCode": "GBR"
},
"paymentClass": "CARD",
"reuse": {
"storage": "EXISTING",
"agreement": "RECURRING",
"originalSchemeReference": "YJK9YTUKIJRW13",
"receivedSchemeReference": "A1OHYGY38NQG1Y"
}
},
"customFields": {
"fieldState": []
},
"transaction": {
"transactionId": "10253950372",
"deferred": false,
"recurring": true,
"status": "SUCCESS",
"stage": "COMPLETE",
"type": "REPEAT",
"amount": 100.0,
"consumerSpend": 100.0,
"currency": "GBP",
"transactionTime": "2026-09-02T17:16:52.874+01:00",
"receivedTime": "2026-09-02T17:16:52.874+01:00",
"relatedTransaction": {
"transactionId": "10253950366",
"merchantRef": "SUB-0001"
},
"customerInitiated": false
},
"outcome": {
"status": "SUCCESS",
"reasonCode": "S100",
"reasonMessage": "Authorised"
},
"trace": "TRgYWhUuLhAuOWMeKKZVgfg",
"link": [
{
"href": "https://api.mite.pay360.com/acceptor/rest/transactions/5315271/10253950372",
"rel": "transaction"
},
{
"href": "https://api.mite.pay360.com/acceptor/rest/transactions/5315271/10253950366",
"rel": "related-transaction"
}
]
}A successful response has transaction type REPEAT, identifies the original transaction in transaction.relatedTransaction, and reports the stored-credential agreement as RECURRING or INSTALMENT in paymentMethod.reuse.agreement.
To change details for this repeat, include a transaction object. You can provide a different amount, currency, merchantRef, description, commerceType or channel. Values you omit are inherited from the original transaction.
In the case you started the sequence with an account verification, you will need to provide the amount for the repeat.
Repeat an instalment for a different amount
POST /acceptor/rest/transactions/{instId}/{transactionId}/repeat{
"transaction": {
"amount": 10
}
}curl -X POST "{targetEnvironmentPath}/acceptor/rest/transactions/{instId}/{transactionId}/repeat" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"transaction": {
"amount": 10
}
}'HTTP/1.1 201 Created
{
"processing": {
"model": "MANAGE",
"authResponse": {
"acquirerName": "RBS Worldpay",
"message": "Approved",
"gatewayReference": "111gbp5026c24a336797dACeeee10z00",
"gatewayCode": "000.000.000",
"gatewayMessage": "Transaction succeeded",
"status": "AUTHORISED"
},
"decision": {
"decisionResult": "PROCEED",
"decisionSource": "RULE",
"requestedType": "REPEAT",
"decidedType": "REPEAT",
"rulesTriggered": [],
"decisionReason": "NO_RULES_TRIGGERED"
},
"route": "PAYON"
},
"paymentMethod": {
"registered": false,
"card": {
"cardFingerprint": "Q1MtNzhlNjFjMDUtMWRkZC00ODExLTgzOTMtYTRmM2E0ZWM1MWM1",
"new": false,
"cardType": "VISA_DEBIT",
"cardUsageType": "DEBIT",
"cardScheme": "VISA",
"cardCategory": "DEBIT",
"maskedPan": "990200******0018",
"expiryDate": "1229",
"issuer": "PAY360 TESTING",
"issuerCountry": "GBR",
"cardHolderName": "John Smith"
},
"billingAddress": {},
"paymentClass": "CARD",
"reuse": {
"storage": "EXISTING",
"agreement": "INSTALMENT"
}
},
"customFields": {
"fieldState": []
},
"transaction": {
"transactionId": "13420710647",
"deferred": false,
"instalment": true,
"status": "SUCCESS",
"stage": "COMPLETE",
"type": "REPEAT",
"amount": 10.0,
"consumerSpend": 10.0,
"currency": "GBP",
"transactionTime": "2026-09-02T17:34:49.874+01:00",
"receivedTime": "2026-09-02T17:34:49.874+01:00",
"relatedTransaction": {
"transactionId": "13420710645",
"merchantRef": "TXN-0002"
},
"customerInitiated": false
},
"outcome": {
"status": "SUCCESS",
"reasonCode": "S100",
"reasonMessage": "Authorised"
},
"trace": "TcwFUPzbBdfiCwHsRjtKs4Q",
"link": [
{
"href": "https://api.mite.pay360.com/acceptor/rest/transactions/200000/13420710647",
"rel": "transaction"
},
{
"href": "https://api.mite.pay360.com/acceptor/rest/transactions/200000/13420710645",
"rel": "related-transaction"
}
]
}Change the repeat type
A repeat from a recurring series can be processed as an instalment by setting transaction.instalment to true:
{
"transaction": {
"instalment": true
}
}
A repeat from an instalment series can be processed as recurring by setting transaction.recurring to true:
{
"transaction": {
"recurring": true
}
}
The override applies to that request. Continue to reference the original transaction when submitting later repeats.
Request a repeat with a schedule
Include a schedule when you want to automate future repeats rather than submitting each Repeat request from your own scheduling system.
Create Schedule while Requesting repeat
POST /acceptor/rest/transactions/{instId}/{transactionId}/repeat{
"schedule" : {
"startDate":"2031-09-15",
"timeOfDay":"12:00:00",
"fixed": ["2031-09-15","3031-11-15"],
"terminator":{
"episodeLimit":5,
"endOn":"3031-11-15",
"suspend":{
"failureCount":3
}
},
"retry":{
"unit": "DAY",
"quantity": 1,
"maxRetries":3,
"processWhileRetrying":false,
"catchupAfterRetrying":true
}
}
}curl -X POST "{targetEnvironmentPath}/acceptor/rest/transactions/{instId}/{transactionId}/repeat" \
-u "{apiUser}:{apiPassword}" \
-H "Content-Type: application/json" \
-d '{
"schedule" : {
"startDate":"2031-09-15",
"timeOfDay":"12:00:00",
"fixed": ["2031-09-15","3031-11-15"],
"terminator":{
"episodeLimit":5,
"endOn":"3031-11-15",
"suspend":{
"failureCount":3
}
},
"retry":{
"unit": "DAY",
"quantity": 1,
"maxRetries":3,
"processWhileRetrying":false,
"catchupAfterRetrying":true
}
}
}'HTTP/1.1 201
{
"processing": {
"model": "MANAGE",
"authResponse": {
"acquirerName": "FDMS International",
"gatewayReference": "111gbpfa2941311412749ACee1000z00",
"gatewayCode": "000.000.000",
"gatewayMessage": "Transaction succeeded",
"status": "AUTHORISED"
},
"route": "PAYON"
},
"paymentMethod": {
"registered": false,
"card": {
"cardFingerprint": "Q1MtYTRiZGIzODYtYzQ2My00NTRlLTljZjYtYzY0OTEzZjUwMmVj",
"new": false,
"cardType": "VISA_CREDIT",
"cardUsageType": "CREDIT",
"cardScheme": "VISA",
"cardCategory": "CREDIT",
"maskedPan": "990300******5131",
"expiryDate": "0130",
"issuer": "PAY360 TESTING",
"issuerCountry": "GBR",
"cardHolderName": "John Smith"
},
"paymentClass": "CARD",
"reuse": {
"storage": "EXISTING",
"agreement": "INSTALMENT",
"originalSchemeReference": "111gbp2633976043a3f84FMee1000z00",
"receivedSchemeReference": "111gbpfa2941311412749ACee1000z00"
}
},
"transaction": {
"transactionId": "10393828218",
"deferred": false,
"instalment": true,
"status": "SUCCESS",
"stage": "COMPLETE",
"type": "REPEAT",
"amount": 1000,
"consumerSpend": 1000,
"currency": "GBP",
"transactionTime": "2020-11-13T16:02:32.261Z",
"receivedTime": "2020-11-13T16:02:32.261Z",
"relatedTransaction": {
"transactionId": "10393828217"
},
"customerInitiated": false
},
"outcome": {
"status": "SUCCESS",
"reasonCode": "S100",
"reasonMessage": "Authorised"
},
"schedule": {
"scheduleId": "GUID123456789010"
}
}Some of the repeat options can also be handled from the merchant portal, so you can choose not to integrate these endpoints and use the UI instead.