Looking for ePay classic docs? Go to docs.epay.dk
ePay documentationDocsePay documentation
Payment Links

Create Multi-Link

OpenAPI Spec

Test this endpoint live

Open the same request directly in API Explorer.

Open in API Explorer

Server URL

POST
/public/api/v1/multi-links

Creates a reusable payment link and returns its URL and QR-code URL. Unlike a regular payment link, this endpoint does not create a single payment.

Each time a cardholder opens the returned url or scans the QR code, ePay starts a new, independent payment session from the multi-link configuration. This is useful for a reusable checkout QR code - for example, a QR code where the cardholder enters the amount and completes payment with Vipps MobilePay.

Configuration omitted from the request is resolved from the point of sale's current configuration when the multi-link is used. Redirect and notification URLs are not inherited; provide them explicitly when they are needed. URL values, including order-line image URLs, must use a domain registered for the selected point of sale.

Authorization

BearerAuth
AuthorizationBearer <token>

In: header

Header Parameters

Idempotency-Keystring

Ensures that a request can be safely retried without causing duplicate operations. Typically used for actions like payment creation and operations such as refund and void to prevent accidental double processing.

  • If a response is replayed due to using the same key, the response will include the header Idempotent-Replayed: true.
  • Idempotency keys are scoped by [Key, Endpoint, HTTP Verb]; the same key on a different endpoint or method will not replay the original response.
  • Responses are cached for 24 hours. After that, the cache is cleared, so idempotency is only guaranteed within 24 hours of the initial request.

Request Body

application/json

The reusable payment-session configuration for the multi-link.

TypeScript Definitions

Use the request body type in TypeScript.

Configuration used to create a reusable multi-link. Every use of the multi-link creates a new payment session with this configuration.

pointOfSaleIdstring
Required

The ID of the point of sale that owns the multi-link and its payment sessions.

Format:
uuid
Example:
"0192473a-e381-705c-b61c-fc2ac9624afc"
amountinteger
Required

The default payment amount in minor units, such as 1095 for 10.95 DKK. When dynamicAmount is enabled, the cardholder can replace this amount.

Example:
1095
currencystring
Required

The ISO 4217 alpha-3 currency code for every payment session started from the multi-link.

Match:
^[A-Z]{3}$
Example:
"DKK"

Optional subscription settings used whenever the multi-link starts a payment session.

scaModestring
Nullable

How 3-D Secure is handled for each payment session. SKIP does not attempt 3-D Secure, NORMAL follows the normal 3-D Secure flow, and FORCE requests a challenge flow.

Possible values:
"SKIP""NORMAL""FORCE"
Example:
"NORMAL"
timeoutinteger
Nullable

The number of minutes each payment session remains usable after the cardholder opens the multi-link.

Range:
1 <= value <= 120
Example:
30
instantCapturestring
Nullable

The instant-capture behavior for payments made through the multi-link. VOID voids the authorization if capture fails, while NO_VOID keeps it.

Possible values:
"OFF""VOID""NO_VOID"
Example:
"OFF"
textOnStatementstring
Nullable

The text shown for the payment on the cardholder's statement. It defaults to the ePay transaction ID when omitted.

Length:
1 <= length <= 39
Example:
"Store purchase"

Merchant-defined pass-through attributes included in webhooks for payment sessions created from the multi-link. The serialized value is limited to 1 KB.

reportFailureboolean
Nullable

Whether to send notification callbacks for failed payment attempts.

Example:
false
reportExpiredboolean
Nullable

Whether to send a notification callback when a payment session expires.

Example:
false
dynamicAmountboolean
Nullable

Whether cardholders may enter the payment amount after opening the multi-link. This feature must be enabled for the account.

Example:
true
notificationUrlstring
Nullable

The registered point-of-sale URL that receives payment-status notifications for sessions created from the multi-link. Omit it to use the ePay receipt page instead of inheriting a hosted-configuration URL.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/payment-notifications"
preAuthUrlstring
Nullable

