Recurring
Create the payment agreement
To create a Swish payment agreement, provide the following information when calling our payment agreements endpoint:
| Field | Description |
|---|---|
paymentMethod | SWISH |
amount.value | The recurring charge amount in the smallest currency unit. This becomes the authorized amount for all subsequent charges. |
consumer.country | SE |
authenticationSettings | One of the three supported authentication methods: APP_NOTIFICATION, SCAN_CODE and/or APP_INTENT. |
You can also include the initialPaymentCharge object in this agreement creation call to immediately initiate the first payment without making a separate call. If you include this object, you'll need to specify:
- The exact
amount.valueandamount.currencyof the first payment.
If you don't include an initialPaymentCharge during agreement creation, you'll need to make a separate API call to the payment agreement charge endpoint to create the first charge.
Request
POST /v1/payment-agreements
{
"paymentMethod": "SWISH",
"amount": {
"value": 1500,
"currency": "SEK"
},
"consumer": {
"country": "SE"
},
"authenticationSettings": [
{
"type": "SCAN_CODE",
"settings": {}
}
]
}{
"paymentMethod": "SWISH",
"amount": {
"value": 1500,
"currency": "SEK"
},
"consumer": {
"country": "SE"
},
"authenticationSettings": [
{
"type": "SCAN_CODE",
"settings": {}
}
],
"initialPaymentCharge": {
"amount": {
"value": 100,
"currency": "SEK"
},
"merchantPaymentChargeReference": "Acme - Order 12345"
}
}Response
You'll receive our standard payment agreement response:
{
"id": "agr_BNYU6U4SlWFbV1ACEKZ8a",
"status": "AUTHENTICATION_PENDING",
"paymentMethod": "SWISH",
"startDate": "2026-10-29T18:36:29.033Z",
"amount": {
"value": 1500,
"currency": "SEK"
},
"instrumentId": "instr_JrDrz8YFX800SwuJUIAQC",
"consumer": {
"country": "SE"
},
"authenticationMethods": [
{
"details": {
"codeType": "QR",
"codeImage": "https://redirect.ppro.com/v0/qr-codes?redirection_token=eyJhbGciOiJIUzUxMiJ9",
"codePayload": "https://app.swish.nu/1/r/sw/?sw=D007B1528ADE48F29A7996283F24DCAF"
},
"type": "SCAN_CODE"
}
],
"history": [
{
"id": "ahist_y2iPPeYmbeObeXjCjqXOy",
"status": "AUTHENTICATION_PENDING",
"createdAt": "2026-10-29T18:36:29.290Z"
}
],
"revocations": [],
"createdAt": "2026-10-29T18:36:29.290Z",
"updatedAt": "2026-10-29T18:36:29.290Z"
}{
"id": "agr_2k32DhRC7JuiMmilAGjeB",
"status": "AUTHENTICATION_PENDING",
"paymentMethod": "SWISH",
"startDate": "2026-10-29T18:36:03.599Z",
"amount": {
"value": 1500,
"currency": "SEK"
},
"instrumentId": "instr_6ZNc1YmytrFUep5PASkPs",
"consumer": {
"country": "SE"
},
"authenticationMethods": [
{
"details": {
"codeType": "QR",
"codeImage": "https://redirect.ppro.com/v0/qr-codes?redirection_token=eyJhbGciOiJIUzUxMiJ9",
"codePayload": "https://app.swish.nu/1/r/sw/?sw=FDAB1B50958C4083B3ADFF23140211CD"
},
"type": "SCAN_CODE"
}
],
"history": [
{
"id": "ahist_ijkiTzjXxz1NvLHK8sLFb",
"status": "AUTHENTICATION_PENDING",
"createdAt": "2026-10-29T18:36:03.892Z"
}
],
"revocations": [],
"createdAt": "2026-10-29T18:36:03.892Z",
"updatedAt": "2026-10-29T18:36:03.892Z"
}Pick the desired authentication method
SCAN_CODE
- Render the QR code using one of the techniques available.
- The consumer will scan the QR code to complete the agreement and/or payment.
APP_INTENT
- Use the intent system on Android or a similar mechanism on iOS to trigger the URI.
- The consumer will be taken to the native app to complete the payment.
APP_NOTIFICATION
- Based on the mobile number provided an App Notification is triggered to the consumers payment method App
- Based on this mobile notification, the consumer completes payment authentication
Handling the result
SCAN_CODE
- Check the agreement and/or payment status and use the
Statusthat you received to display the outcome to the consumer.
GET /v1/payment-agreements/{agreement-id}
GET /v1/payment-charges/{paymentChargeId} - Webhooks are also sent to inform you of the agreement and/or payment outcome.
- Store the Payment Agreement ID for subsequent payments.
APP_INTENT
- Once the consumer has confirmed the payment, they are returned to your app using the
mobileIntentUriprovided in the initial payment charge creation request. - After the consumer is redirected back to your app, check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the
Statusthat you received to display the payment outcome to the consumer. - Webhooks are also sent to inform you of the payment outcome.
APP_NOTIFICATION
- Once the consumer completes the payment authentication in the app, they are returned to your checkout page.
- Check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the
Statusthat you received to display the payment outcome to the consumer. - Webhooks are also sent to inform you of the payment outcome.
Create a recurring payment
To initiate a subsequent recurring payment, send a request against an active agreement using our payment agreements API. No further consumer authentication is required — the shopper is not redirected to the Swish app again.
Request
POST /v1/payment-agreements/agreementId/payment-charges
{
"amount": {
"value": 1999,
"currency": "SEK"
}
}Response
The charge returns AUTHORIZATION_ASYNC immediately; it then completes asynchronously.
{
"id": "charge_bP3r2Xxdy02fF31fVhnNg",
"paymentMethod": "SWISH",
"currency": "SEK",
"country": "SE",
"instrumentId": "instr_a1eqs9w5upxXgq5iTgbmz",
"status": "CAPTURED",
"consumer": {
"name": "John Smith",
"email": "[email protected]",
"phone": "+46701234567",
"country": "SE",
"merchantConsumerReference": "MC-234235423452"
},
"authorizations": [
{
"id": "authz_RvwG9SEaxe51Ku72QFirt",
"amount": 1999,
"status": "AUTHORIZED",
"createdAt": "2026-10-15T20:27:42.248Z",
"updatedAt": "2026-10-15T20:27:42.248Z"
}
],
"captures": [
{
"id": "capture_1ADkmpX3v4nSCsw9EPxan",
"amount": 1999,
"status": "CAPTURED",
"createdAt": "2026-10-15T20:27:42.654Z",
"updatedAt": "2026-10-15T20:27:42.654Z"
}
],
"refunds": [],
"voids": [],
"createdAt": "2026-10-15T20:27:41.023Z",
"updatedAt": "2026-10-15T20:27:42.654Z"
}Additional Information
Before you go live
- This feature requires a Swish Number provisioned through the onboarding process. If this hasn’t been set up for your account yet, contact your PPRO Account Manager to complete this setup.
- Request the PPRO Account Manager for the staging account to test in Sandbox.
Updated about 8 hours ago