Skip to main content

Prices

A price defines how much to charge for a product and how often. Every product can have multiple prices — for example a monthly plan and an annual plan for the same service, or regional prices in different currencies. When a line item on an invoice references a price (price_…), the unit amount, currency, and tax rate are automatically borrowed from the price. You can still override the description, quantity, and discount at the line-item level. All monetary amounts are integers in minor currency units. For USD, 5000 means $50.00. For JPY (a zero-decimal currency), 5000 means ¥5000. Base URL: https://invoice.horizonpay.co/api/v1

The price object

string
Unique identifier for the price. Prefixed with price_.
string
String literal "price".
string
The prod_-prefixed ID of the parent product.
string | null
Optional internal label for the price (e.g. "Monthly Pro", "Enterprise Annual"). Not shown to customers.
integer
The unit price in minor currency units. 4900 USD = $49.00. Must be a non-negative integer.
string
Three-letter ISO 4217 currency code, uppercase (e.g. "USD", "EUR", "GBP").
string
Always "per_unit". Tiered and volume billing are not supported in the current API version.
string
"one_time" for a single charge, or "recurring" for a price that repeats on an interval.
object | null
Present when type is "recurring", null for "one_time" prices.
number
Tax rate percentage to apply to this price, e.g. 8.5 for 8.5%. Range: 0100.
boolean
true while the price is available to attach to new invoice lines.
string
ISO 8601 datetime at which the price was created.

Endpoints

List prices across your catalog. Results are cursor-paginated.Required scope: products:read

Query parameters

string
Filter to prices belonging to a specific product. Accepts a prod_-prefixed ID or UUID.
boolean
Pass true for active prices only, false for archived ones. Omit to return both.
string
Filter by three-letter currency code (e.g. USD).
string
Filter by price type. One of one_time or recurring.
string
Pagination cursor from a previous next_cursor. Omit to start from the first page.
integer
Results per page. Defaults to 20; maximum is 100.

Request

Response

Create a new price and attach it to an existing product. For recurring prices, the recurring object is required.Required scope: products:write
unit_amount is always in minor units (integer). For a price of $49.00 USD, send 4900. For £120.00 GBP, send 12000.

Body parameters

string
required
The prod_-prefixed ID or UUID of the parent product.
integer
required
Price in minor currency units. Must be a non-negative integer.
string
required
Three-letter ISO 4217 currency code, uppercase (e.g. "USD").
string
"one_time" (default) or "recurring". When "recurring", the recurring object is required.
object
Required when type is "recurring".
number
Tax rate percentage, e.g. 8.5 for 8.5%. Range: 0100. Defaults to 0.
string
Internal label for this price.

Request — one-time price

Response 201 Created

Request — recurring price

Response 201 Created

Retrieve a single price by ID.Required scope: products:readThe :id path parameter accepts either the price_-prefixed public ID or the underlying UUID.

Request

Response 200 OK

Update mutable fields on a price. Omitted fields are left unchanged.Required scope: products:write
The parent product cannot be changed after creation. To move a price to a different product, create a new price and archive the old one.
unit_amount remains in minor units on update. To change a 49.00priceto49.00 price to 59.00, send "unit_amount": 5900.

Body parameters

All fields are optional.
string | null
New internal label. Pass null or "" to clear.
integer
New price in minor currency units.
string
New three-letter currency code.
string
"one_time" or "recurring". Changing type requires updating the recurring object accordingly.
object
Update the recurring interval. Only meaningful when type is "recurring".
number
New tax rate percentage. Range: 0100.
boolean
Set to false to deactivate without deleting.

Request

Response 200 OK

Archive a price. The price is set to active: false and will no longer be returned when filtering by active=true. Existing invoice lines that reference this price are not affected.Required scope: products:writeTo reactivate an archived price, use PATCH /api/v1/prices/:id with "active": true.

Request

Response 200 OK

The archived price object is returned, with active: false.

Error responses