LedgerBee Developer
  • Getting started
  • Conventions
  • Products
  • Advisor firms
  • Configuration
  • API Reference
Information
Accounts
    List accountsgetCreate an accountpostGet an accountgetDelete an accountdeleteUpdate an accountpatch
Advisor Authority Extracts
    Submit authority extract data for an advisor firm's clientspost
Advisor Clients
    List the advisor firm's clientsget
API Key
    Get current API keyget
Authority Extracts
    Submit authority extract datapost
Bank Reconciliations
    Reconcile bank lines against entriespostUndo a bank reconciliationpostCheck what undoing a reconciliation would dopostReconcile a batch of matchespostCheck what reconciling a batch of matches would dopostCheck what reconciling bank lines against entries would dopost
Bank Transactions
    List bank linesgetGet a bank linegetDismiss bank lines from reconciliationpostCheck which bank lines a dismiss would changepostRestore dismissed bank lines to reconciliationpostCheck which bank lines a restore would changepost
Billing Groups
    Form a billing grouppostGet a billing groupgetAdd members to a billing grouppostRemove a member from a billing groupdeleteCheck billing group eligibilitypost
Budgets
    List budgetsgetGet a budgetgetGet the budget vs actuals comparisongetExport a budget's Excel workbookgetOverwrite a budget's figures from an edited workbookpostList a budget's frozen baselinesgetGet a frozen baseline with its snapshot cellsgetList a budget's re-baseline proposalsgetList a budget's scenariosgetResolve a budget's grid under a scenariogetGet the variance report vs a frozen baselinegetGet the runway headlineget
Checkout
    Confirm the checkoutpostQuote a first periodpostIntegration readinessgetMint a checkout sessionpostRehydrate a sessiongetRelease the card hold (edit-after-card)postPoll card statusgetOpen the card windowpostOpen a card window for a live subscriptionpost
Company
    Get company detailsget
Connected app OAuth
    JSON Web Key Set used to verify OAuth access-token signaturesgetRFC 8414 authorization-server metadata for the connected-app OAuth servergetRFC 9728 protected-resource metadata for an MCP resourcegetRFC 9728 protected-resource metadata for an MCP resourcegetOpenID Connect discovery document for the connected-app OAuth serverget
Credit Note Links
    Link a credit note to the invoice it creditspostCheck a credit note’s links and the invoices it can be linked topostDetach a credit note from the invoices it is applied topost
Credit Notes
    List credit notesgetCreate a credit notepostGet a credit notegetGet the delivery status of a credit notegetDownload the credit note PDFgetSend a credit note to the customerpostCredit a whole invoicepost
Customers
    List customersgetCreate a customerpostGet a customergetDelete a customerdeleteUpdate a customerpatchList a customer's contactsgetList a customer's departmentsgetList customer groupsget
Dimensions
    List all dimensionsgetCreate a new dimension categorypostGet a dimensiongetUpdate a dimension categoryputDelete a dimension categorydeleteList distribution keys (paginated)getCreate a distribution keypostGet a distribution keygetList dimension values (paginated)getCreate a new dimension valuepostUpdate a dimension valueputDelete a dimension valuedelete
Discounts
    List discountsgetCreate a discountpostGet a discountgetDelete a discountdeleteUpdate a discountpatchSet a discount's amount in one currencyputRemove a discount's amount in one currencydeleteCheck whether a discount applies to a product for a customer on a daygetAssign a discountpostRemove an assignmentdeleteUpdate an assignmentpatchList a discount's codesgetAdd a code to a discountpostDelete a codedeleteUpdate a codepatchList the discounts that apply to a product for a customer on a daygetCheck a cartpostLook up a discount codeget
Document Templates
    List document templatesget
Document Upload Links
    Upload a file through a minted linkpost
Download Links
    Mint a download link for a document PDFgetDownload a minted linkget
Draft Journal Entries
    Create multiple draft journal entries in batchpostList draft journal entriesgetCreate a draft journal entrypostGet a draft journal entrygetDelete a draft journal entrydeleteBook a draft journal entrypost
