List Invoice Items
/v1/invoice-itemsReturns a cursor-paginated list of invoice line items for the active workspace. Read only, no side effects. For example, the Claude API line on the Anthropic invoice. ## Filtering & sorting Filter via `POST /v1/records/query` (root `invoice_items`) or the `filters` model; operators are gated by each field's data type. See [Filtering & sorting](../filtering-and-sorting). **Filterable fields** | Field | Type | Allowed operators | |---|---|---| | `accounting_line_total` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `accounting_unit_price` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `composite_invoice_item_summary` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `created_at` | date | `eq` `lt` `gt` `is_null` `is_not_null` | | `currency` | enum | `eq` `neq` `in` `is_null` `is_not_null` | | `deleted_at` | date | `eq` `lt` `gt` `is_null` `is_not_null` | | `description` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `discount` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `invoice_item_id` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `line_id` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `line_total` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `max_quantity` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `min_quantity` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `name` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `period_end` | date | `eq` `lt` `gt` `is_null` `is_not_null` | | `period_start` | date | `eq` `lt` `gt` `is_null` `is_not_null` | | `pk` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `quantity` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `sku` | text | `contains` `eq` `neq` `starts_with` `ends_with` `is_null` `is_not_null` | | `tax_amount` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `tax_category` | enum | `eq` `neq` `in` `is_null` `is_not_null` | | `tax_rate` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `tax_scheme` | enum | `eq` `neq` `in` `is_null` `is_not_null` | | `unit` | enum | `eq` `neq` `in` `is_null` `is_not_null` | | `unit_price` | number | `eq` `neq` `gt` `gte` `lt` `lte` `is_null` `is_not_null` | | `updated_at` | date | `eq` `lt` `gt` `is_null` `is_not_null` | **Sortable fields:** `accounting_line_total`, `accounting_unit_price`, `composite_invoice_item_summary`, `created_at`, `currency`, `deleted_at`, `description`, `discount`, `invoice_item_id`, `line_id`, `line_total`, `max_quantity`, `min_quantity`, `name`, `period_end`, `period_start`, `pk`, `quantity`, `sku`, `tax_amount`, `tax_category`, `tax_rate`, `tax_scheme`, `unit`, `unit_price`, `updated_at` (via `orderBy` / `sort`, `asc`|`desc`).
Requires a bearer token: Authorization: Bearer <token>.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| cursor | string | No | Opaque pagination cursor returned as links.next on the previous page. Omit to fetch the first page.e.g. eyJwayI6MTI4N30 |
| limit | integer | No | Maximum number of records to return per page (1 to 200, defaults to 50).e.g. 50 |
| orderBy | string | No | Field to sort by, using the records dot path or column name (e.g. created_at).e.g. created_at |
| direction | string | No | Sort direction for orderBy. Defaults to desc.e.g. desc |
| workspaceId | string <uuid> | No | Explicit workspace scope. The authenticated user must hold an active membership in this workspace. Defaults to the session workspace when omitted.e.g. a1b2c3d4-0000-4000-8000-000000000001 |
Request
curl -X GET https://api.wellapp.ai/v1/invoice-items \
-H "Authorization: Bearer $WELL_API_TOKEN"Responses
200 — A page of invoice items.
{
"data": [
{
"type": "invoice_item",
"id": "33333333-0000-4000-8000-0000000000d1",
"attributes": {
"line_id": "1",
"sku": "CLAUDE-API",
"name": "Claude API tokens",
"description": "Input and output tokens, April 2026",
"unit_price": 0.000015,
"currency": "USD",
"unit": "token",
"quantity": 80000000,
"line_total": 1200,
"tax_rate": 0,
"tax_amount": 0,
"created_at": "2026-04-12T08:00:00Z",
"updated_at": "2026-04-12T08:00:00Z",
"deleted_at": null
},
"relationships": {
"invoice": {
"data": {
"type": "invoice",
"id": "00000000-0000-4000-8000-000000000001"
}
},
"ledger_account": {
"data": {
"type": "ledger_account",
"id": "00000000-0000-4000-8000-000000000001"
}
},
"applied_tax_rate": {
"data": {
"type": "tax_rate",
"id": "00000000-0000-4000-8000-000000000001"
}
},
"media": {
"data": {
"type": "media",
"id": "00000000-0000-4000-8000-000000000001"
}
}
}
}
],
"meta": {
"total": 1,
"count": 1
},
"links": {
"next": null
}
}400 — Bad request
{
"code": "BAD_REQUEST",
"status": 400,
"title": "Bad Request",
"message": "See title.",
"meta": {
"trace_id": "a1b2c3",
"log_id": "a1b2c3"
}
}401 — Unauthorized
{
"code": "UNAUTHORIZED",
"status": 401,
"title": "Unauthorized",
"message": "See title.",
"meta": {
"trace_id": "a1b2c3",
"log_id": "a1b2c3"
}
}Filtering & sorting on related objects
This resource's related objects (the ones you can include) and how to filter or sort on each:
| Relationship | Cardinality | Filter on a field | Sort by a field |
|---|---|---|---|
invoice | to-one (invoice) | { "invoice": { "grand_total": { "_eq": … } } } | "field": "invoice.grand_total" ✅ |
ledger_account | to-one (ledger_account) | { "ledger_account": { "name": { "_eq": … } } } | "field": "ledger_account.name" ✅ |
applied_tax_rate | to-one (tax_rate) | { "applied_tax_rate": { "field_name": { "_eq": … } } } | "field": "applied_tax_rate.field_name" ✅ |
media | to-one (media) | { "media": { "file_name": { "_eq": … } } } | "field": "media.file_name" ✅ |
Replace field_name with any field of the related object. See its object-reference page for the full field list.
Filter by a to-one relation (and sort by it):
{
"root": "invoice_items",
"whereClause": { "invoice": { "grand_total": { "_ilike": "%acme%" } } },
"orderBy": { "field": "invoice.grand_total", "direction": "asc" }
}