List Invoice Items

get/v1/invoice-items

Returns 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

NameTypeRequiredDescription
cursorstringNoOpaque pagination cursor returned as links.next on the previous page. Omit to fetch the first page.e.g. eyJwayI6MTI4N30
limitintegerNoMaximum number of records to return per page (1 to 200, defaults to 50).e.g. 50
orderBystringNoField to sort by, using the records dot path or column name (e.g. created_at).e.g. created_at
directionstringNoSort direction for orderBy. Defaults to desc.e.g. desc
workspaceIdstring <uuid>NoExplicit 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
curl -X GET https://api.wellapp.ai/v1/invoice-items \
  -H "Authorization: Bearer $WELL_API_TOKEN"

Responses

200A 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
  }
}

400Bad request

{
  "code": "BAD_REQUEST",
  "status": 400,
  "title": "Bad Request",
  "message": "See title.",
  "meta": {
    "trace_id": "a1b2c3",
    "log_id": "a1b2c3"
  }
}

401Unauthorized

{
  "code": "UNAUTHORIZED",
  "status": 401,
  "title": "Unauthorized",
  "message": "See title.",
  "meta": {
    "trace_id": "a1b2c3",
    "log_id": "a1b2c3"
  }
}

This resource's related objects (the ones you can include) and how to filter or sort on each:

RelationshipCardinalityFilter on a fieldSort by a field
invoiceto-one (invoice){ "invoice": { "grand_total": { "_eq": … } } }"field": "invoice.grand_total"
ledger_accountto-one (ledger_account){ "ledger_account": { "name": { "_eq": … } } }"field": "ledger_account.name"
applied_tax_rateto-one (tax_rate){ "applied_tax_rate": { "field_name": { "_eq": … } } }"field": "applied_tax_rate.field_name"
mediato-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" }
}