Draft Journal Entries (v2)
    Create draft journal entries in batch (v2)postList draft journal entries (v2)getCreate a draft journal entry (v2)postGet a draft journal entry (v2)getDelete a draft journal entry (v2)deleteUpdate a draft journal entry (v2)patchGet attachments for a draft journal entry (v2)getAdd a document to a draft journal entry (v2)postRemove a document from a draft journal entry (v2)deleteBook a draft journal entry (v2)post
Entitlements
    List entitlementsgetCreate an entitlementpostGet an entitlementgetDelete an entitlementdeleteUpdate an entitlementpatch
Invoices
    List invoicesgetCreate a draft invoicepostGet an invoicegetDelete a draft invoicedeleteUpdate an unsent invoicepatchGet the delivery status of an invoicegetDownload the invoice PDFgetSend an invoice to the customerpost
Journal Categories
    List journal categoriesgetCreate a journal categorypostUpdate a journal categoryputDelete a journal categorydelete
Journal Entries
    List journal entriesgetGet a journal entrygetUpdate a journal entry — correct the reference and/or set your external system idpatchGet attachments for a journal entrygetAdd a document to a journal entrypostRemove a document from a journal entrydeletePreview a correction without posting itpostMove postings to different accounts, keeping the document intactpostRebuild the entry a reversal undid, as a draftpostPreview rebuilding the entry a reversal undidpostReverse a posted entry and open a draft to re-enter itpostReverse posted journal entries in batchpostPreview reversing posted journal entries in batchpostReverse a posted journal entrypostPreview reversing a posted journal entrypost
Journal Entries (v2)
    Create a journal entry (v2)postCreate journal entries in batch (v2)post
MCP
    LedgerBee Developer MCP Serverpost
Meters
    List meter subscriptions by IDgetReport usagepostList meter subscriptions by nameget
Open Entries
    List a counterparty’s open entriesget
Order Confirmations
    List order confirmationsgetCreate a draft order confirmationpostGet an order confirmationgetUpdate a draft order confirmationpatchConvert an order confirmation into an invoicepostDownload an order confirmation as PDFgetSend an order confirmationpost
Payment Methods
    List saved payment methods for a customergetCancel a saved card on the payment providerdeleteUnassign a payment method from a customerdeleteGenerate a link for the customer to save a card for future paymentspostSet a saved payment method as the customer defaultput
Portal Plans
    List the full plan cataloguegetGet a plangetResolve the gated pricing catalogue for an identified buyer (partner display)post
Portal SSO
    Get a tenant's SSO signing keys (JWKS)getMint a checkout-vouch token (partner-vouched anonymous checkout)postMint a customer-portal SSO handoff referencepostProvision a customer + grant portal access (partner JIT provisioning)postRevoke (force-refresh) a user's customer-portal sessionspost
Product Groups
    List product groupsgetCreate a product grouppostGet a product groupgetDelete a product groupdeleteUpdate a product grouppatch
Product Prices
    Create a product pricepostGet a product pricegetDelete a product pricedeleteUpdate a product pricepatchActivate a product pricepostArchive a product pricepostDisable a product pricepostSet a price as the product defaultpost
Products
    List productsgetCreate a productpostGet a productgetDelete a productdeleteUpdate a productpatchArchive a productpost
Projects
    List all projectsgetCreate or update a project by external referenceputCreate a projectpostGet a projectgetUpdate a projectputGet project profitgetAdd a subprojectpostUpdate a subprojectputDelete a subprojectdelete
Quotes
    List quotesgetCreate a draft quotepostGet a quotegetUpdate a draft quotepatchConvert a quotepostDownload a quote as PDFgetSend a quotepost
Settlements
    List a counterparty’s settlementsgetSettle open entries against each otherpostGet a settlementgetUndo a settlementpostCheck what undoing a settlement would dopostCheck what settling these entries would dopost
