Prices

How much a product costs and how often it is billed. Prices are immutable apart from activation and metadata.

The price object

idstring
Prefixed price_.
productstring
activeboolean
currencystring
typeenum
one_time or recurring.
unit_amountinteger | null
Per unit, in the smallest currency unit. null for tiered prices. Includes VAT unless tax_behavior is exclusive.
tax_behaviorenum
inclusive or exclusive. See amounts and VAT.
recurringobject | null
interval (day, week, month, year), interval_count, usage_type (licensed or metered), aggregate_usage.
tiersarray | null
Tier objects with up_to (number or null for the last tier), unit_amount, flat_amount.
tiers_modeenum | null
graduated or volume.
meterstring | null
Meter for metered prices.
included_unitsinteger | null
Free units per period for metered prices.
accounting_codestring | null
Revenue account code copied to invoice lines.
metadataobject
created_attimestamp
updated_attimestamp

Amounts and VAT

By default (tax_behavior: "inclusive") a price's amounts are what the customer pays, VAT included. The product's tax_rate says how much of that is VAT, so the invoice line can show the net and the tax: a monthly price of 1,240 kr. on a product at tax_rate: 2400 charges 1,240 kr. and books as 1,000 kr. plus 240 kr. VAT. Changing the rate never changes what an inclusive price charges.

Every amount in Borga works this way by default, a payment's line items included: unit_amount is the figure quoted to the customer and carries the VAT the way a shelf price does.

If your catalogue is priced before VAT, create the price with tax_behavior: "exclusive". Its unit_amount and tier amounts are then the net, and every invoice line built from the price adds the VAT at the product's rate on top, rounded per unit: a monthly price of 999 kr. at 24% bills 1,239 kr., booked as 999 kr. plus 240 kr. VAT. The charges, prorations, discounts, quotes and MRR all work from that gross. Here a corrected product rate does change what is charged, since the VAT is added to the net. tax_behavior is fixed when the price is created, like its amounts.

These examples are for a customer who pays VAT. A customer whose VAT status is exempt or reverse is charged the net with no VAT under either behaviour: 1,000 kr. for the inclusive price above, 999 kr. for the exclusive one.

The rate is read when an invoice line is built: the product's tax_rate, else your default VAT rate under Settings. VAT is off until you turn it on there with a rate; off, nothing is booked as tax and the customer is charged the amount. A corrected product rate, or a change in the law, reaches every invoice from then on; each line keeps the rate it was booked at.

Create a price

POST/v1/pricesSecret key

Body

productstringrequired
typeenumrequired
one_time or recurring.
currencystringdefault: ISK
unit_amountinteger
Per unit. Omit when using tiers.
tax_behaviorenumdefault: inclusive
inclusive when unit_amount and the tiers include VAT, exclusive when they are the net and the product's VAT is added on top.
recurringobject
Required for recurring prices: { interval, interval_count?, usage_type?, aggregate_usage? }. interval is day, week, month or year.
tiers_modeenum
graduated prices each band separately; volume prices everything at the reached band.
tiersarray
[{ up_to, unit_amount?, flat_amount? }], ordered, last tier with up_to: null.
meterstring
Required when recurring.usage_type is metered.
included_unitsinteger
Free units per period before tiers apply.
accounting_codestring
Copied to invoice lines for this price.
metadataobject
Fixedts
const product = await borga.products.create({
  name: "Pro plan",
  description: "Everything in Starter plus priority support",
});

const monthly = await borga.prices.create({
  product: product.id,
  type: "recurring",
  currency: "ISK",
  unit_amount: 4990, // 4.990 kr. per seat per month
  recurring: { interval: "month", interval_count: 1 },
});

const yearly = await borga.prices.create({
  product: product.id,
  type: "recurring",
  currency: "ISK",
  unit_amount: 49900,
  recurring: { interval: "year" },
});
Response
{
  "id": "price_2Ab4Cd6Ef8Gh0Ij2Kl4Mn6Op",
  "product": "prod_4Gh6Ij8Kl0Mn2Op4Qr6St8Uv",
  "active": true,
  "currency": "ISK",
  "type": "recurring",
  "unit_amount": 4990,
  "tax_behavior": "inclusive",
  "recurring": { "interval": "month", "interval_count": 1, "usage_type": "licensed" },
  "tiers": null,
  "tiers_mode": null,
  "meter": null,
  "included_units": null,
  "accounting_code": null,
  "metadata": {},
  "created_at": "2026-09-07T10:00:00.000Z",
  "updated_at": "2026-09-07T10:00:00.000Z"
}

Errors: missing_meter, resource_not_found for product or meter.

Retrieve a price

GET/v1/prices/:idSecret key

Update a price

PATCH/v1/prices/:idSecret key

Amounts and intervals cannot change; create a new price and move subscriptions to it.

Body

activeboolean
Deactivate to stop new subscriptions using it.
accounting_codestring
Empty string clears it.
metadataobject

List prices

GET/v1/pricesSecret key

Query parameters

productstring
limitintegerdefault: 25
starting_afterstring