customer_ token, redirect the customer to the Klarna Purchase Journey to collect consent, then either store the issued token (tokenization only) or finalize an initial Payment Transaction (tokenization combined with authorization).createPaymentRequest, redirect, webhook, authorizePayment pattern, with one extra parameter (request_ customer_ token) that tells Klarna to issue a token alongside (or instead of) a Payment Transaction.request_ customer_ token and stores the resulting payment_ request_ id.payment. request. state-change. completed and extracts either the customer_ token (tokenization only) or the klarna_ network_ session_ token (tokenization combined with authorization).customer_ token, ready to be reused on subsequent authorizations.payment. request. state-change. completed webhook event.return_ url on the Partner's domain where Klarna can redirect the customer after the Klarna Purchase Journey.request_ customer_ token (and, for the combined flow, an amount) plus customer_ interaction_ config. method = HANDOVER.payment_ request_ id and a payment_ request_ url.payment_ request_ url.payment. request. state-change. completed webhook.state_ context. klarna_ customer. customer_ token) carry the issued customer_ token. Tokenization is complete and no further API call is needed. Acknowledge the event as described in Step 3, then store the token and confirm the outcome as described in Step 5.klarna_ network_ session_ token. Call authorizePaymentKlarna-Network-Session-Token header to create the initial Payment Transaction. The response includes both customer_ token_ response (the issued token) and payment_ transaction_ response (the payment outcome).customer_ interaction_ config describing how Klarna should hand the customer over to the Klarna Purchase Journey. For server-rendered checkouts, set method = HANDOVER and provide a return_ url (and optionally an app_ return_ url for native apps).request_ customer_ token and omit request_ payment_ transaction and amount.| Parameter | Required | Description |
|---|---|---|
currency | Yes | Currency in ISO 4217 format. The token's currency context for future transactions. |
request_ | Yes | Token scope. Use payment:customer_ for subscription / scheduled billing, payment:customer_ for on-demand / one-click. See token scopes. |
request_ | Recommended | The Partner's own reference for the token, used for reconciliation and to link the token to a customer record. |
customer_ | Yes | Set to HANDOVER for the redirect-based server-side flow. The customer must always provide consent for tokenization, so HANDOVER is mandatory here. |
customer_ | Yes | URL on the Partner's domain where Klarna redirects the customer after the Klarna Purchase Journey. |
customer_ | Recommended (mobile) | Application URL scheme that returns the customer to the Partner's native app after a mid-flow handover to a third-party app (such as a bank app or the Klarna app). Not a substitute for return_. |
payment_ | Recommended | The Partner's own reference for the Payment Request, used for reconciliation. |
supplementary_ | Recommended | Additional context describing the tokenization use case. Significantly improves underwriting and powers customer communication. See supplementary purchase data. |
supplementary_ | Conditional | Required when the token will be used for subscription authorizations (scope payment:customer_). Include subscription reference, billing plans, and free-trial status. |
supplementary_ | Conditional | Required when the token will be used for on-demand authorizations (scope payment:customer_). Describes the service the token will be used for. |
supplementary_ | Recommended | Customer context (name, email, address). Used by Klarna to simplify sign-up and for fraud assessment. |
acquiring_ | Conditional | Routes the Payment Request to a specific Payment Account or Payment Acquiring Account. Required when the Partner's Klarna setup includes more than one account. See Payment Request resource. |
curl https://api-global.test.klarna.com/v2/payment/requests \
-H 'Authorization: Basic <API key>' \
-H 'Content-Type: application/json' \
-d '{
"currency": "USD",
"payment_request_reference": "partner-tokenization-reference-1234",
"request_customer_token": {
"scopes": ["payment:customer_not_present"],
"customer_token_reference": "subscription-user-12345"
},SUBMITTED state with the payment_ request_ url to redirect the customer to in Step 2:{
"payment_request_id": "krn:payment:us1:request:bcb5ca7d-9ad4-4cf1-9e34-7311f0d3ab02",
"payment_request_reference": "partner-tokenization-reference-1234",
"currency": "USD",
"state": "SUBMITTED",
"state_context": {
"customer_interaction": {
"method": "HANDOVER",
"payment_request_id": "krn:payment:us1:request:bcb5ca7d-9ad4-4cf1-9e34-7311f0d3ab02",
"payment_request_url": "https://pay.test.klarna.com/na/requests/2cb914b0-[...]/start"customer_ interaction_ config. interaction_ expiry to override the default 3-hour Payment Request lifetime. See Custom Payment Request expiry.payment:customer_ present is for on-demand re-authorizations where the customer is present.payment:customer_ not_ present is for unattended scheduled authorizations.payment_ request_ url returned in Step 1. The Klarna Purchase Journey lets the customer authenticate with Klarna (login, one-time passcode, biometrics), confirm tokenization consent, and (for combined flows) approve the initial payment.return_ url (or app_ return_ url on mobile) provided in customer_ interaction_ config. For tokenization-only flows, the issued customer_ token is delivered via the webhook (Step 3). For combined flows, Klarna also issues a klarna_ network_ session_ token used to finalize the Payment Transaction in Step 4.
return_ url and app_ return_ url set inside customer_ interaction_ config tell Klarna where to send the customer after they complete or stop the Klarna Purchase Journey.return_ urlreturn_ url after they finish, whether they complete or stop the flow.app_ return_ urlapp_ return_ url brings the customer back to the Partner's mobile app when this happens.partnerapp:/ /klarna) that resumes the tokenization flow. Klarna invokes this URL after the customer completes a native app-based step, such as biometric authentication or Klarna app login. 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_. |
| App-to-app flow | The Partner's native app opens the Klarna Purchase Journey using a universal link. When the Klarna app is installed, the customer goes directly into it. After completion, Klarna redirects them to app_. |
| WebView flow with app handover | The Partner's native app starts the Klarna Purchase Journey in a System WebView. When the customer must authenticate via an external banking app, app_ returns them to the Partner's app mid-flow. They then resume in the WebView and, on completion, are redirected to return_. |
COMPLETED and notifies the Partner via webhook. The payload differs by scenario.payment. request. state-change. completed webhook (required)COMPLETED state, indicating that the customer has approved tokenization. Subscribe via the Webhooks registration guide.customer_ token directly under klarna_ customer. Tokenization is complete at this point. No further API call is needed. Acknowledge the event before storing the token or confirming the outcome to the customer. See Acknowledge the event before storing the token or finalizing.{
"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-[...]",klarna_ network_ session_ token is valid for only 1 hour and must be used within this time frame to finalize the Payment Transaction.payment. request. state-change. completed in two stages. In the webhook handler, verify the event, persist the payload — the customer_ token and, for combined flows, the klarna_ network_ session_ token — durably against metadata. event_ id, and return a 2xx response immediately. Run everything that follows asynchronously, after the acknowledgment is sent.customer_ token as a reusable credential in the systems that charge it, as described in Step 5.metadata. event_ id you have already recorded, confirm that it is recorded and return a 2xx response without repeating the work. Set up your webhooks defines the accepted acknowledgment responses and the retry schedule Klarna applies when one doesn't arrive.COMPLETED state, both the customer_ token and (for combined flows) the klarna_ network_ session_ token are available in state_ context.{
"payment_request_id": "krn:payment:us1:request:bcb5ca7d-9ad4-4cf1-9e34-7311f0d3ab02",
"payment_request_reference": "partner-tokenization-reference-1234",
"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"
}amount), tokenization is complete now. Skip Step 4 and go straight to Step 5: Store the customer token.klarna_ network_ session_ token in the Klarna-Network-Session-Token request header. Klarna creates the Payment Transaction and confirms the issued customer_ token in the same response.payment_ option_ id is not required. Use the same currency, amount, and supplementary_ purchase_ data sent on the Payment Request. Significant differences may cause Klarna to require re-confirmation.step_ up_ config to make recovery possible; without it, borderline cases return DECLINED instead of STEP_ UP_ REQUIRED.| Parameter | Required | Description |
|---|---|---|
Klarna-Network-Session-Token (header) | Yes | The Klarna Network Session Token received in Step 3. |
currency | Yes | Same currency used in the Payment Request. |
request_ | Yes | Same amount used in the Payment Request. |
request_ | Recommended | The Partner's own reference for the Payment Transaction, used for reconciliation. |
request_ | Yes | Same scope requested on the Payment Request. Required so Klarna confirms the token under the same scope. |
request_ | Recommended | Same reference used on the Payment Request. |
supplementary_ | Recommended | Same supplementary data sent on the Payment Request. |
step_ | Recommended | Opts in to the STEP_ outcome so the customer can complete a step-up Klarna Purchase Journey when Klarna's risk signals require additional interaction. Set customer_ and provide a return_ (and optionally app_ for native apps). Without it, borderline cases return DECLINED. |
acquiring_ | Conditional | Routes the Payment Transaction to a specific Payment Account or Payment Acquiring Account, and optionally requests the settlement currency. Use the same routing fields set on the Payment Request. |
curl https://api-global.test.klarna.com/v2/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": 1999,
"payment_transaction_reference": "subscription-first-payment-001"
},klarna_ network_ session_ token has expired (1-hour validity) or the payment context differs significantly from the original Payment Request, the call returns DECLINED. The customer_ token may still be issued, so always inspect customer_ token_ response independently of the payment result.customer_ token_ response for the token, and a payment_ transaction_ response for the initial payment. The two are independent. A DECLINED payment does not automatically mean the token was not issued.Result (payment_) | Description | Next steps |
|---|---|---|
APPROVED | The initial Payment Authorization succeeded and a payment_ was created. The customer_ is returned in customer_ and is ready for future use. | Store the customer_ securely (Step 5), persist the payment_, and confirm the outcome to the customer. |
STEP_ | Returned only when step_ was included on the request. Klarna's risk signals require additional customer interaction before approval. The response includes a new Payment Request with customer_ details. | Launch the Klarna Purchase Journey using the new Payment Request, wait for the next payment. webhook to deliver a new Klarna Network Session Token, then call authorizePayment |
DECLINED | The initial Payment Authorization failed. No payment_ is created. The customer_ may still be returned in customer_ and remain valid for future use. Inspect customer_ to be sure. | Show the customer a decline / alternative payment page. When the token was issued, decide whether to retain it (typical for subscription onboarding where the next billing attempt can succeed) or discard it based on business logic. |
{
"payment_transaction_response": {
"result": "APPROVED",
"payment_transaction": {
"payment_transaction_id": "krn:payment:us1:transaction:5cb3e0e5-a6f0-[...]",
"payment_transaction_reference": "subscription-first-payment-001",
"amount": 1999,
"currency": "USD",
"payment_pricing": {...},
"payment_funding": {customer_ token is available (whether from the Step 3 webhook for tokenization only, or the Step 4 response for the combined flow), persist it securely. The customer_ token is a sensitive credential that allows authorizations on behalf of the customer until it expires or is revoked.| Practice | Description |
|---|---|
| Store securely | Persist customer_ values in encrypted storage. Restrict access to the systems that issue authorizations. |
| Associate with the customer | Link each token to the relevant customer record, including the issuing scope and the issuance timestamp. Use customer_ to keep the Partner's reference and the Klarna-issued token in sync. |
| Track scope and intent | Record the token's scope (payment:customer_ or payment:customer_) and the business intent (subscription, wallet, on-demand) so the right token is picked at authorization time. |
| Honor lifecycle events | When a customer cancels their subscription or removes their saved payment method, stop using the token and delete it or mark it as inactive. |
| Do not expose tokens | Never return raw customer_ values to a frontend, mobile clients, or third parties. Reference them by an internal identifier instead. |
customer_ token is what Partners reuse on subsequent authorizations. Both authorization patterns start with authorizePaymentstep_ up_ config is included to opt in to step-up:payment:customer_ present. Call authorizePaymentKlarna-Customer-Token header, currency, request_ payment_ transaction. amount, supplementary_ purchase_ data, and step_ up_ config with customer_ interaction_ config. method = HANDOVER and a return_ url. When Klarna's risk signals require additional customer interaction, the response is STEP_ UP_ REQUIRED with a new Payment Request. Launch the Klarna Purchase Journey using it, then call authorizePaymentstep_ up_ config, Klarna returns DECLINED on borderline cases instead of allowing recovery.payment:customer_ not_ present. Call authorizePaymentKlarna-Customer-Token header, currency, request_ payment_ transaction. amount, and supplementary_ purchase_ data. Do not include step_ up_ config. There is no customer available to complete a step-up Klarna Purchase Journey. Klarna returns APPROVED or DECLINED only.