Shipments
    List shipmentsgetCreate a shipment from an orderpostGet a shipmentgetCancel a shipmentpostDispatch a shipmentpost
Stock
    List stock movementsgetList on-hand stockgetOn-hand for one productget
Subscriptions
    List customer subscriptionsgetAssign a subscription to a customerpostGet a customer subscription by its stable idgetUpdate a customer subscriptionpatchAdd an add-on to a customer subscriptionpostAttach existing subscriptions as add-onspostCheck whether subscriptions can become add-onspostChange the products on a customer subscriptionpostRetry a failed card paymentpostList a subscription's pending scheduled changesgetCancel a single pending scheduled changedeleteGet a subscription's unbilled usagegetCancel a customer subscriptionpostList subscription plansgetCreate a subscription planpostArchive a subscription planpost
Suppliers
    List suppliersgetCreate a supplierpostDelete a supplierdeleteList supplier contactsgetList supplier departmentsgetList supplier groupsget
VAT Codes
    List VAT codesgetCreate a VAT codepostGet a VAT codegetDelete a VAT codedeleteUpdate a VAT codepatch
VAT periods
    Record a VAT return filed outside LedgerBeepostPreview recording a VAT return filed outside LedgerBeepostSettle a filed VAT periodpostPreview a VAT period settlementpost
Vendors
    List vendorsgetCreate a vendorpostList vendor contactsgetList vendor departmentsgetList vendor groupsget
Webhook Endpoints
    List webhook endpointsgetCreate a webhook endpointpostRetrieve a webhook endpointgetUpdate a webhook endpointputDelete a webhook endpointdeleteRoll the signing secretpostSend a test eventpost
Schemas
LedgerBee Public API
LedgerBee Public API

Portal Plans

Download schema

List the full plan catalogue

GET
https://api.ledgerbee.com/api
/v1/portal/plans
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Returns every ACTIVE plan with a PUBLISHED version in the API key's tenant, projected as its canonical native card and ordered by display order. This is the integrator's FULL catalogue — it does NOT run the per-buyer rule engine, does NOT filter by any plan-routing visibility rule, and mints NO token. Use it to read all your plans (e.g. to build pricing pages), as opposed to resolve, which returns only the subset a specific buyer matches.

Required Scope

  • portal-catalog-read

List the full plan catalogue › query Parameters

customerType
​string · enum

Buyer customer type for gross-price resolution.

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
vatNumber
​string

Buyer VAT number for gross-price resolution. Accepted only with customerType: 'BUSINESS' (a coded 400 otherwise). Requires a country hint to have any effect. On the resolve read it is ignored when customerId is supplied — a customer-backed resolve stays net-only.

Example: DK12345678
currency
​string

Presentment currency for every card's pricing. Must be in each card's availableCurrencies; cards that can't resolve it render null prices. Defaults to each card's own currency.

Example: EUR
language
​string · enum

Language the resolved cards are localized to. Defaults to en.

Enum values:
en
da
Example: en
country
​string

Buyer country (ISO 3166-1 alpha-2) for gross-price resolution. With customerType, each card's vat block resolves through the same VAT authority the checkout quote uses; without hints every card is net-only (vat.resolved: false).

Example: DK
discountCode
​string · maxLength: 64

A discount code a buyer typed. Each SUBSCRIPTION card then carries discount: the code priced for that card's first period exactly as the checkout quote prices it (the first invoice before VAT with the code, firstPeriodNetMinor; what the code takes off it, firstPeriodAmountOffMinor; and the day the regular price starts, endsAt). A card the code cannot price carries discount: null. A code that is unknown, used up or not for this buyer is refused with its DISCOUNT_* code. A request naming a code spends one use of the code-attempt budget this API key shares with the checkout quote, the session and the discount cart check. Without it, or with a code of spaces alone, no card carries discount.

Example: WELCOME10

List the full plan catalogue › Responses

PublicPortalPlansListResponse
​PublicPortalCatalogEntry[] · required

