---
title: "Create feature"
method: POST
path: "/features"
tags: ["features"]
---

# Create feature

`POST /features`

## Request body

- CreateFeatureRequestBody
  - `description` string, required
  - `event_subtype` string, nullable
  - `feature_type` 'boolean' | 'event' | 'license' | 'trait', required
  - `flag` CreateOrUpdateFlagRequestBody
    - `default_value` boolean, required
    - `description` string, required
    - `feature_id` string, nullable
    - `flag_type` 'boolean', required
    - `id` string, nullable
    - `key` string, required
    - `maintainer_account_member_id` string, nullable
    - `name` string, required
  - `icon` string, nullable
  - `lifecycle_phase` 'add_on' | 'alpha' | 'beta' | 'deprecated' | 'ga' | 'inactive' | 'in_plan' | 'internal_testing' | 'legacy'
  - `maintainer_account_member_id` string, nullable
  - `name` string, required
  - `plural_name` string, nullable
  - `singular_name` string, nullable
  - `trait_id` string, nullable

## Response `201`

Created

- object
  - `data` FeatureDetailResponseData, required
    - `billing_linked_resource` BillingLinkedResourceResponseData
      - `billing_provider` 'metronome' | 'orb' | 'schematic' | 'stripe', required
      - `external_resource_id` string, required
      - `originator` 'metronome' | 'orb' | 'schematic' | 'stripe', required
    - `billing_product` BillingProductResponseData
      - `account_id` string, required
      - `created_at` string, date-time, required
      - `currency` string, nullable — Deprecated; currencies are associated with prices, not products
      - `environment_id` string, required
      - `external_id` string, required
      - `is_active` boolean, required
      - `name` string, required
      - `price` number, double, required
      - `price_decimal` string, nullable
      - `product_id` string, required
      - `provider_type` 'metronome' | 'orb' | 'schematic' | 'stripe', required
      - `quantity` number, double, required
      - `updated_at` string, date-time, required
    - `created_at` string, date-time, required
    - `description` string, required
    - `event_subtype` string, nullable
    - `event_summary` EventSummaryResponseData
      - `company_count` integer, required
      - `environment_id` string, required
      - `event_count` integer, required
      - `event_subtype` string, required
      - `last_seen_at` string, date-time, nullable
      - `user_count` integer, required
    - `feature_type` 'boolean' | 'event' | 'license' | 'trait', required
    - `flags` FlagDetailResponseData[], required
      - `created_at` string, date-time, required
      - `default_value` boolean, required
      - `description` string, required
      - `feature` FeatureResponseData
        - `created_at` string, date-time, required
        - `description` string, required
        - `event_subtype` string, nullable
        - `feature_type` 'boolean' | 'event' | 'license' | 'trait', required
        - `icon` string, required
        - `id` string, required
        - `license_id` string, nullable — The license sold through this feature. Set only on features of type license, and created automatically with them.
        - `lifecycle_phase` 'add_on' | 'alpha' | 'beta' | 'deprecated' | 'ga' | 'inactive' | 'in_plan' | 'internal_testing' | 'legacy'
        - `maintainer_account_member_id` string, nullable
        - `name` string, required
        - `plural_name` string, nullable
        - `singular_name` string, nullable
        - `trait_id` string, nullable
        - `updated_at` string, date-time, required
        - `usage_limit_trait_id` string, nullable — Set when the feature carries a pay-in-advance quantity. Provisioned lazily for other feature types, and at creation for license features.
      - `feature_id` string, nullable
      - `flag_type` 'boolean', required
      - `id` string, required
      - `key` string, required
      - `last_checked_at` string, date-time, nullable
      - `maintainer` AccountMemberResponseData
        - `created_at` string, date-time, required
        - `email` string, nullable
        - `first_name` string, nullable
        - `id` string, required
        - `image_url` string, nullable
        - `last_name` string, nullable
        - `name` string, nullable
        - `permissions` object, required
        - `role` 'admin' | 'member'
        - `updated_at` string, date-time, required
      - `maintainer_account_member_id` string, nullable
      - `name` string, required
      - `rules` RuleDetailResponseData[], required
        - `condition_groups` RuleConditionGroupDetailResponseData[], required
          - `conditions` RuleConditionDetailResponseData[], required
            - `comparison_trait` EntityTraitDefinitionResponseData
              - …
            - `comparison_trait_id` string, nullable
            - `condition_group_id` string, nullable
            - `condition_type` 'base_plan' | 'billing_product' | 'company' | 'credit' | 'metric' | 'plan' | 'plan_version' | 'trait' | 'user', required
            - `created_at` string, date-time, required
            - `environment_id` string, required
            - `event_subtype` string, nullable
            - `flag_id` string, nullable
            - `id` string, required
            - `metric_period` 'all_time' | 'current_day' | 'current_month' | 'current_week'
            - `metric_period_month_reset` 'billing_cycle' | 'first_of_month'
            - `metric_value` integer, nullable
            - `operator` 'eq' | 'gt' | 'gte' | 'is_empty' | 'lt' | 'lte' | 'not_empty' | 'ne', required
            - `resource_ids` string[], required
            - `resources` PreviewObjectResponseData[], required
              - …
            - `rule_id` string, required
            - `trait` EntityTraitDefinitionResponseData
              - …
            - `trait_entity_type` 'company' | 'user'
            - `trait_id` string, nullable
            - `trait_value` string, required
            - `updated_at` string, date-time, required
          - `created_at` string, date-time, required
          - `environment_id` string, required
          - `flag_id` string, nullable
          - `id` string, required
          - `rule_id` string, required
          - `updated_at` string, date-time, required
        - `conditions` RuleConditionDetailResponseData[], required
          - `comparison_trait` EntityTraitDefinitionResponseData
            - `created_at` string, date-time, required
            - `display_name` string, required
            - `entity_type` 'company' | 'user', required
            - `hierarchy` string[], required
            - `id` string, required
            - `trait_type` 'boolean' | 'currency' | 'date' | 'number' | 'string' | 'url', required
            - `updated_at` string, date-time, required
          - `comparison_trait_id` string, nullable
          - `condition_group_id` string, nullable
          - `condition_type` 'base_plan' | 'billing_product' | 'company' | 'credit' | 'metric' | 'plan' | 'plan_version' | 'trait' | 'user', required
          - `created_at` string, date-time, required
          - `environment_id` string, required
          - `event_subtype` string, nullable
          - `flag_id` string, nullable
          - `id` string, required
          - `metric_period` 'all_time' | 'current_day' | 'current_month' | 'current_week'
          - `metric_period_month_reset` 'billing_cycle' | 'first_of_month'
          - `metric_value` integer, nullable
          - `operator` 'eq' | 'gt' | 'gte' | 'is_empty' | 'lt' | 'lte' | 'not_empty' | 'ne', required
          - `resource_ids` string[], required
          - `resources` PreviewObjectResponseData[], required
            - `description` string, nullable
            - `id` string, required
            - `image_url` string, nullable
            - `name` string, required
          - `rule_id` string, required
          - `trait` EntityTraitDefinitionResponseData
            - `created_at` string, date-time, required
            - `display_name` string, required
            - `entity_type` 'company' | 'user', required
            - `hierarchy` string[], required
            - `id` string, required
            - `trait_type` 'boolean' | 'currency' | 'date' | 'number' | 'string' | 'url', required
            - `updated_at` string, date-time, required
          - `trait_entity_type` 'company' | 'user'
          - `trait_id` string, nullable
          - `trait_value` string, required
          - `updated_at` string, date-time, required
        - `created_at` string, date-time, required
        - `environment_id` string, required
        - `flag_id` string, nullable
        - `id` string, required
        - `name` string, required
        - `priority` integer, required
        - `rule_type` 'company_override' | 'company_override_usage_exceeded' | 'default' | 'global_override' | 'plan_entitlement' | 'plan_entitlement_usage_exceeded' | 'standard', required
        - `updated_at` string, date-time, required
        - `value` boolean, required
      - `updated_at` string, date-time, required
    - `icon` string, required
    - `id` string, required
    - `license_id` string, nullable — The license sold through this feature. Set only on features of type license, and created automatically with them.
    - `lifecycle_phase` 'add_on' | 'alpha' | 'beta' | 'deprecated' | 'ga' | 'inactive' | 'in_plan' | 'internal_testing' | 'legacy'
    - `maintainer` AccountMemberResponseData
      - `created_at` string, date-time, required
      - `email` string, nullable
      - `first_name` string, nullable
      - `id` string, required
      - `image_url` string, nullable
      - `last_name` string, nullable
      - `name` string, nullable
      - `permissions` object, required
      - `role` 'admin' | 'member'
      - `updated_at` string, date-time, required
    - `maintainer_account_member_id` string, nullable
    - `name` string, required
    - `plans` PreviewObject[], required
      - `description` string, nullable
      - `id` string, required
      - `image_url` string, nullable
      - `name` string, required
    - `plural_name` string, nullable
    - `singular_name` string, nullable
    - `trait` EntityTraitDefinitionResponseData
      - `created_at` string, date-time, required
      - `display_name` string, required
      - `entity_type` 'company' | 'user', required
      - `hierarchy` string[], required
      - `id` string, required
      - `trait_type` 'boolean' | 'currency' | 'date' | 'number' | 'string' | 'url', required
      - `updated_at` string, date-time, required
    - `trait_id` string, nullable
    - `updated_at` string, date-time, required
    - `usage_limit_trait_id` string, nullable — Set when the feature carries a pay-in-advance quantity. Provisioned lazily for other feature types, and at creation for license features.
  - `params` object, required — Input parameters

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `500` — Server error

