---
title: "Create feature"
method: POST
path: "/api/v1/features"
tags: ["Product Catalog"]
---

# Create feature

`POST /api/v1/features`

Features are either metered or static. A feature is metered if meterSlug is provided at creation.
For metered features you can pass additional filters that will be applied when calculating feature usage, based on the meter's groupBy fields.
Meters with SUM, COUNT, UNIQUE_COUNT and LATEST aggregations are supported for features.

## Request body

- FeatureCreateInputs — Represents a feature that can be enabled or disabled for a plan. Used both for product catalog and entitlements.
  - `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.

## Response `201`

The request has succeeded and a new resource has been created as a result.

- Feature — Represents a feature that can be enabled or disabled for a plan. Used both for product catalog and entitlements.
  - `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)
