---
title: "List credit notes"
method: GET
path: "/v1/credit-notes"
tags: ["CreditNotes"]
---

# List credit notes

`GET /v1/credit-notes`

## Request

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

Returns credit notes in the authenticated user's company,
newest first. Search with `?q=` (substring against customer /
title), filter by SDI lifecycle status with `?sdi_status=`,
and bound by `created_at` with `?from=` / `?to=` / `?preset=`.
Paginate with cursor-based `?limit=` + `?starting_after=`.

The date window defaults to the last 12 months; set it with
`from`/`to`/`preset`. The applied range is echoed in
`date_filter`.

The cursor is opaque — pass it back verbatim.

## Query parameters

- `q` string
- `sdi_status` 'to_send' | 'sent' | 'delivered' | 'rejected'
- `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`

Page of credit notes.

- object
  - `object` 'list', required: Polymorphic discriminator.
  - `data` CreditNote[], required: Page of items. Each item carries its own `object` field.
    - `object` 'credit_note', required
    - `id` string, required
    - `invoice_id` string, required: Source invoice UUID. Immutable.
    - `seq_number` integer, nullable: Per-company / per-sezionale monotonic number. May be null on freshly created credit notes that have not yet been issued — clients render "Bozza" / draft when absent.
    - `title` string, nullable
    - `sezionale_id` string, nullable
    - `sezionale_code` string, nullable: Denormalized sezionale code for display. Read-only; mutate via `sezionale_id` at creation time.
    - `customer_name` string, required: Denormalized display string of the source invoice's customer.
    - `vehicle_name` string, required: Denormalized display string of the linked vehicle.
    - `vehicle_license` string, required
    - `sdi_status` string, required: Italian SDI e-invoice lifecycle status. Empty string when no e-credit-note exists.
    - `latest_sdi_status` string, required: Most recent terminal SDI status observed for this credit note's electronic counterpart.
    - `total_before_tax` number, double, required
    - `total_tax` number, double, required
    - `total_after_tax` number, double, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `deleted_at` string, date-time, nullable: Soft-deletion timestamp. Populated on the response from DELETE /v1/credit-notes/{id}. Credit notes with a non-null deleted_at are not returned by list/detail endpoints — this field appears for the delete response only.
  - `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.
  - `date_filter` DateFilter, required: The effective date range the server applied to a date-scoped list request, echoed on the list envelope so clients can render the active filter without re-deriving it. A request that sends no `from`/`to`/`preset` gets the default window, the last 12 months (`rel365`); nothing is carried over between requests. Relative presets are resolved here to concrete dates and roll forward over time.
    - `object` 'date_filter', required
    - `preset` 'rel30' | 'rel90' | 'rel365' | 'year' | 'Q1' | 'Q2' | 'Q3' | 'Q4' | 'month' | 'custom' | 'all', required: Effective selection label. Relative (`rel30`/`rel90`/`rel365`) and absolute (`year`/`Q1`-`Q4`/`month`/`custom`) carry `from`/`to`; `all` omits them.
    - `from` string, date: Inclusive lower bound (YYYY-MM-DD). Omitted when `preset` is `all`.
    - `to` string, date: Inclusive upper bound (YYYY-MM-DD). Omitted when `preset` is `all`.

## 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.
- `415`: Content-Type is not `application/json`, or Accept rejects JSON.
- `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)