## Changes

> 125 revisions in range; 37 could not be searched.

- **2026-07-27** `e83d3358bab3` — 2 warning, 6 info
  - added the new `license` enum value to the `data/feature_type` response property for the response status `201`
  - added the new `license` enum value to the `data/flags/items/feature/feature_type` response property for the response status `201`
  - added the new `license` enum value to the request property `feature_type`
  - added the optional property `data/billing_product` to the response with the `201` status
  - …4 more
- **2026-07-10** `6bbade913b33` — 2 warning
  - added the new `custom_plans_edit` enum value to the `data/flags/items/maintainer/permissions/additionalProperties/items/` response property for the response status `201`
  - added the new `custom_plans_edit` enum value to the `data/maintainer/permissions/additionalProperties/items/` response property for the response status `201`
- **2026-06-17** `269daccabb5b` — 2 info
  - removed the `billing_credits_edit` enum value from the `data/flags/items/maintainer/permissions/additionalProperties/items/` response property for the response status `201`
  - removed the `billing_credits_edit` enum value from the `data/maintainer/permissions/additionalProperties/items/` response property for the response status `201`
- …earlier changes not shown

[Full history](https://skmtc.dev/schematichq/apis/schematic-api/changes/features/post.md)

---

[API](https://skmtc.dev/schematichq/apis/schematic-api.md) · [All operations](https://skmtc.dev/schematichq/apis/schematic-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/schematichq/schematic-api/revisions/0b238e148fa1/schema)
