> ## Documentation Index
> Fetch the complete documentation index at: https://developers.nova.money/llms.txt
> Use this file to discover all available pages before exploring further.

# Products API — List, Create, and Retrieve Products

> REST API for Nova.Pay products. List all products, create new products, retrieve product details, and fetch the Pagar.me public key.

The Products API lets you list your product catalogue, import or create new products, fetch the details of a specific product, and retrieve the Pagar.me public key needed for client-side card tokenization. All endpoints are relative to the base URL `https://pay.nova.money/api/v1`.

***

## List products

<Note>
  This endpoint requires an API key passed in the request headers.
</Note>

Retrieve all products in your account. You can search by name and optionally include soft-deleted products.

```text theme={null}
GET /products
```

### Query parameters

<ParamField query="q" type="string">
  Free-text search string. Filters products by name.
</ParamField>

<ParamField query="deleted" type="boolean">
  When `true`, includes soft-deleted products in the response. Defaults to `false`.
</ParamField>

### Response — array of `ProductSummary`

<ResponseField name="id" type="integer">
  Unique numeric ID of the product.
</ResponseField>

<ResponseField name="name" type="string">
  Product display name.
</ResponseField>

<ResponseField name="type" type="string">
  Product type (e.g., `digital`, `physical`, `service`).
</ResponseField>

<ResponseField name="company_id" type="integer">
  ID of the company that owns this product.
</ResponseField>

<ResponseField name="value" type="number">
  Base price of the product.
</ResponseField>

<ResponseField name="deleted" type="boolean">
  Whether the product has been soft-deleted.
</ResponseField>

<ResponseField name="subscription" type="boolean">
  Whether the product is sold as a recurring subscription.
</ResponseField>

### Example response

<CodeGroup>
  ```json Response theme={null}
  [
    {
      "id": 101,
      "name": "Annual Membership",
      "type": "digital",
      "company_id": 5,
      "value": 299.90,
      "deleted": false,
      "subscription": true
    },
    {
      "id": 102,
      "name": "Physical Kit",
      "type": "physical",
      "company_id": 5,
      "value": 89.90,
      "deleted": false,
      "subscription": false
    }
  ]
  ```
</CodeGroup>

***

## Create a product

<Note>
  This endpoint requires an API key passed in the request headers.
</Note>

Import or create a new product in your Nova.Pay account. Use this to programmatically sync your product catalogue.

```text theme={null}
POST /products
```

### Request body

<ParamField body="name" type="string" required>
  Product display name.
</ParamField>

<ParamField body="value" type="number" required>
  Base price of the product in the account currency.
</ParamField>

<ParamField body="short_description" type="string">
  Brief description shown on checkout pages.
</ParamField>

<ParamField body="tax_description" type="string">
  Tax-related description for invoice generation.
</ParamField>

<ParamField body="unit_name" type="string">
  Label for the unit of sale (e.g., `license`, `seat`, `box`).
</ParamField>

<ParamField body="weight" type="number">
  Product weight in grams. Required for physical products that use shipping calculation.
</ParamField>

<ParamField body="ncm" type="string">
  Nomenclatura Comum do Mercosul (NCM) code for fiscal classification of physical goods.
</ParamField>

<ParamField body="company_id" type="integer">
  ID of the company to assign this product to. Defaults to the authenticated account's primary company.
</ParamField>

<ParamField body="financial_account_id" type="integer">
  ID of the financial account to associate with this product for revenue tracking.
</ParamField>

<ParamField body="tax_configuration_id" type="integer">
  ID of the tax configuration to apply to this product for invoice generation.
</ParamField>

<ParamField body="external_id" type="string">
  Your internal identifier for this product. Useful for syncing with external systems.
</ParamField>

### Response — `ProductCreateResponse`

<ResponseField name="id" type="integer">
  Unique numeric ID of the newly created product.
</ResponseField>

<ResponseField name="name" type="string">
  Product display name.
</ResponseField>

<ResponseField name="description" type="string">
  Full product description.
</ResponseField>

<ResponseField name="value" type="number">
  Base price of the product.
</ResponseField>

<ResponseField name="tax_description" type="string">
  Tax-related description stored on the product.
</ResponseField>

<ResponseField name="ncm" type="string">
  NCM fiscal classification code.
</ResponseField>

<ResponseField name="unit" type="object">
  Unit configuration for this product (includes `name` and related settings).
</ResponseField>

<ResponseField name="company" type="object">
  The company that owns this product (includes `id` and `name`).
</ResponseField>

<ResponseField name="tax_configuration" type="object">
  Tax configuration applied to this product, if set.
</ResponseField>

<ResponseField name="financial_account" type="object">
  Financial account associated with this product, if set.
</ResponseField>

***

## Retrieve a product

Fetch the public details of a single product by its ID. This endpoint is public and does not require an API key, making it suitable for use directly from your frontend.

```text theme={null}
GET /products/{id}
```

### Path parameters

<ParamField path="id" type="integer" required>
  The numeric ID of the product to retrieve.
</ParamField>

### Response — `ProductShow`

<ResponseField name="id" type="integer">
  Unique numeric ID of the product.
</ResponseField>

<ResponseField name="name" type="string">
  Product display name.
</ResponseField>

<ResponseField name="description" type="string">
  Full product description.
</ResponseField>

<ResponseField name="subscription" type="boolean">
  Whether the product is sold as a recurring subscription.
</ResponseField>

<ResponseField name="value" type="number">
  Base price of the product.
</ResponseField>

<ResponseField name="weight" type="number">
  Product weight in grams. Only present when a weight has been set.
</ResponseField>

<ResponseField name="image" type="string">
  URL of the product image. Only present when an image has been attached.
</ResponseField>

***

## Get Pagar.me public key

Retrieve the Pagar.me public key associated with this product. Use this key to initialize the Pagar.me.js client on your checkout page for secure client-side card tokenization — the raw card data never touches your server.

```text theme={null}
GET /products/{id}/pagarme_public_key
```

### Path parameters

<ParamField path="id" type="integer" required>
  The numeric ID of the product whose Pagar.me configuration you want to retrieve.
</ParamField>

### Response

<ResponseField name="public_key" type="string">
  The Pagar.me publishable key (prefixed `pk_`) for client-side tokenization.
</ResponseField>

### Example response

<CodeGroup>
  ```json Response theme={null}
  {
    "public_key": "pk_live_abcdef1234567890"
  }
  ```
</CodeGroup>

<Tip>
  Pass this `public_key` to `PagarMe.client(publicKey)` in your browser code to tokenize card details before submitting the payment form. Never send raw card numbers to your own server.
</Tip>


## Related topics

- [Orders API — List, Retrieve, Create, and Manage Orders](/api-reference/orders.md)
- [Checkout Pages API — List and Retrieve Checkout Pages](/api-reference/checkout-pages.md)
- [Carts API — Create, Retrieve, and Pay Nova.Pay Carts](/api-reference/carts.md)
- [Nova.Pay Checkout Flow: Pages, Carts, and Charge Links](/concepts/checkout-flow.md)
- [Charges API — Pay Invoice and Charge Link Endpoints](/api-reference/charges.md)
