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"
descriptorstring
Nullable

Optional descriptor applied to each payment session created from the multi-link. It overrides the Point of Sale descriptor unless the acquirer agreement has its own descriptor.

Descriptor override must be enabled for your account before you send this field. Contact ePay to enable it.

Length:
1 <= length <= 22
Example:
"Store Copenhagen"

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",    "descriptor": "Store Copenhagen",    "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"}