Skip to main content

Products

A product represents something you sell — a service, subscription tier, or physical good. Products are the top-level catalog entity; each product can have one or more prices attached to it. When you add a line item to an invoice by referencing a price (price_…), the product’s name automatically appears as the line-item description unless you override it. Deleting a product archives it (active: false). Archived products no longer appear as active catalog items, but all existing invoice lines referencing them are preserved. Base URL: https://invoice.horizonpay.co/api/v1

The product object

string
Unique identifier for the product. Prefixed with prod_.
string
String literal "product".
string
Display name of the product. Used as the default line-item description when this product’s price is added to an invoice.
string | null
Optional longer description. Maximum 500 characters.
string[]
Array of public image URLs (up to 8). URLs must be accessible over HTTPS.
boolean
true while the product is available in the catalog. Set to false by the delete endpoint (archive).
string
ISO 8601 datetime at which the product was created.
string
ISO 8601 datetime of the most recent update.

Endpoints

List all products in your workspace. Results are cursor-paginated, newest first.Required scope: products:read

Query parameters

string
Free-text search against product names and descriptions.
boolean
Filter by active status. Pass true to return only active products, false for archived ones. Omit to return both.
string
Pagination cursor from a previous response’s next_cursor. Omit to start from the first page.
integer
Number of results per page. Defaults to 20; maximum is 100.

Request

Response

Create a new product. name is the only required field.Required scope: products:write

Body parameters

string
required
Product name. Minimum 1 character, maximum 200 characters.
string
Optional description shown on invoices and the catalog.
string[]
Array of HTTPS image URLs (up to 8). Each URL must be valid and publicly accessible. Defaults to [].
boolean
Whether the product is active in the catalog. Defaults to true.

Request

Response 201 Created

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

Request

Response 200 OK

Update one or more fields on an existing product. Omitted fields are left unchanged.Required scope: products:write
To clear an optional text field such as description, send null explicitly: "description": null. Sending "" (empty string) has the same effect.

Body parameters

All fields are optional. Include only those you want to change.
string
New product name. Minimum 1 character, maximum 200 characters.
string | null
New description. Pass null or "" to clear.
string[]
Replacement image URL array. Passing [] removes all images. Replaces the entire existing array — not merged.
boolean
Set to false to manually deactivate a product without deleting it.

Request

Response 200 OK

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

Request

Response 200 OK

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

Error responses