Every ACTIVE plan with a PUBLISHED version in the API key's tenant, projected as its canonical native card and ordered by display order. This is the integrator's full catalogue — NOT filtered by any per-visitor visibility rule and NOT run through the plan-routing rule engine — though a plan whose every card references a retired/archived subscription template is omitted (nothing renderable or sellable remains). Each entry carries the full card content the integrator renders.

GET/v1/portal/plans
curl https://api.ledgerbee.com/api/v1/portal/plans \ --header 'x-api-key: <api-key>'
Example Responses
{ "plans": [ { "plan": { "id": "id", "planVersionId": "planVersionId", "vanity": "vanity", "title": "title", "description": "description", "cardStyle": "variant1", "displayedCadences": [ "month-1", "year-1" ], "defaultDisplayedCadence": "defaultDisplayedCadence", "items": [ { "id": "id", "itemType": "SUBSCRIPTION", "sourceSubscriptionId": "sourceSubscriptionId", "ctaLink": "ctaLink", "ctaPresetKey": "ctaPresetKey", "displayOrder": 0, "planName": "planName", "description": "description", "features": [ "string" ], "isMostPopular": true, "ctaLabel": "ctaLabel", "titleColor": "titleColor", "ctaColor": "ctaColor", "planIconKey": "planIconKey", "planIconColor": "planIconColor", "hidePlanIcon": true, "featureIconColor": "featureIconColor", "currency": "DKK", "availableCurrencies": [ "DKK", "EUR" ], "priceMinor": 9900, "cadenceKey": "month-1", "allowedCadences": [ "month-1", "year-1" ], "defaultCadence": "month-1", "cadencePrices": { "month-1": 9900, "year-1": 99000 }, "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ], "productsByCadence": { "key": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] }, "vat": { "resolved": true, "grossPriceMinor": 12375, "grossCadencePrices": { "month-1": 12375, "year-1": 123750 }, "grossOneTimeMinor": 0 }, "addons": [ { "planId": "00000000-0000-0000-0000-000000000000", "sourceSubscriptionId": "00000000-0000-0000-0000-000000000000", "name": "name", "description": "description", "priceMinor": 0, "cadenceKey": "month-1", "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] } ], "discount": { "code": "WELCOME10", "name": "Welcome offer", "type": "percentage", "firstPeriodNetMinor": 8000, "firstPeriodAmountOffMinor": 2000, "endsAt": "2026-11-14", "durationInPeriods": 1 } } ], "comparison": { "sections": [ { "title": "title", "rows": [ { "label": "label", "cells": { "key": { "kind": "empty", "value": "value" } } } ] } ] } }, "displayOrder": 0, "isLegacyForVisitor": true, "checkoutable": true } ] }
json
application/json

Get a plan

GET
https://api.ledgerbee.com/api
/v1/portal/plans/{planId}
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Returns a single plan by its id, projected as its canonical native card — the integrator's by-id read. Does NOT run the rule engine and does NOT filter by visibility rules: every published plan of the tenant resolves here. Returns 404 PORTAL_PLAN_NOT_FOUND only when the plan id is unknown to the tenant or has no published version.

Required Scope

  • portal-catalog-read

Get a plan › path Parameters

planId
​string · required

The plan id (uuid).

Example: 550e8400-e29b-41d4-a716-446655440100

Get a plan › query Parameters

customerType
​string · enum

Buyer customer type for gross-price resolution.

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
vatNumber
​string

Buyer VAT number for gross-price resolution. Accepted only with customerType: 'BUSINESS' (a coded 400 otherwise). Requires a country hint to have any effect. On the resolve read it is ignored when customerId is supplied — a customer-backed resolve stays net-only.

Example: DK12345678
currency
​string

Presentment currency for every card's pricing. Must be in each card's availableCurrencies; cards that can't resolve it render null prices. Defaults to each card's own currency.

Example: EUR
language
​string · enum

Language the resolved cards are localized to. Defaults to en.

Enum values:
en
da
Example: en
country
​string

