listPaymentProgramsPresentation is currently unavailable in both playground and production. The spec is Klarna-internal until the endpoint is released; request it from your Klarna Business Developer, who can also advise on early-access timing. The page describes the integration pattern so you can plan against it ahead of GA. Until the endpoint is live, use Method 2a as the actively recommended AP-portal approach.AVAILABLE, DEPRECATED, DECOMMISSIONED), and migration hints (replaces_payment_program_ids). You render that response in your UI and call createPaymentProgramEnablementpartner_account_id for every API call.locale for each Partner so Klarna returns localized presentation content. Klarna falls back to en-US when the requested locale isn't available. See Handling localization and fallbacks.partner_account_id. You don't need the Partner's MCC or to resolve a Payment Program Plan from the Partner's Payment Profile. That's the main reason to choose Method 2b if you'd rather not track Payment Program Plans yourself.listPaymentProgramsPresentation with the Partner's partner_account_id. Pass locale to receive localized headers, subheaders, and messages; optionally filter by payment_program_category_id (to scope a screen to one category) or by payment_account_id (to render the view for a specific Payment Account). The response contains a payment_program_categories array and a payment_programs array.partner_account_id to get the canonical enablement records, both active and ended. The presentation response already carries the active ones inline (active_enablements), so use this call when you also need the ended history.payment_program_categories carries a name and a presentation object (display_order, a localized header, an optional subheader, and an optional category-level message/message_type, for example, flagging a category as recommended, or warning that a whole category is being phased out). Render a section per category with its presentation.header (and subheader if present), and place the matching programs inside, sorted by their own presentation.display_order. The presentation endpoint is opinionated by design: respecting the ordering and headers Klarna returns keeps the screen current as Klarna adds, retires, or recategorizes programs.payment_programs carries enablement_state (ENABLED or NOT_ENABLED), localized presentation (header, optional message + message type), availability_details (lifecycle state and optional decommissioned_at / replaces_payment_program_ids), and any inline active_enablements. Use enablement_state, cross-checked against the enablement list, to show which programs the Partner already has on.
| Do | Don't |
|---|---|
Respect Klarna's display_order at both the category and the program level — the ordering is curated for clarity and conversion. | Override display_order with your own ordering — you'll diverge from Klarna's recommendation and lose the automatic updates that come with the curated view. |
Render the localized header and subheader from the response so each category reads the way Klarna intends. | Drop the header or subheader — that's where Klarna communicates context the program name alone doesn't capture. |
Surface a category-level message above its programs, using the banner style that matches its message_type (e.g. WARNING → warning banner) and falling back to INFO for values you don't recognize. | Hide the category message or render an unrecognized message_type as an error — the enum is open and new values may be added in the future. |
display_order.
display_order so the priced view stays consistent with the curated presentation.enablement_state is ENABLED. An enablement carries enablement_criteria (country, MCC, Payment Account, optional code), so a program that's already enabled for one set of criteria can still be enabled for another. Only treat a program as already active, and suppress its "Enable" action, when an existing enablement matches the exact same criteria (same payment_program_id, country, and payment_program_enablement_code). The presentation response surfaces this, so you can render Klarna's "already active" message instead of an enable affordance.payment_program_id and any enablement_criteria (customer countries, MCCs, Payment Account IDs, optional payment_program_enablement_code). The full request and response shape, idempotency requirements, and field-by-field guidance live in Create Payment Program Enablement.
enablement_criteria for an existing enablement, delete it and create a new one.listPaymentProgramsPresentation with the same parameters and re-render the screen. The refreshed response reflects the new enablement_state and any updated active_enablements, so the screen converges in one call. For a canonical, history-aware list of every enablement (including any created outside your portal), use listPaymentProgramEnablements
ENABLED program, show an "End" affordance. The program's active_enablements array lists each enablement currently in effect, with its payment_program_enablement_id and effective_from. On confirmation, call deletePaymentProgramEnablementpayment_program_enablement_id.


