---
title: "Create a product"
method: POST
path: "/api/v1/products"
tags: ["Products"]
---

# Create a product

`POST /api/v1/products`

## Request body

- CreateProductRequest
  - `catalog` boolean
  - `description` string, nullable
  - `fee_structure` union, required
    - object
      - `fee_type` 'RATE', required
    - object
      - `downgrade_policy` 'REMOVE_AT_END_OF_PERIOD', required
      - `fee_type` 'SLOT', required
      - `slot_unit_name` string, required
      - `upgrade_policy` 'PRORATED', required
    - object
      - `fee_type` 'CAPACITY', required
      - `metric_id` string, MeteroidId, required
    - object
      - `fee_type` 'USAGE', required
      - `metric_id` string, MeteroidId, required
      - `model` 'PER_UNIT' | 'TIERED' | 'VOLUME' | 'PACKAGE' | 'MATRIX', required
    - object
      - `billing_type` 'ADVANCE' | 'ARREARS', required
      - `fee_type` 'EXTRA_RECURRING', required
    - object
      - `fee_type` 'ONE_TIME', required
  - `name` string, required
  - `product_family_id` string, MeteroidId, required

## Response `201`

Product created

- Product
  - `archived_at` string, date-time, nullable
  - `catalog` boolean, required
  - `created_at` string, date-time, required
  - `description` string, nullable
  - `fee_structure` union, required
    - object
      - `fee_type` 'RATE', required
    - object
      - `downgrade_policy` 'REMOVE_AT_END_OF_PERIOD', required
      - `fee_type` 'SLOT', required
      - `slot_unit_name` string, required
      - `upgrade_policy` 'PRORATED', required
    - object
      - `fee_type` 'CAPACITY', required
      - `metric_id` string, MeteroidId, required
    - object
      - `fee_type` 'USAGE', required
      - `metric_id` string, MeteroidId, required
      - `model` 'PER_UNIT' | 'TIERED' | 'VOLUME' | 'PACKAGE' | 'MATRIX', required
    - object
      - `billing_type` 'ADVANCE' | 'ARREARS', required
      - `fee_type` 'EXTRA_RECURRING', required
    - object
      - `fee_type` 'ONE_TIME', required
  - `fee_type` 'RATE' | 'SLOT' | 'CAPACITY' | 'USAGE' | 'EXTRA_RECURRING' | 'ONE_TIME', required
  - `id` string, MeteroidId, required
  - `name` string, required
  - `product_family_id` string, MeteroidId, required

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `429` — Too many requests

## Changes

- **2026-03-27** (v1) `de35c02bb0d2` — 2 warning, 1 info
  - added the new `TOO_MANY_REQUESTS` enum value to the `code` response property for the response status `400`
  - added the new `TOO_MANY_REQUESTS` enum value to the `code` response property for the response status `401`
  - added the non-success response with the status `429`
- **2026-03-20** (v1) `51c7018cc5ef` — 1 info
  - endpoint added
- **2025-07-09** (v1) `dece17f86f99` — 1 breaking
  - api path removed without deprecation

[Change history](https://skmtc.dev/meteroid-oss/apis/meteroid/changes/api/v1/products/post.md)

---

[API](https://skmtc.dev/meteroid-oss/apis/meteroid.md) · [All operations](https://skmtc.dev/meteroid-oss/apis/meteroid/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/meteroid-oss/meteroid/revisions/de35c02bb0d2/schema)