Buyer country (ISO 3166-1 alpha-2) for gross-price resolution. With customerType, each card's vat block resolves through the same VAT authority the checkout quote uses; without hints every card is net-only (vat.resolved: false).

Example: DK
discountCode
​string · maxLength: 64

A discount code a buyer typed. Each SUBSCRIPTION card then carries discount: the code priced for that card's first period exactly as the checkout quote prices it (the first invoice before VAT with the code, firstPeriodNetMinor; what the code takes off it, firstPeriodAmountOffMinor; and the day the regular price starts, endsAt). A card the code cannot price carries discount: null. A code that is unknown, used up or not for this buyer is refused with its DISCOUNT_* code. A request naming a code spends one use of the code-attempt budget this API key shares with the checkout quote, the session and the discount cart check. Without it, or with a code of spaces alone, no card carries discount.

Example: WELCOME10

Get a plan › Responses

PublicPortalPlanResponse
​object · required

A single plan projected as its canonical native card. Returns 404 PORTAL_PLAN_NOT_FOUND when the plan id is unknown to the API key's tenant, has no published version, or every card on the published version references a retired/archived subscription template (nothing renderable or sellable remains) — never filtered by visibility rules or the rule engine.

GET/v1/portal/plans/{planId}
curl https://api.ledgerbee.com/api/v1/portal/plans/:planId \ --header 'x-api-key: <api-key>'
Example Responses
{ "plan": { "plan": { "id": "id", "planVersionId": "planVersionId", "vanity": "vanity", "title": "title", "description": "description", "cardStyle": "variant1", "displayedCadences": [ "month-1", "year-1" ], "defaultDisplayedCadence": "defaultDisplayedCadence", "items": [ { "id": "id", "itemType": "SUBSCRIPTION", "sourceSubscriptionId": "sourceSubscriptionId", "ctaLink": "ctaLink", "ctaPresetKey": "ctaPresetKey", "displayOrder": 0, "planName": "planName", "description": "description", "features": [ "string" ], "isMostPopular": true, "ctaLabel": "ctaLabel", "titleColor": "titleColor", "ctaColor": "ctaColor", "planIconKey": "planIconKey", "planIconColor": "planIconColor", "hidePlanIcon": true, "featureIconColor": "featureIconColor", "currency": "DKK", "availableCurrencies": [ "DKK", "EUR" ], "priceMinor": 9900, "cadenceKey": "month-1", "allowedCadences": [ "month-1", "year-1" ], "defaultCadence": "month-1", "cadencePrices": { "month-1": 9900, "year-1": 99000 }, "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ], "productsByCadence": { "key": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] }, "vat": { "resolved": true, "grossPriceMinor": 12375, "grossCadencePrices": { "month-1": 12375, "year-1": 123750 }, "grossOneTimeMinor": 0 }, "addons": [ { "planId": "00000000-0000-0000-0000-000000000000", "sourceSubscriptionId": "00000000-0000-0000-0000-000000000000", "name": "name", "description": "description", "priceMinor": 0, "cadenceKey": "month-1", "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] } ], "discount": { "code": "WELCOME10", "name": "Welcome offer", "type": "percentage", "firstPeriodNetMinor": 8000, "firstPeriodAmountOffMinor": 2000, "endsAt": "2026-11-14", "durationInPeriods": 1 } } ], "comparison": { "sections": [ { "title": "title", "rows": [ { "label": "label", "cells": { "key": { "kind": "empty", "value": "value" } } } ] } ] } }, "displayOrder": 0, "isLegacyForVisitor": true, "checkoutable": true } }
json
application/json

Resolve the gated pricing catalogue for an identified buyer (partner display)

POST
https://api.ledgerbee.com/api
/v1/portal/plans/resolve
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Runs the plan-routing rule engine for the buyer identified by customerId (or the no-customer-yet countryCode/customerType hints) within the API key's tenant, and returns the plans that buyer can SEE and CHECK OUT — including non-public (gated) plans the buyer matches — plus a reusable, read-only load-time catalog token. The partner returns the token to each embed iframe (via its fetchCatalogToken provider) to authorize the by-id pricing-card / checkout-document reads. Does NOT consult allowSelfSignup and never publishes to the CDN.

