---
title: "Search the article/labor catalog"
method: GET
path: "/v1/articles"
tags: ["Articles"]
---

# Search the article/labor catalog

`GET /v1/articles`

## Request

- Base URL: `https://api.officina.it`
- URL: `https://api.officina.it/v1/articles`
- Auth: HTTP bearer

The catalog behind the line-item editor's "Cerca da magazzino".
Articles back both the magazzino (parts — `kind: item`) and the
listino manodopera (labor — `kind: work`).

Every whitespace-separated term in `?q=` must match the name,
code, or comments (results are relevance-ranked while searching,
name-sorted while browsing). Pass `?customer_id=` so
`sale_price` reflects the customer's price-list overrides.

## Query parameters

- `q` string
- `kind` 'item' | 'work'
- `customer_id` string, uuid
- `limit` integer
- `starting_after` string
- `supplier_id` string
- `work_category_id` string[]

## Response `200`

One page of catalog rows.

- object
  - `object` 'list', required
  - `data` Article[], required
    - `object` 'article', required
    - `id` string, uuid, required
    - `code` string, nullable, required
    - `name` string, required
    - `kind` 'item' | 'work', required: "item" = magazzino (kg, L, kit, pz); "work" = manodopera (gg, h, lav, min).
    - `unit_type` string, required
    - `stock` number, required
    - `sale_price` number, nullable, required
    - `vat_code` string, required
    - `unit_discount_rate` integer, nullable, required
    - `minimum_stock` number, nullable
    - `purchase_price` number, nullable
    - `location` string, nullable
    - `comments` string, nullable
    - `supplier_id` string, nullable
    - `supplier_name` string, nullable
    - `work_category_ids` string[]: The work categories ("Categoria") the article is used for, in the shop's order. `[]` when none — never null. On list rows and detail alike.
    - `work_categories` WorkCategory[]: The same list as `work_category_ids` with each category's name, same order. Available since revision 2026-10-04.
      - `object` 'work_category', required
      - `id` string, uuid, required
      - `name` string, required
  - `has_more` boolean, required
  - `next_starting_after` string
  - `url` string, required

## Other responses

- `401`: Missing, malformed, expired, or wrong-audience bearer token.
- `402`: The company has no active subscription, or its plan does not include API access. API access is included in the Business and Illimitato plans.
- `403`: The authenticated user lacks the required permission.
- `422`: A request field is missing or invalid (fast-fail).
- `500`: Unhandled server error. Detail is logged, not exposed.

---

[API](https://skmtc.dev/officina/apis/officina-it-api.md) · [All operations](https://skmtc.dev/officina/apis/officina-it-api/llms.txt) · [OpenAPI document](https://skmtc.dev/officina/apis/officina-it-api/revisions/7da3fccfe551?raw)
