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
GET /api/v1/products — List products
GET /api/v1/products — List products
List all products in your workspace. Results are cursor-paginated, newest first.Required scope:
products:readQuery 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
POST /api/v1/products — Create a product
POST /api/v1/products — Create a product
Create a new product. Response
name is the only required field.Required scope: products:writeBody 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
GET /api/v1/products/:id — Retrieve a product
GET /api/v1/products/:id — Retrieve a product
PATCH /api/v1/products/:id — Update a product
PATCH /api/v1/products/:id — Update a product
Update one or more fields on an existing product. Omitted fields are left unchanged.Required scope: Response
products:writeTo 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
DELETE /api/v1/products/:id — Archive a product
DELETE /api/v1/products/:id — Archive a product
Archive a product. The product is set to Response
The archived product object is returned, with
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.