Required Scope

  • portal-catalog-read

Resolve the gated pricing catalogue for an identified buyer (partner display) › Headers

x-api-idempotency-key
​string · maxLength: 255

Optional idempotency key for safely retrying mutating requests.

Resolve the gated pricing catalogue for an identified buyer (partner display) › Request Body

PublicResolvePortalPlansRequest
customerType
​string · enum

Buyer customer type for gross-price resolution.

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
vatNumber
​string

Buyer VAT number for gross-price resolution. Accepted only with customerType: 'BUSINESS' (a coded 400 otherwise). Requires a country hint to have any effect. On the resolve read it is ignored when customerId is supplied — a customer-backed resolve stays net-only.

Example: DK12345678
currency
​string

Presentment currency for every card's pricing. Must be in each card's availableCurrencies; cards that can't resolve it render null prices. Defaults to each card's own currency.

Example: EUR
customerId
​string

The buyer's LedgerBee customer id (an identity HANDLE — the server hydrates customer group / country / type from it; raw rule attributes are never accepted). The customer must exist in the API key's tenant (a 404 CUSTOMER_NOT_FOUND otherwise). When present, the server-resolved identity wins and the countryCode/customerType hints are ignored.

Example: 550e8400-e29b-41d4-a716-446655440010
buyerEmail
​string

The specific person (their email) the partner is acting on behalf of under customerId — e.g. the user currently signed in on the partner's site. Bound into the catalog token: when that token is later exchanged for a portal login handoff, THIS person is logged in (or bootstrapped credential-less under the customer's organization), instead of the customer's contact email / first member. Ignored without customerId; does not affect catalog visibility.

Example: buyer@partner.example
countryCode
​string

ISO 3166-1 alpha-2 country hint for the no-customer-yet preview (drives the country rule clause). Ignored when customerId is supplied.

Example: DK
planIds
​string[]

Resolve only these plan ids. Omit to resolve every ACTIVE plan of the tenant. Each must be a uuid.

Example: ["550e8400-e29b-41d4-a716-446655440100"]
language
​string · enum

Language the resolved cards are localized to. Defaults to en.

Enum values:
en
da
Example: en
discountCode
​string · maxLength: 64

A discount code a buyer typed. Each SUBSCRIPTION card then carries discount: the code priced for that card's first period exactly as the checkout quote prices it (the first invoice before VAT with the code, firstPeriodNetMinor; what the code takes off it, firstPeriodAmountOffMinor; and the day the regular price starts, endsAt). A card the code cannot price carries discount: null. A code that is unknown, used up or not for this buyer is refused with its DISCOUNT_* code. A request naming a code spends one use of the code-attempt budget this API key shares with the checkout quote, the session and the discount cart check. Without it, or with a code of spaces alone, no card carries discount. With customerId, that customer's own uses of the code count against its per-customer limit.

Example: WELCOME10

Resolve the gated pricing catalogue for an identified buyer (partner display) › Responses

PublicResolvePortalPlansResponse
​PublicPortalCatalogEntry[] · required

The plans visible AND checkout-able to the resolved buyer, each carrying the full card content the partner renders. Non-public (gated) plans appear here when the buyer matches their rule.

catalogToken
​string · required

Opaque, reusable, read-only load-time catalog token (43-char base64url). The partner returns it to each embed iframe via its fetchCatalogToken provider; the iframe presents it as a Bearer token to the by-id pricing-card / checkout-document reads. Scoped to the resolved buyer + the returned plans — replay yields only the same already-authorized cards. Treat it as a client secret (TLS-only, never log, never put on a URL).

Example: Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s
expiresAt
​string · required

ISO-8601 expiry of the catalog token.

Example: 2026-06-06T12:34:56.000Z
​object · required

