---
title: "List features"
method: GET
path: "/api/v1/features"
tags: ["Product Catalog"]
---

# List features

`GET /api/v1/features`

List features.

## Query parameters

- `meterSlug` string[]
- `includeArchived` boolean
- `page` integer
- `pageSize` integer
- `offset` integer
- `limit` integer
- `order` 'ASC' | 'DESC' — The order direction.
- `orderBy` 'id' | 'key' | 'name' | 'createdAt' | 'updatedAt' — Order by options for features.

## Response `200`

The request has succeeded.

- union — List features result
  - Feature[]
    - `createdAt` string, date-time, required — Timestamp of when the resource was created.
    - `updatedAt` string, date-time, required — Timestamp of when the resource was last updated.
    - `deletedAt` string, date-time — Timestamp of when the resource was permanently deleted.
    - `archivedAt` string, date-time — Timestamp of when the resource was archived.
    - `key` string, required — A key is a unique string that is used to identify a resource.
    - `name` string, required
    - `metadata` Metadata — Set of key-value pairs. Metadata can be used to store additional information about a resource.
    - `meterSlug` string — A key is a unique string that is used to identify a resource.
    - `meterGroupByFilters` object — Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. ⚠️ __Deprecated__: Use advancedMeterGroupByFilters instead
    - `advancedMeterGroupByFilters` object — Optional advanced meter group by filters. You can use this to filter for values of the meter groupBy fields.
    - `unitCost` union — Per-unit cost configuration for a feature. Either a fixed manual amount or a dynamic LLM cost lookup.
      - object — A fixed per-unit cost amount.
        - `type` 'manual', required
        - `amount` string, required — Numeric represents an arbitrary precision number.
      - object — LLM cost lookup configuration. Maps meter group-by dimensions to LLM cost database fields.
        - `type` 'llm', required
        - `providerProperty` string — Meter group-by property that holds the LLM provider. Use this when the meter has a group-by dimension for provider. Mutually exclusive with `provider`.
        - `provider` string — Static LLM provider value (e.g., "openai", "anthropic"). Use this when the feature tracks a single provider. Mutually exclusive with `providerProperty`.
        - `modelProperty` string — Meter group-by property that holds the model ID. Use this when the meter has a group-by dimension for model. Mutually exclusive with `model`.
        - `model` string — Static model ID value (e.g., "gpt-4", "claude-3-5-sonnet"). Use this when the feature tracks a single model. Mutually exclusive with `modelProperty`.
        - `tokenTypeProperty` string — Meter group-by property that holds the token type. Use this when the meter has a group-by dimension for token type. Mutually exclusive with `tokenType`.
        - `tokenType` string — Static token type value. Use this when the feature tracks a single token type (e.g., only input tokens). Expected values: input, output, cache_read, reasoning, cache_write, request, response. `request` is an alias for `input`, `response` is an alias for `output`. Mutually exclusive with `tokenTypeProperty`.
        - `pricing` FeatureLLMUnitCostPricing — Resolved per-token pricing from the LLM cost database.
          - `inputPerToken` string, required — Numeric represents an arbitrary precision number.
          - `outputPerToken` string, required — Numeric represents an arbitrary precision number.
          - `cacheReadPerToken` string — Numeric represents an arbitrary precision number.
          - `reasoningPerToken` string — Numeric represents an arbitrary precision number.
          - `cacheWritePerToken` string — Numeric represents an arbitrary precision number.
    - `id` string, required — Readonly unique ULID identifier.
  - FeaturePaginatedResponse — Paginated response
    - `totalCount` integer, required — The total number of items.
    - `page` integer, required — The page index.
    - `pageSize` integer, required — The maximum number of items per page.
    - `items` Feature[], required — The items in the current page.
      - `createdAt` string, date-time, required — Timestamp of when the resource was created.
      - `updatedAt` string, date-time, required — Timestamp of when the resource was last updated.
      - `deletedAt` string, date-time — Timestamp of when the resource was permanently deleted.
      - `archivedAt` string, date-time — Timestamp of when the resource was archived.
      - `key` string, required — A key is a unique string that is used to identify a resource.
      - `name` string, required
      - `metadata` Metadata — Set of key-value pairs. Metadata can be used to store additional information about a resource.
      - `meterSlug` string — A key is a unique string that is used to identify a resource.
      - `meterGroupByFilters` object — Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. ⚠️ __Deprecated__: Use advancedMeterGroupByFilters instead
      - `advancedMeterGroupByFilters` object — Optional advanced meter group by filters. You can use this to filter for values of the meter groupBy fields.
      - `unitCost` union — Per-unit cost configuration for a feature. Either a fixed manual amount or a dynamic LLM cost lookup.
        - object — A fixed per-unit cost amount.
          - `type` 'manual', required
          - `amount` string, required — Numeric represents an arbitrary precision number.
        - object — LLM cost lookup configuration. Maps meter group-by dimensions to LLM cost database fields.
          - `type` 'llm', required
          - `providerProperty` string — Meter group-by property that holds the LLM provider. Use this when the meter has a group-by dimension for provider. Mutually exclusive with `provider`.
          - `provider` string — Static LLM provider value (e.g., "openai", "anthropic"). Use this when the feature tracks a single provider. Mutually exclusive with `providerProperty`.
          - `modelProperty` string — Meter group-by property that holds the model ID. Use this when the meter has a group-by dimension for model. Mutually exclusive with `model`.
          - `model` string — Static model ID value (e.g., "gpt-4", "claude-3-5-sonnet"). Use this when the feature tracks a single model. Mutually exclusive with `modelProperty`.
          - `tokenTypeProperty` string — Meter group-by property that holds the token type. Use this when the meter has a group-by dimension for token type. Mutually exclusive with `tokenType`.
          - `tokenType` string — Static token type value. Use this when the feature tracks a single token type (e.g., only input tokens). Expected values: input, output, cache_read, reasoning, cache_write, request, response. `request` is an alias for `input`, `response` is an alias for `output`. Mutually exclusive with `tokenTypeProperty`.
          - `pricing` FeatureLLMUnitCostPricing — Resolved per-token pricing from the LLM cost database.
            - `inputPerToken` string, required — Numeric represents an arbitrary precision number.
            - `outputPerToken` string, required — Numeric represents an arbitrary precision number.
            - `cacheReadPerToken` string — Numeric represents an arbitrary precision number.
            - `reasoningPerToken` string — Numeric represents an arbitrary precision number.
            - `cacheWritePerToken` string — Numeric represents an arbitrary precision number.
      - `id` string, required — Readonly unique ULID identifier.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
- `401` — The request has not been applied because it lacks valid authentication credentials for the target resource.
- `403` — The server understood the request but refuses to authorize it.
- `412` — One or more conditions given in the request header fields evaluated to false when tested on the server.
- `500` — The server encountered an unexpected condition that prevented it from fulfilling the request.
- `503` — The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
- `default` — An unexpected error response.

---

[API](https://skmtc.net/openmeterio/apis/openmeter-api.md) · [All operations](https://skmtc.net/openmeterio/apis/openmeter-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openmeterio/openmeter-api/versions/927d82ffe647/schema)
