This guide walks you through integrating Klarna's Payment Authorization process using Klarna's SDK and API. It outlines required actions across the frontend and backend, with input/output parameters, example requests, and expected responses.
Link copied!
Once the customer has selected Klarna and decided to proceed to the payment with Klarna, Acquiring Partners are expected to authorize the payment with Klarna and allow the customer to go through Klarna's Purchase Journey.
The following sequence applies:
initiate is triggeredinitiate button click handler returns a promise resolving to the authorization resultLink copied!
Link copied!
As described in the previous section, once the customer has selected the Klarna payment option in the payment selector, the Acquiring Partner will need to render the Klarna Payment Button.
The Acquiring Partner will need to configure paymentButton component from the paymentPresentation instance with the following attributes:
initiate button click handler: attach a function which triggers your backend to call Klarna’s Payment Authorize APIinitiationMode: This parameter controls how the Klarna Purchase Journey is launched (redirect / pop up window) on different devices (mobile/desktop/native)Sample code
Copied
async function initiateKlarnaPayment(klarnaNetworkSesionToken, paymentOptionId) {
try {
// 1) Ask your backend to authorize the payment
const response = await fetch('/api/authorize-payment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ klarnaNetworkSesionToken, paymentOptionId })
});
if (!response.ok) throw new Error('Network or server error');
// 2) Handle backend responseThe Acquiring Partner can also create a custom button to launch the Klarna Purchase Journey. This is detailed in the Launch the Klarna Purchase Journey with a custom button section.
Link copied!
The initiate button click handler attribute from the SDK requires the Acquiring Partner to call Klarna's Payment Authorize API and return the results as a promise to the client-side.
klarna_network_session_token and klarna_network_data parameters and if provided they must be forwarded when calling Klarna's Payment Authorize API.The Payment Authorize API is used to authorize payments on Klarna Network — whether they are one-time purchases, tokenized payments, token charges, or a final authorization following a step-up flow. All requests must include the applicable supplementary_purchase_data as defined by Klarna Network Rules.
A one-time payment represents the most common scenario, where the customer completes a single purchase with Klarna. The call may return an immediate authorization (APPROVED) or require additional customer interaction (STEP_UP_REQUIRED).
In the request to the Payment Authorize API
Copied
/v2/accounts/{partner_account_id}/payment/authorize| Parameter | Required | Description |
|---|---|---|
Copied partner_account_id | Yes | Unique account identifier assigned by Klarna to the onboarded merchant |
Copied
curl 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: eyJhbGciOiJIU...' \
-d '{
"currency": "USD",
"supplementary_purchase_data": { .. },
"klarna_network_data": "<serialized-json>",
"request_payment_transaction": {
"amount": 11800,
"payment_option_id": "***",
"payment_transaction_reference": "acquiring-partner-transaction-reference-1234"Link copied!
The response schema is as follows:
When performing a one-time payment or token charge through the Payment Authorize API, Klarna returns a response that reflects the result of the payment authorization. Because this flow only includes a request_payment_transaction in the request, the response will always contain a corresponding payment_transaction_response object. The result field inside this object indicates the outcome of the authorization and determines the next step to perform.
The result has the following possible values:
| Result | Description | Next step |
|---|---|---|
| This result is returned only if step_up_config was provided in the request and additional customer interaction is needed to complete the payment. | Read the payment_request_id and payment_request_url from the payment_request object, and launch the Klarna Purchase Journey for the customer to finalize authorization. |
| The payment authorization succeeded. A payment_transaction has been created and returned in the response. | Store the payment_transaction_id for post-purchase operations (such as capture or refund), and return a success indicator to the client. |
| The authorization failed (for example, due to fraud, credit, or risk policy). No transaction is created. | Return a failure indicator to the client. |
STEP_UP_REQUIREDWhen Klarna cannot immediately create a Payment Transaction and a step_up_config was provided in the request, Klarna returns STEP_UP_REQUIRED with a payment_request. The partner must redirect the customer to Klarna’s purchase journey URL to complete authentication and payment option selection.<br>
<br>
When the payment cannot be completed instantly, Klarna returns the payment_request details including the payment_request_id and payment_request_url which should be used to launch the Klarna Purchase Journey.<br>
Sample payload
Copied
{
"payment_transaction_response": {
"result": "STEP_UP_REQUIRED"
},
"payment_request": {
"payment_request_id": "krn:payment:eu1:request:552603c0-fe8b-4ab1-aacb-41d55fafbdb4",
"payment_request_reference": "acquiring-partner-request-reference-1234",
"amount": 11800,
"currency": "USD",
"state": "SUBMITTED",
"expires_at": "2025-01-02T13:00:00Z",
"created_at": "2025-01-01T12:00:00Z",APPROVEDWhen the payment authorization is approved, Klarna returns an APPROVED result and a newly created payment_transaction.<br>
The Acquiring Partner must store the payment_transaction_id for post-purchase operations (capture, refund, etc.) through the Payment Transactions API.<br>
<br>
An APPROVED result means the payment has been authorized successfully without requiring further customer interaction.<br>
Sample payload
Copied
{
"payment_transaction_response": {
"result": "APPROVED",
"payment_transaction": {
"payment_transaction_id": "krn:payment:eu1:transaction:6debe89e-98c0-[...]",
"payment_transaction_reference": "transaction-reference-1234",
"amount": 11800,
"currency": "USD",
"payment_funding": {
"type": "INVOICE",
"details": { }
},DECLINEDIf Klarna cannot approve the payment, the API returns a DECLINED result without a payment_transaction. Partners should treat this as a final rejection unless instructed by Klarna to retry.
Sample payload
Copied
{
"payment_transaction_response": {
"result": "DECLINED",
"result_reason": "PAYMENT_DECLINED"
}
}
Extract and forward the Payment Authorize API response parameters to your frontend:
result: the result of the payment authorization attemptpayment_request_id: The unique Klarna identifier for the payment requestUpdate the implementation of the initiate callback to support different results:
Copied
async function initiateKlarnaPayment(klarnaNetworkSesionToken, paymentOptionId) {
try {
// 1) Ask your backend to authorize the payment
const response = await fetch('/api/authorize-payment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ klarnaNetworkSesionToken, paymentOptionId })
});
if (!response.ok) throw new Error('Network or server error');
// 3) Handle backend response