| # | Field |
|---|---|
| 1 | payment_programs[].presentation.header (Presentation API) |
| 2 | payment_programs[].availability_details.customer_countries (Presentation API) |
| 3 | payment_program_categories[].presentation.header (Presentation API) |
| 4 | payment_programs[].name (Presentation API) |
| 5 | payment_programs[].enablement_type (Presentation API) |
| 6 | enablement_criteria.customer_countries (listPaymentProgramEnablements |
| 7 | enablement_criteria.payment_program_enablement_code (listPaymentProgramEnablements |
| 8, 9 | effective_from (listPaymentProgramEnablements |


AVAILABLE program moving to DEPRECATED, a new replacement program appearing) or any out-of-band create/delete on Klarna's side.enablement_state and inline active_enablements per program, so a screen refresh acts as a side-effect reconciliation for the data shown to the Partner. For full historical reconciliation across all enablements for a Partner Account (including ones not in the current presentation view), call listPaymentProgramEnablementsmessage content) based on the locale query parameter you pass. When the requested locale isn't supported, Klarna falls back to en-US. The default value if you omit the parameter is also en-US.| Do | Don't |
|---|---|
Pass the Partner's preferred locale on every presentation call so the response matches the rest of your portal's localization. | Cache the localized response across locales — re-call the endpoint when the Partner switches the portal language. |
Localize the UI labels you add around the Klarna-supplied content (your sell-rate label, your enable/end buttons, your sub-headers) using your own localization stack — Klarna localizes its content, you localize yours. | Translate Klarna's header, subheader, or message content yourself — those strings are owned by Klarna and may change. Wrap them in your UI, but don't rewrite them. |
Treat the en-US fallback as a feature: it guarantees you always have renderable text, even for less common locales. | Treat an unsupported locale as an error or render blanks — Klarna already falls back to en-US, so always render the returned text. |
availability_details on every program. Use these fields to give Partners a clear, proactive view of what's changing in their Payment Program setup:availability_details.state: AVAILABLE, DEPRECATED, or DECOMMISSIONED.availability_details.decommissioned_at: present when the state is DEPRECATED or DECOMMISSIONED; tells you when the program was or will be retired.availability_details.replaces_payment_program_ids: present on an AVAILABLE program when enabling it would automatically end one or more existing enablements; tells you which programs the new one supersedes.| State | What it means | What to render |
|---|---|---|
AVAILABLE | The program is offered and can be enabled normally. | Standard enable/end affordance. If replaces_payment_program_ids is present, surface a confirmation step that explains which existing programs will be ended. |
DEPRECATED | The program is being phased out. Existing enablements still work until decommission, but new enablements are typically not accepted. | Highlight the program with the Klarna-supplied message (often message_type: WARNING), display decommissioned_at, and prompt the Partner to migrate to the program(s) listed in any AVAILABLE program's replaces_payment_program_ids that points back to this one. |
DECOMMISSIONED | The program is fully retired and any enablement is inert (enablement_state will be NOT_ENABLED). | Render in a clearly retired style; do not offer an enable affordance. |
| Do | Don't |
|---|---|
Surface migration prompts to Partners before the decommission date — give them time to act. | Leave Partners unaware that a program they've enabled is moving toward decommission — silent retirement is a bad experience. |
Use replaces_payment_program_ids to drive a "switch to" affordance on the new program (or a "migrate from" prompt on the deprecated one). | Construct your own deprecation copy when Klarna provides a message — the curated message is what's been agreed across Acquiring Partners. |
Trust enablement_state for decommissioned programs — Klarna sets it to NOT_ENABLED automatically. | Offer an enable affordance for a decommissioned program — its enablement is inert. |
en-US fallback rather than showing blanks.| Symptom | Likely cause | Action |
|---|---|---|
400 Bad Request on presentation call | Invalid payment_program_category_id, payment_account_id, or malformed locale | Drop the optional filters and retry; verify the locale string matches the BCP 47 format Klarna accepts. |
Response contains an empty payment_programs array | The Partner Account has no Payment Programs eligible for presentation, or the filters are too narrow | Remove the filters and retry; if still empty, verify the Partner Account has an active Payment Program Plan. |
| Headers and messages are in English when the Partner expects another language | Requested locale is unsupported or omitted | Confirm the locale parameter is set correctly; Klarna falls back to en-US for unsupported locales. |
enablement_state doesn't update after a successful create | Local cache or stale state on your side | Re-call the presentation endpoint immediately after the create to refresh the view; if the issue persists, reconcile against listPaymentProgramEnablements |
400 Bad Request on create | Required field missing, type mismatch, or payment_program_id not eligible for the Partner | Validate against the latest presentation response (enablement_state: NOT_ENABLED indicates eligibility); retry with the same Klarna-Idempotency-Key. |
| Enablement created but not visible at checkout | Klarna caches not yet refreshed | Wait 15 minutes and retry. |
Enablement state in your portal disagrees with listPaymentProgramEnablements | Out-of-band change made by Klarna | Re-sync from listPaymentProgramEnablements |