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: 0–100.boolean
true while the price is available to attach to new invoice lines.string
ISO 8601 datetime at which the price was created.
Endpoints
GET /api/v1/prices — List prices
GET /api/v1/prices — List prices
List prices across your catalog. Results are cursor-paginated.Required scope:
products:readQuery 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
POST /api/v1/prices — Create a price
POST /api/v1/prices — Create a price
Create a new price and attach it to an existing product. For recurring prices, the Response
Response
recurring object is required.Required scope: products:writeunit_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: 0–100. Defaults to 0.string
Internal label for this price.
Request — one-time price
Response 201 Created
Request — recurring price
Response 201 Created
GET /api/v1/prices/:id — Retrieve a price
GET /api/v1/prices/:id — Retrieve a price
PATCH /api/v1/prices/:id — Update a price
PATCH /api/v1/prices/:id — Update a price
Update mutable fields on a price. Omitted fields are left unchanged.Required scope: Response
products:writeunit_amount remains in minor units on update. To change a 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:
0–100.boolean
Set to
false to deactivate without deleting.Request
Response 200 OK
DELETE /api/v1/prices/:id — Archive a price
DELETE /api/v1/prices/:id — Archive a price
Archive a price. The price is set to Response
The archived price object is returned, with
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.