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

# Create a product

`POST /products`

## Request

- Base URL: `https://sandbox-api.paddle.com`
- URL: `https://sandbox-api.paddle.com/products`
- Auth: HTTP bearer

Creates a new product.

Paddle does not upload product images to a CDN. For `image_url`, you should host images on an HTTPS server that's publicly accessible. We recommend using square images (`1:1` ratio).

If successful, your response includes a copy of the new product entity.

## Request body

- ProductCreate: Represents a product entity when creating products.
  - `id` string: Unique Paddle ID for this product, prefixed with `pro_`.
  - `name` string, required: Name of this product.
  - `description` string, nullable: Short description for this product.
  - `type` 'custom' | 'standard': Type of item. Standard items are considered part of your catalog and are shown in the Paddle dashboard.
  - `tax_category` 'digital-goods' | 'ebooks' | 'implementation-services' | 'professional-services' | 'saas' | 'software-programming-services' | 'standard' | 'training-services' | 'website-hosting', required: Tax category for this product. Used for charging the correct rate of tax. Selected tax category must be enabled on your Paddle account.
  - `image_url` union: Image for this product. Included in the checkout and on some customer documents.
    - string, uri: A URL to an image.
    - string
  - `custom_data` CustomData: Your own structured key-value data.
  - `import_meta` object, nullable: Import information for this entity. `null` if this entity is not imported.
    - `external_id` string: Reference or identifier for this entity from the provider where it was imported from.
    - `imported_from` string, required: Name of the platform or provider where this entity was imported from.

## Response `201`

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

- object
  - `data` Product, required: Represents a product entity.
    - `id` string, required: Unique Paddle ID for this product, prefixed with `pro_`.
    - `name` string, required: Name of this product.
    - `description` string, nullable, required: Short description for this product.
    - `type` 'custom' | 'standard', required: Type of item. Standard items are considered part of your catalog and are shown in the Paddle dashboard.
    - `tax_category` 'digital-goods' | 'ebooks' | 'implementation-services' | 'professional-services' | 'saas' | 'software-programming-services' | 'standard' | 'training-services' | 'website-hosting', required: Tax category for this product. Used for charging the correct rate of tax. Selected tax category must be enabled on your Paddle account.
    - `image_url` union, required: Image for this product. Included in the checkout and on some customer documents.
      - string, uri: A URL to an image.
      - string
    - `custom_data` CustomData, required: Your own structured key-value data.
    - `status` 'active' | 'archived', required: Whether this entity can be used in Paddle.
    - `import_meta` object, nullable, required: Import information for this entity. `null` if this entity is not imported.
      - `external_id` string: Reference or identifier for this entity from the provider where it was imported from.
      - `imported_from` string, required: Name of the platform or provider where this entity was imported from.
    - `created_at` string, date-time, required: RFC 3339 datetime string of when this entity was created. Set automatically by Paddle.
    - `updated_at` string, date-time, required: RFC 3339 datetime string of when this entity was updated. Set automatically by Paddle.
  - `meta` Meta, required: Information about this response.
    - `request_id` string, required: Unique ID for the request relating to this response. Provide this when contacting Paddle support about a specific request.

## Other responses

- `default`: An unexpected error response.

## Changes

- **2026-02-02** (v1) `9ba8be0f2006`: 23 breaking, 1 warning, 38 info
  - request body became required
  - added `#/components/schemas/CatalogType` to the `type` request property `allOf` list
  - added `#/components/schemas/ProductId` to the `id` request property `allOf` list
  - the request property `description` became not nullable
  - …58 more
- **2025-03-07** (v1) `a3359d7731fd`: 7 breaking, 5 info
  - the request property `import_meta/oneOf[subschema #1: ImportMeta]/external_id` became not nullable
  - the `import_meta/oneOf[subschema #1: ImportMeta]/external_id` request property type changed from `string, null` to no type
  - the `data/import_meta/oneOf[subschema #1: ImportMeta]/external_id` response property's maxLength was unset from `200` for the response status `201`
  - the `data/import_meta/oneOf[subschema #1: ImportMeta]/external_id` response property's minLength was decreased from `1` to `0` for the response status `201`
  - …8 more
- **2024-05-14** (v1) `61fe84bfd516`: 1 info
  - added the optional property `data/updated_at` to the response with the `201` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/paddlehq/apis/paddle-api/changes/products/post.md)

---

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