Why plans were (or were not) returned — the "why is my catalogue empty" answer.

POST/v1/portal/plans/resolve
curl https://api.ledgerbee.com/api/v1/portal/plans/resolve \ --request POST \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "customerType": "BUSINESS", "vatNumber": "DK12345678", "currency": "EUR", "customerId": "550e8400-e29b-41d4-a716-446655440010", "buyerEmail": "buyer@partner.example", "countryCode": "DK", "planIds": [ "550e8400-e29b-41d4-a716-446655440100" ], "language": "en", "discountCode": "WELCOME10" }'
Example Request Body
{ "customerType": "BUSINESS", "vatNumber": "DK12345678", "currency": "EUR", "customerId": "550e8400-e29b-41d4-a716-446655440010", "buyerEmail": "buyer@partner.example", "countryCode": "DK", "planIds": [ "550e8400-e29b-41d4-a716-446655440100" ], "language": "en", "discountCode": "WELCOME10" }
json
application/json
Example Responses
{ "plans": [ { "plan": { "id": "id", "planVersionId": "planVersionId", "vanity": "vanity", "title": "title", "description": "description", "cardStyle": "variant1", "displayedCadences": [ "month-1", "year-1" ], "defaultDisplayedCadence": "defaultDisplayedCadence", "items": [ { "id": "id", "itemType": "SUBSCRIPTION", "sourceSubscriptionId": "sourceSubscriptionId", "ctaLink": "ctaLink", "ctaPresetKey": "ctaPresetKey", "displayOrder": 0, "planName": "planName", "description": "description", "features": [ "string" ], "isMostPopular": true, "ctaLabel": "ctaLabel", "titleColor": "titleColor", "ctaColor": "ctaColor", "planIconKey": "planIconKey", "planIconColor": "planIconColor", "hidePlanIcon": true, "featureIconColor": "featureIconColor", "currency": "DKK", "availableCurrencies": [ "DKK", "EUR" ], "priceMinor": 9900, "cadenceKey": "month-1", "allowedCadences": [ "month-1", "year-1" ], "defaultCadence": "month-1", "cadencePrices": { "month-1": 9900, "year-1": 99000 }, "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ], "productsByCadence": { "key": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] }, "vat": { "resolved": true, "grossPriceMinor": 12375, "grossCadencePrices": { "month-1": 12375, "year-1": 123750 }, "grossOneTimeMinor": 0 }, "addons": [ { "planId": "00000000-0000-0000-0000-000000000000", "sourceSubscriptionId": "00000000-0000-0000-0000-000000000000", "name": "name", "description": "description", "priceMinor": 0, "cadenceKey": "month-1", "oneTimeMinor": 0, "products": [ { "priceId": "priceId", "label": "label", "description": null, "quantity": 1, "pricingModel": "flat_rate", "kind": "RECURRING", "unitPriceMinor": 1000, "currency": "DKK", "tiered": true, "tiers": [ { "fromQuantity": 0, "toQuantity": 100, "unitAmountMinor": 1000, "flatFeeMinor": null } ], "billingInterval": "month", "billingIntervalCount": 1 } ] } ], "discount": { "code": "WELCOME10", "name": "Welcome offer", "type": "percentage", "firstPeriodNetMinor": 8000, "firstPeriodAmountOffMinor": 2000, "endsAt": "2026-11-14", "durationInPeriods": 1 } } ], "comparison": { "sections": [ { "title": "title", "rows": [ { "label": "label", "cells": { "key": { "kind": "empty", "value": "value" } } } ] } ] } }, "displayOrder": 0, "isLegacyForVisitor": true, "checkoutable": true } ], "catalogToken": "Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s", "expiresAt": "2026-06-06T12:34:56.000Z", "diagnostics": { "activePlansConsidered": 0, "tenantHasNoVisibilityRules": true, "droppedByVisibility": 0, "droppedByCheckoutable": 0 } }
json
application/json

Payment MethodsPortal SSO