STEP_UP_REQUIRED initial response, manages the step-up flow, and securely stores the token for future use.STEP_UP_REQUIRED because customer consent is always required for tokenizationpayment_request_url to the Partnercustomer_token. No further API call is needed. The Acquiring Partner securely stores the customer token issued by Klarna, maps it to an internal identifier, and returns that internal customer token identifier to the Partner.customer_token and a klarna_network_session_token. The Acquiring Partner calls the Payment Authorize API again with the klarna_network_session_token to complete the initial Payment Authorization. Klarna returns the final result (APPROVED or DECLINED). The Acquiring Partner then securely stores the customer token issued by Klarna, maps it to an internal identifier, and returns the internal customer token identifier and payment result to the Partner.| Parameter | Required (Acquiring Partner) | Required (Partner) | Description |
|---|---|---|---|
currency | Yes | Yes | Currency in ISO 4217 format for future transactions using the token. |
scopes | Yes | Yes | Token scope defining the authorization pattern: payment:customer_present or payment:customer_not_present. See Token Scopes for guidance. |
supplementary_purchase_data | Yes | Recommended | Additional details about the tokenization use case. Include this data to improve fraud assessment and customer communication. |
supplementary_purchase_data.subscriptions | Yes | Conditional | Subscription details including subscription reference, billing plans, and free trial status. Mandatory when the token will be used for subscription charges, i.e. when token scope = payment:customer_not_present. |
supplementary_purchase_data.ondemand_service | Yes | Conditional | On-demand service details describing the service the token will be used for. Mandatory when the token will be used for on-demand charges, i.e. when token scope = payment:customer_present. |
supplementary_purchase_data.customer | Yes | Recommended | Information about the customer based on their previous interactions with the Partner. Used by Klarna to simplify sign-up and for fraud assessment. |
klarna_network_session_token | Yes | Conditional | Encodes Klarna Network Session Token context (prequalification, sign-in state, or approval). Optional on the initial tokenization request; required for finalization after step-up completion. |
klarna_network_data | Yes | Recommended | Additional data to enable custom features or data exchange supported by the Partner. Klarna accepts this passthrough field in a structured JSON format and forwards it to relevant systems for interoperability. Treat this value as an opaque string; do not validate or infer its structure. |
return_url | Yes | Recommended | URL to redirect the customer after completing the step-up flow. Recommended for web flows. |
app_return_url | Yes | Recommended | Mobile application return URL (app scheme with no action deeplink). The customer will be redirected to this URL after third-party redirects. Recommended for mobile app flows. |
payment:customer_present and payment:customer_not_present.klarna_network_session_token and klarna_network_data in the Partner-facing API to ensure Partners can easily identify and use them.scopes.supplementary_purchase_data when calling Klarna.| Do | Don't |
|---|---|
Map existing line items into supplementary_purchase_data.line_items. | Introduce a parallel line-item structure such as klarna_line_items. |
Map existing customer details into supplementary_purchase_data.customer. | Duplicate customer fields you already collect from Partners. |
Map existing shipping data into supplementary_purchase_data.shipping. | Add a separate shipping object "just for Klarna". |
Map your existing purchase reference into supplementary_purchase_data.purchase_reference. | Force Partners to submit the same purchase reference twice. |
klarna_network_data: Forward as received without parsing or mappingsupplementary_purchase_data object when calling authorizePaymentrequest_customer_token with desired scopesrequest_payment_transaction or amount in the requestsupplementary_purchase_data describing the intended use casestep_up_config with HANDOVER to allow customer consent collectionPOST /v2/accounts/{partner_account_id}/payment/authorize
Content-Type: application/json
Klarna-Network-Session-Token: krn:network:us1:test:session-token:eyJhbGciOiJIU[...]
{
"currency": "USD",
"request_customer_token": {
"scopes": ["payment:customer_not_present"],
"customer_token_reference": "subscription-user-12345"
},step_up_config.customer_interaction_config.interaction_expiry to override the default 3-hour Payment Request lifetime. See Custom Payment Request expiry.STEP_UP_REQUIRED for tokenization requests.customer_token_response, and if an initial Payment Authorization was also requested, a payment_transaction_response will be included as well.| Result | Description | Next steps |
|---|---|---|
STEP_UP_REQUIRED | Customer consent is always required for tokenization. Klarna creates a payment_request containing the payment_request_url for the Klarna Purchase Journey. | Return the payment_request_url to the Partner to redirect the customer. Customer interaction is required to complete tokenization. |
customer_token_response.result: STEP_UP_REQUIREDpayment_request object containing:
payment_request_id: Unique identifier for the step-up requestpayment_request_url: URL to launch the Klarna Purchase Journey{
"customer_token_response": {
"result": "STEP_UP_REQUIRED"
},
"payment_request": {
"payment_request_id": "krn:payment:us1:request:bcb5ca7d-[...]",
"payment_request_reference": "acquiring-partner-request-reference-1234",
"expires_at": "2026-04-01T19:53:15.738Z",
"created_at": "2026-04-01T16:53:15.738Z",
"updated_at": "2026-04-01T16:53:15.738Z",step_up_config when calling authorizePaymentcustomer_interaction_config object, tell Klarna where to redirect the customer after they complete or stop the Klarna Purchase Journey.return_url after they finish — whether they complete or stop the flow. This can be a URL managed by the Acquiring Partner (which handles redirection logic) or one collected directly from the Partner.app_return_url brings the customer back to the Partner's mobile app when this happens.yourapp://klarna) or a universal link that resumes the payment flow. Klarna invokes this URL after the customer completes a native app-based step, such as biometric authentication or Klarna app login. Partners are expected to resume the mobile app in its last state without applying state changes or deep link navigations.return_url and app_return_url are not mutually exclusive. Depending on the device and environment, either or both may be triggered:| Scenario | Description |
|---|---|
| Pure web flow | The customer starts the Klarna Purchase Journey in a desktop browser. After completing the flow, Klarna redirects them to return_url. |
| App-to-app flow | The Partner's native app opens the Klarna Purchase Journey using a universal link. If the Klarna app is installed, the customer goes directly into it. After completion, Klarna redirects them to app_return_url. |
| WebView flow with app handover | The Partner's native app starts the Klarna Purchase Journey in a System WebView. If the customer must authenticate via an external banking app, app_return_url returns them to the Partner's app mid-flow. They then resume in the WebView and, on completion, are redirected to return_url. |
return_url or app_return_url from the Partner, do not request a second one — this would increase the minimum integration requirements for Klarna to work.payment_request_url and/or a klarna_network_response_data parameter.payment_request_url MUST be returned directly to the Partner in an existing field and MUST NOT be wrapped or hidden behind Acquiring Partner-managed redirects.klarna_network_response_data in the Partner-facing API to ensure Partners can easily identify and use the parameter. Treat this value as an opaque string; do not validate or infer its structure.klarna_network_response_data parameter in their Partner-facing APIs depending on the authorization outcome.{
"payment_id": "pr_27234RBQD9NAKD032BN",
"amount": 17800,
"currency": "USD",
"status": "open",
"url": "https://pay.test.klarna.com/na/requests/aeba9923-[...]/start",
"additional_data": {
"klarna_network_response_data": "{\"content_type\":\"vnd.klarna.network-data.v2+json\",\"content\":{\"operation\":\"payment_request\",\"response\":{\"result\":\"STEP_UP_REQUIRED\",\"payment_request\":{\"payment_request_id\":\"krn:payment:us1:request:10b51071-[...]\",\"payment_request_url\":\"https://pay.test.klarna.com/na/requests/aeba9923-[...]/start\"}}}}"
}
}payment_request_url, the Partner will handle the step-up scenario and launch the Klarna Purchase Journey (see Step 5).payment_request_url directly to Partners rather than routing through an Acquiring Partner-owned URL.| Issue | Impact |
|---|---|
| Reduced app handover success | Cross-domain redirects reduce the likelihood of a successful handover to the Klarna app, negatively impacting Klarna's purchase conversion rate. |
| Incompatibility with Klarna web SDK integration | Not compatible with Partners using the Klarna web SDK for pop-up flows on websites or app-to-app handoff in native mobile apps. |
| Network issues | Frontend redirects expose customers to network issues. |
STEP_UP_REQUIRED result along with a Payment Request containing the payment_request_url and klarna_network_response_data which the Partner needs in order to launch the Klarna Purchase Journey, either through a redirect or a pop-up experience.
customer_token from klarna_customer.customer_token in the webhook payload, store it securely, and return the internal token identifier to the Partner. No further API call is needed.klarna_network_session_token from the webhook to call the Payment Authorize API and complete the initial Payment Authorization, then store the customer_token securely (Step 6).payment.request.state-change.completed webhook arrives, tokenization is complete — the customer_token is available in the payload regardless of scenario. For the Tokenization only scenario, no further API call is needed: store the token and return the result to the Partner. For the Tokenization combined with authorization scenario, proceed to Step 6 to finalize the initial Payment Authorization.payment.request.state-change.completed webhook event using the Klarna webhook guidelines. Klarna sends this event when the Payment Request reaches the COMPLETED state.{
"metadata": {
"event_type": "payment.request.state-change.completed",
"event_id": "d9f9b1a0-5b1a-4b0e-9b0a-9e9b1a0d5b1a",
"event_version": "v2",
"occurred_at": "2026-04-01T16:55:17Z",
"correlation_id": "2d1557e8-17c3-466c-924a-bbc3e91c2a02",
"subject_account_id": "krn:partner:global:account:test:HGBY07TR",
"recipient_account_id": "krn:partner:global:account:test:LWT2XJSE",
"product_instance_id": "krn:partner:product:payment:ad71bc48-8a07-[...]",COMPLETED state, the token(s) are available in the state_context object of the Payment Request.{
"payment_request_id": "krn:payment:us1:request:bcb5ca7d-[...]",
"state": "COMPLETED",
"previous_state": "IN_PROGRESS",
"state_context": {
"klarna_customer": {
"customer_token": "krn:partner:us1:test:identity:customer-token:Rt4iBjqKBM[...]",
"customer_token_reference": "subscription-user-12345"
}
},customer_token is delivered in the webhook payload.klarna_network_session_token in the Klarna-Network-Session-Token request headeramount, currency, supplementary_purchase_data, klarna_network_data) used in the initial requestpayment_transaction_reference to link the requestscurl https://api-global.test.klarna.com/v2/accounts/{partner_account_id}/payment/authorize \
-H 'Authorization: Basic <API key>' \
-H 'Content-Type: application/json' \
-H 'Klarna-Network-Session-Token: krn:network:us1:test:session-token:eyJhbGciOiJFU[...]' \
-d '{
"currency": "USD",
"request_payment_transaction": {
"amount": 999,
"payment_option_id": "S0xBUk5BXzE3NzI3MjQ5MTQzMjk=",
"payment_transaction_reference": "subscription-first-payment-001"klarna_network_session_token has expired (1-hour validity) or the payment context doesn't match the initial request, the finalization call returns DECLINED.payment_transaction_response:| Result | Description | Next steps |
|---|---|---|
APPROVED | The Payment Authorization succeeded and a payment_transaction was created. The customer_token is returned in customer_token_response and is ready for future use. | Store the customer_token securely and return the payment result to the Partner. |
DECLINED | The Payment Authorization failed. No payment_transaction was created. The customer_token is still returned in customer_token_response and is valid for future use. | Return the failure result to the Partner. Store the customer_token securely — it remains valid despite the Payment Authorization failure. |
{
"payment_transaction_response": {
"result": "APPROVED",
"payment_transaction": {
"payment_transaction_id": "krn:payment:us1:transaction:5cb3e0e5-a6f0-[...]",
"amount": 999,
"currency": "USD",
"payment_pricing": { "..." : "..." },
"payment_funding": {
"type": "GUARANTEED",klarna_network_response_data.klarna_network_response_data in the Partner-facing API to ensure Partners can easily identify and use the parameter.klarna_network_response_data parameter in their Partner-facing APIs.{
"payment_id": "pr_27234RBQD9NAKD032BN",
"amount": 999,
"currency": "USD",
"status": "completed",
"additional_data": {
"klarna_network_response_data": "{\"content_type\":\"vnd.klarna.network-data.v2+json\",\"content\":{\"operation\":\"payment_request\",\"response\":{\"result\":\"APPROVED\",\"payment_transaction\":{\"payment_transaction_id\":\"krn:payment:us1:transaction:5cb3e0e5-a6f0-[...]\"}}}}"
}
}