---
title: "Create a product (syncs to Stripe when active)"
method: POST
path: "/products"
tags: ["Products"]
---

# Create a product (syncs to Stripe when active)

`POST /products`

## Request

- Base URL: `https://api.madethis.com/v1`
- URL: `https://api.madethis.com/v1/products`
- Auth: HTTP bearer

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `name` string, required
  - `description` string
  - `priceAmountCents` integer, required
  - `currency` string
  - `pricingModel` 'one_time' | 'recurring'
  - `recurringInterval` 'day' | 'week' | 'month' | 'year'
  - `recurringIntervalCount` integer
  - `productType` string
  - `externalReference` string
  - `inventoryQuantity` integer
  - `deliveryType` 'file' | 'link' | 'license_key'
  - `fileUrl` string, uri
  - `imageUrl` string, uri
  - `requiresShipping` boolean
  - `selfFulfilled` boolean: Physical goods only: true when the owner packs and ships this product themselves. When a supplier (Printful/Printify) is connected, an active physical product must be linked to a supplier product or carry selfFulfilled: true.
  - `status` 'draft' | 'active'

## Response `201`

Success envelope.

- object
  - `data` object, required
    - `id` string, required
    - `name` string, required
    - `description` string, nullable, required
    - `status` 'draft' | 'active' | 'archived', required
    - `pricingModel` 'one_time' | 'recurring', required
    - `priceAmountCents` integer, required
    - `currency` string, required
    - `recurringInterval` 'day' | 'week' | 'month' | 'year', nullable, required
    - `recurringIntervalCount` integer, nullable, required
    - `productType` string, nullable, required
    - `externalReference` string, nullable, required
    - `inventoryQuantity` integer, nullable, required
    - `deliveryType` 'file' | 'link' | 'license_key', nullable, required
    - `fileUrl` string, nullable, required
    - `imageUrl` string, nullable, required
    - `requiresShipping` boolean, required
    - `selfFulfilled` boolean, required
    - `stripeSyncStatus` string, nullable, required
    - `createdAt` number, required
    - `updatedAt` number
  - `hint` string: One-sentence orientation for agents.
  - `next_action` string: The literal next call an agent would chain.

## Other responses

- `default`: Error envelope — machine-readable `code` plus a docs link.

---

[API](https://skmtc.dev/madethis/apis/madethis-api.md) - [All operations](https://skmtc.dev/madethis/apis/madethis-api/llms.txt) - [OpenAPI document](https://skmtc.dev/madethis/apis/madethis-api/revisions/b0696ebcb55b?raw)
