Klarna is introducing Disputes API V4, which adds multi-phase review, an appeal workflow, and richer dispute outcomes. To allow a seamless migration with no service disruption, V1, V2, V3 and V4 operate in parallel during the migration window.
Two key dates drive the migration:
Your V4 onboarding timestamp — the dividing line between dispute frameworks. Disputes opened before it are FRAMEWORK_2020 (legacy); disputes opened after it are FRAMEWORK_2026. Assignment is automatic and permanent. The framework is always readable from configuration.base_framework.
November 1, 2026 — a second cutoff within FRAMEWORK_2026 when the 30-day review window, the appeal workflow, and the ON_DISPUTE_OPEN hold policy activate.
Two access models to remember:
REST is cross-version: Once onboarded to V4, every dispute (any framework) is readable and actionable on every API version.
Webhooks are framework-scoped: V1/V2/V3 subscriptions deliver FRAMEWORK_2020 events only; V4 subscriptions deliver FRAMEWORK_2026 events only. Both must run in parallel until all FRAMEWORK_2020 disputes have closed.
Applies to disputes opened before your V4 onboarding timestamp. Follows the legacy dispute rules and lifecycle. No changes are made to disputes already under this framework.
Applies to disputes opened after your V4 onboarding timestamp. Follows the FRAMEWORK_2026 lifecycle with multi-phase review, new settlement transaction types, and a configurable hold policy.
Phased feature rollout — November 1, 2026. Not all FRAMEWORK_2026 features activate at onboarding. The features below only apply to disputes opened on or after Nov 1, 2026:
Feature
Before Nov 1, 2026
From Nov 1, 2026
Evidence window
Up to 21 days
Up to 21 days
Review window
60 days (same as FRAMEWORK_2020)
30 days
PRE_ARBITRATION / appeal
Not available
Available
Hold policy ON_DISPUTE_OPEN
Not active
Active
Implications:
The appeal flow will not trigger for any dispute until Nov 1, 2026 — do not treat it as a day-one requirement.
SLA monitoring must account for the 60-day review window for all FRAMEWORK_2026 disputes opened before that date.
New settlement transaction types (CHARGEBACK_REVERSAL, APPEAL_FEE) must be integrated before Nov 1, 2026 — see Settlement transaction types.
FRAMEWORK_2026 has two sub-phases depending on whether the dispute opened before or on/after November 1, 2026.
Disputes opened before Nov 1, 2026 (transitional):
flowchart LR
A["Open / Evidence Requested
(INITIATED)"] -->|up to 21 days| B["Evidence Under Review
(REPRESENTMENT)"]
B -->|60 days| C["CLOSED"]
Disputes opened on or after Nov 1, 2026 (full):
flowchart TD
A["Open / Evidence Requested
(INITIATED)"] -->|up to 21 days| B["Evidence Under Review
(REPRESENTMENT)"]
B -->|30 days| C["CLOSED"]
B --> D["PRE_ARBITRATION
(preliminary decision)"]
D --> E["ARBITRATION
(final binding decision)"]
E --> C
Key differences from FRAMEWORK_2020:
"Open" and "Evidence Requested" are combined into a single state (INITIATED) — the dispute opens with an immediate evidence request, giving up to 21 days from day one.
Review period is 30 days (down from 60), from Nov 1, 2026.
Two new phases: PRE_ARBITRATION (preliminary decision, partner can appeal) and ARBITRATION (final binding review).
In V4 this is reflected in state:
V4 state
Meaning
INITIATED
Dispute opened with evidence request. Evidence window is open.
REPRESENTMENT
Partner submitted evidence; Klarna is reviewing. Deadline to accept or escalate.
PRE_ARBITRATION
Preliminary decision made. Partner can accept outcome or appeal.
ARBITRATION
Arbitration in progress. Final binding decision pending.
CLOSED
Dispute is closed with a final outcome.
Within INITIATED and REPRESENTMENT, a nested representment.state tracks the evidence request status:
V4 representment.state
Meaning
EVIDENCE_REQUESTED
Partner can submit evidence or accept loss
EVIDENCE_RECEIVED
Evidence submitted; under review; no further partner action
EVIDENCE_REQUEST_EXPIRED
Deadline passed without partner response
EVIDENCE_WAIVED
Partner accepted loss in INITIATED state
REPRESENTMENT_AUTOMATICALLY_REJECTED
Dispute amount below threshold; auto-resolved as LOST
Once onboarded to V4, every REST operation is available on every API version, regardless of dispute framework. You can shift workflows dispute-by-dispute or team-by-team at your own pace — for example, accessing FRAMEWORK_2020 disputes via V4, or FRAMEWORK_2026 disputes via your existing V2 integration.
Webhook event delivery does not cross framework boundaries:
Webhook subscription
FRAMEWORK_2020 events
FRAMEWORK_2026 events
V1/V2/V3 subscription
Receives
Does NOT receive
V4 subscription
Does NOT receive
Receives
You must run both webhook subscriptions in parallel throughout the migration. Events are already segregated by framework — there is no overlap and no deduplication needed. Do not cancel the V1/V2/V3 subscription until all FRAMEWORK_2020 disputes are closed.
The migration follows five sequential steps. The diagram below summarises the end-to-end flow:
sequenceDiagram
participant M as Merchant
participant V1 as V1/V2/V3 API
participant V4 as V4 API
participant K as Klarna
Note over M,K: Step 1 — Settlement & infrastructure readiness (before Nov 1, 2026)
Note over M,K: Step 2 — Onboard MID to V4
M->>V4: POST /v4/payment/disputes/merchants/{merchant_id}/enroll
V4->>K: Record onboarding timestamp T0
K-->>M: V4 active
Note over M,K: Step 3 — Subscribe to V4 webhooks
M->>V4: Create V4 webhook subscription
Note over M,V1: V1/V2/V3 webhook subscription remains active
Note over M,K: Step 4 — Dual operations
K-->>V1: FRAMEWORK_2020 webhooks (disputes opened before T0)
K-->>V4: FRAMEWORK_2026 webhooks (disputes opened after T0)
M->>V1: Read / respond to FRAMEWORK_2020 disputes
M->>V4: Read / respond to FRAMEWORK_2026 disputes
M->>V4: (Optional) Cross-access FRAMEWORK_2020 disputes via V4
Note over M,K: Step 5 — Full transition (after all FRAMEWORK_2020 disputes closed)
M->>V1: Cancel V1/V2/V3 webhook subscription
M->>V1: Retire V1/V2/V3 integration
Complete every item below before calling the V4 onboarding endpoint. Once onboarded, disputes opened after the timestamp immediately use FRAMEWORK_2026.
Dispute routing:
Dispute management system reads configuration.base_framework and routes to the correct processing logic.
State machine updated to handle the V4 5-state model: INITIATED, REPRESENTMENT, PRE_ARBITRATION, ARBITRATION, CLOSED.
Code handles unknown dispute_outcome_detailed values gracefully (open enum — new values may be added).
Evidence submission:
Evidence submission updated to use free-text additional_information (max 5000 chars) instead of structured requested_fields.
Attachment handling updated to use KRN-based IDs and include descriptions.
Authentication:
V4 API key credentials obtained.
V4 authentication tested (HTTP Basic auth with API key, not V2 client credentials).
Webhooks (if applicable):
HMAC-SHA256 signature verification implemented in your webhook handler.
Webhook handler routes events based on base_framework.
V1/V2/V3 webhook subscription confirmed active and will remain active during migration.
No settlement changes are required before V4 onboarding. With hold_policy: NONE (the FRAMEWORK_2026 default), no funds are held when a dispute opens, so settlement behaviour is unchanged from the legacy behavior:
Dispute closes in merchant's favor → no settlement entry (nothing was held).
Dispute closes against the merchant → CREDIT appears in the settlement report.
FEE continues to appear as it does today.
Two new transaction types activate on November 1, 2026 when hold_policy: ON_DISPUTE_OPEN and the appeal workflow go live. These must be integrated before that date — see Settlement transaction types in the API reference for the full table.
Call the V4 self-onboarding endpoint. This records the timestamp that divides FRAMEWORK_2020 from FRAMEWORK_2026.
TEXT
1
2
POST /v4/payment/disputes/merchants/{merchant_id}/enroll
After this call:
Your MID is active on V4.
Disputes opened before this timestamp → FRAMEWORK_2020.
Disputes opened after this timestamp → FRAMEWORK_2026 with the default config (hold_policy: NONE).
All FRAMEWORK_2020 disputes are immediately accessible via V4 — you can view and respond to them using either V1/V2/V3 or V4 from this point forward.
With both integrations active, incrementally migrate dispute workflows to V4 while FRAMEWORK_2020 disputes continue via your existing integration.
Recommended validation sequence:
1.
For the first 1–2 weeks after onboarding, process FRAMEWORK_2026 disputes exclusively via V4.
2.
Optionally cross-access: use V4 to view and respond to a subset of FRAMEWORK_2020 disputes to confirm compatibility.
3.
Validate that dispute_outcome_detailed values are handled correctly — this is an open enum; unknown values must not crash your system.
4.
Confirm settlement files include the new transaction types for FRAMEWORK_2026 disputes.
5.
If using webhooks: confirm FRAMEWORK_2020 events arrive on the V1/V2/V3 subscription and FRAMEWORK_2026 events on the V4 subscription.
6.
Monitor PRE_ARBITRATION events — if your workflow requires challenging preliminary decisions, implement the appeal flow before this occurs in production.
Renamed; values may differ for the same dispute due to FRAMEWORK_2026 lifecycle changes. Do not treat as equivalent — use a single API version as the source of truth for time-based logic.
V4 introduces an appeal flow for the PRE_ARBITRATION state. If Klarna issues a preliminary decision and you wish to challenge it:
TEXT
1
2
POST /v4/payment/disputes/{payment_dispute_id}/appeal
PRE_ARBITRATION and the appeal workflow are only available for FRAMEWORK_2026 disputes opened on or after November 1, 2026. For disputes opened before that date, the dispute goes directly from REPRESENTMENT to CLOSED — no appeal is possible. This endpoint has no V2 equivalent.
V4 uses API key credentials with HTTP Basic Authentication — different from V2's OAuth2 client credentials flow. Ensure your V4 requests use the correct authentication scheme.
V4 introduces dispute_outcome_detailed in the CLOSED state with 40+ possible values (e.g. partner_provided_valid_shipping_details, no_proof_of_delivery, customer_cancelled_dispute). New values may be added in the future. Your code must not crash or reject unknown values — handle them gracefully and log them for review.