---
title: "List orders"
method: GET
path: "/v1/orders"
tags: ["Suppliers"]
---

# List orders

`GET /v1/orders`

## Request

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

The date filter defaults to the last 12 months; the applied
range is echoed back in `date_filter`. Scoped to the authenticated
user's company and gated on the orders.read permission.

## Query parameters

- `q` string
- `status` 'pending' | 'delivery' | 'received'
- `supplier_id` string
- `sort` 'date' | 'number' | 'supplier' | 'invoice' | 'total'
- `direction` 'asc' | 'desc'
- `from` string, date
- `to` string, date
- `preset` 'rel30' | 'rel90' | 'rel365' | 'year' | 'Q1' | 'Q2' | 'Q3' | 'Q4' | 'month' | 'custom' | 'all'
- `limit` integer
- `starting_after` string

## Response `200`

+ date_filter          success

- object
  - `object` 'list', required: Polymorphic discriminator.
  - `data` Order[], required: Page of items. Each item carries its own `object` field.
    - `object` string, required: always "order"
    - `id` string, required
    - `seq_number` integer, required
    - `supplier_id` string, required
    - `supplier_name` string, required
    - `supplier_invoice_reference` string, nullable, required
    - `status` string, required
    - `total_before_tax` number, required
    - `total_tax` number, required
    - `total_after_tax` number, required
    - `total_after_discount` number, required
    - `payment_method` string, required
    - `comments` string, nullable, required
    - `invoice_date` string, date-time, nullable, required
    - `confirmed_at` string, date-time, nullable, required
    - `received_at` string, date-time, nullable, required
    - `created_at` string, date-time, required
  - `has_more` boolean, required: True if more results exist beyond this page. Use this for the "load more" UI — `data.length` alone is unreliable because a full page may still be the last page.
  - `next_starting_after` string: Opaque cursor for the next page. Present (and non-empty) when `has_more` is `true`; omitted otherwise. Pass the value verbatim as `?starting_after=` on the follow-up request. Clients MUST NOT parse it — today it encodes an offset, tomorrow it may encode a `(created_at, id)` tuple without a wire-visible change.
  - `url` string, required: The request path that produced this list.

## 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)
