Recurring

Create the payment agreement

To create a Swish payment agreement, provide the following information when calling our payment agreements endpoint:

FieldDescription
paymentMethodSWISH
amount.valueThe recurring charge amount in the smallest currency unit. This becomes the authorized amount for all subsequent charges.
consumer.countrySE
authenticationSettingsOne 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.value and amount.currency of 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

  1. Render the QR code using one of the techniques available.
  2. The consumer will scan the QR code to complete the agreement and/or payment.

APP_INTENT

  1. Use the intent system on Android or a similar mechanism on iOS to trigger the URI.
  2. The consumer will be taken to the native app to complete the payment.

APP_NOTIFICATION

  1. Based on the mobile number provided an App Notification is triggered to the consumers payment method App
  2. Based on this mobile notification, the consumer completes payment authentication

Handling the result

SCAN_CODE

  1. Check the agreement and/or payment status and use the Status that you received to display the outcome to the consumer.
    GET /v1/payment-agreements/{agreement-id}
    GET /v1/payment-charges/{paymentChargeId}
  2. Webhooks are also sent to inform you of the agreement and/or payment outcome.
  3. Store the Payment Agreement ID for subsequent payments.

APP_INTENT

  1. Once the consumer has confirmed the payment, they are returned to your app using the mobileIntentUri provided in the initial payment charge creation request.
  2. After the consumer is redirected back to your app, check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the Status that you received to display the payment outcome to the consumer.
  3. Webhooks are also sent to inform you of the payment outcome.

APP_NOTIFICATION

  1. Once the consumer completes the payment authentication in the app, they are returned to your checkout page.
  2. Check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the Status that you received to display the payment outcome to the consumer.
  3. 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.

Did this page help you?