The registered point-of-sale URL that receives pre-authorization callbacks for each payment attempt.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/pre-authorizations"
successUrlstring
Nullable

The registered point-of-sale URL to which the cardholder is redirected after a successful payment.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/payment-success"
returnUrlstring
Nullable

The registered point-of-sale URL to which the cardholder returns after selecting Back in the payment window.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/payment-return"
failureUrlstring
Nullable

The registered point-of-sale URL to which the cardholder is redirected when no payment attempts remain.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/payment-failure"
retryUrlstring
Nullable

The registered point-of-sale URL to which the cardholder is redirected after a failed attempt when more attempts remain.

Format:
uri
Length:
1 <= length <= 1024
Example:
"https://example.com/payment-retry"
maxAttemptsinteger
Nullable

The maximum number of payment attempts allowed for each session started from the multi-link.

Range:
1 <= value <= 25
Example:
3

SCA exemptions to apply where available. Using an exemption may shift fraud liability from the issuer to the merchant.

Optional age-verification requirements for payments started from the multi-link. This feature must be enabled for a live account.

Order lines copied to every payment session created from the multi-link.

Items:
items <= 1000

The payment methods available in each payment session. To create a reusable MobilePay-only QR code, specify only VIPPS_MOBILEPAY.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/public/api/v1/multi-links" \  -H "Idempotency-Key: c4f5e8d2-1234-5678-90ab-cdef12345678" \  -H "Content-Type: application/json" \  -d '{    "pointOfSaleId": "0192473a-e381-705c-b61c-fc2ac9624afc",    "amount": 1095,    "currency": "DKK"  }'
{  "multiLink": {    "id": "KSNMWEWZPPA",    "pointOfSaleId": "0192473a-e381-705c-b61c-fc2ac9624afc",    "state": "ACTIVE",    "amount": 1095,    "currency": "DKK",    "subscription": {      "amount": 1095,      "type": "SCHEDULED",      "expiryDate": "2027-12-31",      "interval": {        "period": "MONTH",        "frequency": 1      },      "billingAgreement": {        "billingPlanId": "019a7266-2f3a-7b26-9c93-b950aea9e13c",        "nextChargeAt": "2027-01-01"      }    },    "scaMode": "NORMAL",    "timeout": 30,    "instantCapture": "OFF",    "textOnStatement": "Store purchase",    "attributes": {      "property1": null,      "property2": null    },    "reportFailure": false,    "reportExpired": false,    "dynamicAmount": true,    "notificationUrl": "https://example.com/payment-notifications",    "preAuthUrl": "https://example.com/pre-authorizations",    "successUrl": "https://example.com/payment-success",    "returnUrl": "https://example.com/payment-return",    "failureUrl": "https://example.com/payment-failure",    "retryUrl": "https://example.com/payment-retry",    "maxAttempts": 3,    "exemptions": [      "TRA"    ],    "ageVerification": {      "minimumAge": 18,      "country": "DK"    },    "orderLines": [      {        "description": "Reusable coffee cup",        "imageUrl": "https://example.com/images/reusable-cup.png",        "quantity": 1,        "totalAmount": 1095,        "unitPrice": 1095,        "type": "PHYSICAL"      }    ],    "allowedPaymentMethods": [      "CARD",      "VIPPS_MOBILEPAY"    ],    "createdAt": "2026-04-01T15:04:05Z"  },  "url": "https://payments.epay.eu/ml/KSNMWEWZPPA",  "qrUrl": "https://payments.epay.eu/multi-links/KSNMWEWZPPA/qr.png"}
{  "errorCode": "SERVER_ERROR",  "message": "An unexpected system error"}
{  "errorCode": "VALIDATION_ERROR",  "message": "Input validation errors",  "errors": {    "amount": [      "[required]: Is a required non-nullable field",      "[int]: Must be an integer",      "[min:0]: Must be greater than 0",      "[max:999999999]: Must be less than 999999999"    ]  }}
{  "errorCode": "SERVER_ERROR",  "message": "An unexpected system error"}