---
title: "Find a product"
method: GET
path: "/v1/products/find"
tags: ["Products"]
---

# Find a product

`GET /v1/products/find`

## Request

- Base URL: `https://api.altoviz.com`
- URL: `https://api.altoviz.com/v1/products/find`
- Auth: none required
- TypeScript: <https://skmtc.dev/altoviz/apis/altoviz-api/docs/v1/products/find/get.ts> (a function with typed inputs; its response is checked against the schema)

## Query parameters

- `number` string
- `internalId` string

## Response `200`

OK

- Product[]
  - `active` boolean: Indicates whether the product is active
  - `defaultQuantity` number, double: Default quantity
  - `description` string, nullable: Description
  - `family` ProductFamily: Product family
    - `id` integer: ID
    - `label` string, nullable: Label
    - `number` string, nullable: Number
  - `id` integer: Product ID
  - `imageUrl` string, nullable: Gets the product image URL
  - `internalId` string, nullable: ID used in your system
  - `internalNotes` string, nullable: Internal notes
  - `isUnitPriceTaxIncluded` boolean: <b>Deprecated</b> — always false on read, because `unitPrice` is now always the tax-excluded price. There is nothing left for it to select between. On write it is still honoured: setting it to true means the price you are sending is tax-included, exactly as before. Send `taxIncludedPrice` instead.
  - `margin` number, double: Margin per unit, excluding tax: tax-excluded price less purchase price. Derived by the server on every save; a value sent here is ignored.
  - `marginRate` number, double: Margin rate: the margin as a percentage of the sale price (FR « taux de marque »). Derived by the server on every save; a value sent here is ignored.
  - `markupRate` number, double: Markup rate: the margin as a percentage of the purchase price (FR « taux de marge »). Derived by the server on every save; a value sent here is ignored.
  - `metadata` object, nullable: Metadata: free-form key/value pairs carried with the product, for an integration to keep its own identifiers and flags against it. Sent as a PATCH, not a replacement: keys you send are added or updated, keys you leave out keep whatever they held, and a key is removed only when you send it as `null`. Omitting the property entirely leaves the whole bag untouched, and `""` stores an empty value rather than removing the key.
  - `name` string, nullable: Name
  - `number` string, nullable: Number
  - `purchasePrice` number, double: Purchase price
  - `taxExcludedPrice` number, double: Sale price excluding tax.
  - `taxIncludedPrice` number, double: Sale price including tax.
  - `type` 'Product' | 'Service' | 'Text'
  - `unit` Unit: Unit
    - `code` string, nullable: Code
    - `conversion` number, double: Conversion
    - `decimals` number, double, nullable: Decimals
    - `id` integer, nullable: Unit Id
    - `name` string, nullable: Name
    - `type` 'Time' | 'Weight' | 'Area' | 'Volume' | 'Dimension' | 'Other'
  - `unitPrice` number, double: <b>Deprecated</b> — use `taxExcludedPrice`. Unit price, excluding tax: the same value as `taxExcludedPrice`. Still populated, and still read on write when neither new price field is sent, so no existing integration has to change today. It used to carry whichever half the product was edited in — the tax-included price when `isUnitPriceTaxIncluded` was true — because only one price was stored. Both are stored now, so this always reports the tax-excluded one and `isUnitPriceTaxIncluded` is always false: a client that reads the flag keeps computing the same result.
  - `vat` Vat: Vat
    - `default` boolean: Indicatess if this is the default VAT for the region
    - `id` integer, nullable: Vat ID
    - `label` string, nullable: Label
    - `rate` number, double, nullable: Rate
    - `region` 'FR' | 'EU' | 'IE' | 'DOM' | 'Corse' | 'Monaco'

## Other responses

- `404`: Not Found

## Changes

- **2026-09-14** `4f7fa64cf9e3`: 8 info
  - added the optional property `items/margin` to the response with the `200` status
  - added the optional property `items/marginRate` to the response with the `200` status
  - added the optional property `items/markupRate` to the response with the `200` status
  - added the optional property `items/metadata` to the response with the `200` status
  - …4 more

[Operation history](https://skmtc.dev/altoviz/apis/altoviz-api/changes/v1/products/find/get.md)

---

[API](https://skmtc.dev/altoviz/apis/altoviz-api.md) - [All operations](https://skmtc.dev/altoviz/apis/altoviz-api/llms.txt) - [OpenAPI document](https://skmtc.dev/altoviz/apis/altoviz-api/revisions/4f7fa64cf9e3?raw)
