Solidgate

Charge a partner-initiated transaction (Partner orchestrated)

Charge a stored Klarna Customer Token in a partner-initiated transaction — a subscription renewal or scheduled payment that runs without customer interaction — by creating the Klarna payment request yourself and confirming the charge through Solidgate with the klarna_network_session_token.
This guide explains how to charge an existing Klarna Customer Token in a partner-initiated transaction — a subscription renewal or any scheduled charge that runs without customer interaction — where you orchestrate the charge. You hold the Klarna Customer Token, create the Klarna payment request yourself, and then confirm the charge through Solidgate.
Because the transaction is partner-initiated and runs without customer interaction, it is a single server-side charge.
This is pattern B of the partner-initiated charge. The alternative — calling Solidgate directly with the Solidgate token — is described in Charge a partner-initiated transaction (Solidgate orchestrated). See the tokenized payments overview to compare the two.
Partner-initiated token charges are how you bill recurring subscriptions. For how Solidgate models subscriptions, billing periods, retries, and the subscription lifecycle, see Solidgate's Subscription overview.
Charge credential: Klarna Customer Token only. When you initiate the charge, only the Klarna Customer Token can be used. The Solidgate token is only usable when Solidgate initiates the charge (pattern A).

Prerequisites

Before you integrate, check that you meet the following prerequisites:
  1. 1.
    Ensure that you have Klarna enabled with Solidgate.
  2. 2.
    A stored Klarna Customer Token for the customer, issued with the payment:customer_not_present scope (see Create a Klarna Customer Token).
  3. 3.
    Inside the Klarna Partner Portal, confirm you have generated an API key able to call the Klarna Payment Request API.
  4. 4.
    Confirm that you have registered webhooks for payment.request.state-change.completed events following the Webhooks guidelines.
  5. 5.
    Add Terms and Conditions covering recurring charges.
There is no SDK and no payment form for this flow.

Integration overview

  1. 1.
    Your server calls Klarna's Create Payment Request API, passing the Klarna Customer Token in the request header. Because the transaction runs without customer interaction, the request completes immediately — there is no Klarna Purchase Journey.
  2. 2.
    Klarna fires the payment.request.state-change.completed webhook to your server with the klarna_network_session_token.
  3. 3.
    Your server forwards the Klarna Network Session Token (and the purchase details) to Solidgate.
  4. 4.
    Solidgate calls Klarna's Payment Authorize API with the Klarna Network Session Token to authorize the charge, and returns the outcome.
sequenceDiagram autonumber participant P as Partner participant K as Klarna participant AP as Solidgate P->>K: Create payment request<br/>POST /v2/payment/requests Note over P,K: Header: Klarna-Customer-Token<br/>supplementary_purchase_data.subscriptions K-->>P: Payment request completed event (webhook) Note over K,P: klarna_network_session_token P->>AP: Confirm payment Note over P,AP: klarna_network_session_token AP-->>P: Order completed notification

Integration details

Create the Klarna payment request with the Klarna Customer Token

Call Klarna's Create Payment Request API from your server, passing the stored Klarna Customer Token in the Klarna-Customer-Token header. Because the transaction runs without customer interaction, no customer_interaction_config / return_url is needed and Klarna will not return a payment_request_url — the request moves straight to COMPLETED.
FieldPresenceDescription
Klarna-Customer-Token (header)requiredThe stored Klarna Customer Token identifying the customer's saved Klarna method.
currencyrequiredCurrency in ISO 4217 format.
amountrequiredTotal charge amount in non-negative minor units (e.g. $25.00 = 2500).
supplementary_purchase_data.subscriptionsrecommendedArray of Subscription objects for this charge (billing interval, reference, etc.). Improves acceptance and the customer's post-purchase experience.
For the full request schema, consult the createPaymentRequestAPI.
Sample request
BASH
1 2 3 4 5 6 7 8 9 10
curl -X POST https://api-global.test.klarna.com/v2/payment/requests \ -H 'Authorization: Basic <API key>' \ -H 'Klarna-Customer-Token: krn:network:eu1:live:customer-token:[...]' \ -H 'Content-Type: application/json' \ -d '{ "currency": "USD", "amount": 2500, "payment_request_reference": "sub-2026-06-ref-123", "supplementary_purchase_data": { "purchase_reference": "sub-2026-06-ref-123",
A partner-initiated token charge does not return STEP_UP_REQUIRED. The payment request transitions directly to COMPLETED (or DECLINED). There is no customer interaction to complete a Klarna Purchase Journey.

Retrieve the klarna_network_session_token

Klarna issues the klarna_network_session_token once the payment request reaches COMPLETED. Retrieve it by subscribing to the payment.request.state-change.completed webhook (required); you may additionally call the Read Payment Request APIAPI for resilience.
Sample webhook payload
JSON
1 2 3 4 5 6 7 8 9 10
{ "metadata": { "event_type": "payment.request.state-change.completed", "event_version": "v2" }, "payload": { "payment_request_id": "krn:payment:eu1:request:552603c0-fe8b-4ab1-aacb[...]", "payment_request_reference": "sub-2026-06-ref-123", "previous_state": "SUBMITTED", "state": "COMPLETED",
The klarna_network_session_token is valid for only 1 hour and must be forwarded to Solidgate within this time frame to finalize the authorization.

Confirm the charge via Solidgate

Forward the klarna_network_session_token to Solidgate, which authorizes the charge with Klarna behind the scenes. The full request/response contract is owned by Solidgate; only the Klarna-specific token you must include is shown here.
BASH
1 2 3 4 5 6 7 8 9 10
curl -X POST https://api.acquiring-partner.com/payment \ -H "Content-Type: application/json" \ -d '{ "amount": 2500, "currency": "USD", "payment_methods": { "klarna": { "klarna_network_session_token": "" } }
Refer to Solidgate's API reference for the full request shape (subscription metadata, references, response codes, etc.).

Handle the outcome

The charge resolves to one of two outcomes:
OutcomeWhat it meansNext step
APPROVEDKlarna authorized the charge.Fulfil the subscription period and record the successful charge.
DECLINEDKlarna did not authorize the charge.Apply your subscription retry / dunning logic and, if appropriate, notify the customer.
A step-up is not possible here — a partner-initiated transaction runs without customer interaction, so there is no one to complete one. Plan your subscription logic around APPROVED / DECLINED only.
Related articles
Charge a partner-initiated transaction (Solidgate orchestrated)
Tokenized payments overview
Create a Klarna Customer Token (Partner orchestrated)
Register Webhooks
1. General
API & SDK references
API