> ## Documentation Index
> Fetch the complete documentation index at: https://docs.moneydev.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Criar um produto

> Cria um produto e sua oferta padrão em uma única chamada.

<Info>
  `POST /v1/products`  ·  Requer o escopo `products:write`
</Info>

Um **produto** é algo que você vende. Todo produto tem uma ou mais **ofertas** — formas de comprá-lo, cada uma com um preço. Este endpoint cria o produto e a primeira oferta juntos; essa oferta vira a padrão.

## Parâmetros do corpo

<ParamField body="name" type="string" required>
  Nome do produto, de 1 a 160 caracteres.
</ParamField>

<ParamField body="description" type="string">
  Até 2000 caracteres. Padrão: string vazia.
</ParamField>

<ParamField body="metadata" type="object">
  Pares chave–valor livres para seu uso.
</ParamField>

<ParamField body="default_offer" type="object" required>
  A primeira oferta do produto. Mesmo formato de [Criar uma oferta](/api-reference/offers/create), sem `is_default`.

  <Expandable title="propriedades de default_offer" defaultOpen>
    <ParamField body="default_offer.amount_minor" type="integer" required>
      Preço em unidades menores (centavos). De `1` a `99999999999`.
    </ParamField>

    <ParamField body="default_offer.currency" type="string" required>
      ISO 4217 em maiúsculas, ex. `BRL`.
    </ParamField>

    <ParamField body="default_offer.name" type="string">
      Rótulo da oferta, de 1 a 160 caracteres. Padrão: `"Padrão"`.
    </ParamField>

    <ParamField body="default_offer.compare_at_amount_minor" type="integer">
      Um preço de referência riscado. Deve ser `≥ amount_minor`.
    </ParamField>

    <ParamField body="default_offer.type" type="string" default="one_time">
      `one_time` ou `recurring`.
    </ParamField>

    <ParamField body="default_offer.billing_interval" type="string">
      `day`, `week`, `month` ou `year`. Obrigatório quando `type` é `recurring`; não permitido quando `one_time`.
    </ParamField>

    <ParamField body="default_offer.interval_count" type="integer">
      Intervalos entre cobranças, de `1` a `999`. Só para recorrente; padrão `1`.
    </ParamField>
  </Expandable>
</ParamField>

## Requisição

```bash cURL theme={null}
curl --request POST https://api.moneydev.com.br/v1/products \
  --header "Authorization: Bearer $ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "name": "Plano Pro",
    "description": "Acesso completo por 12 meses",
    "default_offer": {
      "name": "Anual",
      "amount_minor": 49900,
      "currency": "BRL"
    }
  }'
```

## Resposta

`201 Created` com o [objeto de produto](#objeto-de-produto). `default_offer` é o [objeto de oferta](/api-reference/offers/create#objeto-de-oferta) recém-criado.

```json theme={null}
{
  "id": "prod_4d5e6f7a-8b9c-4d0e-1f2a-3b4c5d6e7f8a",
  "object": "product",
  "name": "Plano Pro",
  "description": "Acesso completo por 12 meses",
  "status": "active",
  "metadata": {},
  "default_offer": {
    "id": "offer_a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "object": "offer",
    "product_id": "prod_4d5e6f7a-8b9c-4d0e-1f2a-3b4c5d6e7f8a",
    "name": "Anual",
    "lookup_key": "offer_a1b2c3d4e5f64a7b8c9d0e1f2a3b4c5d",
    "amount_minor": 49900,
    "compare_at_amount_minor": null,
    "currency": "BRL",
    "type": "one_time",
    "billing_interval": null,
    "interval_count": null,
    "is_default": true,
    "active": true,
    "created_at": "2026-08-28T13:05:00.000Z",
    "updated_at": "2026-08-28T13:05:00.000Z"
  },
  "created_at": "2026-08-28T13:05:00.000Z",
  "updated_at": "2026-08-28T13:05:00.000Z"
}
```

## Erros

| Status | `code` | Causa |
| - | - | - |
| `400` | `invalid_request` | Validação falhou; `param` indica o campo |
| `400` | `invalid_product_name` | `name` ficou vazio após remover espaços |
| `400` | `invalid_compare_at_amount` | `default_offer.compare_at_amount_minor` é menor que `amount_minor` |
| `400` | `billing_interval_required` | `default_offer.type` é `recurring` sem `billing_interval` |
| `400` | `invalid_one_time_billing` | Uma oferta `one_time` informou `billing_interval` ou `interval_count` |

## Objeto de produto

<ResponseField name="id" type="string">ID do produto, com prefixo `prod_`.</ResponseField>
<ResponseField name="object" type="string">Sempre `"product"`.</ResponseField>
<ResponseField name="name" type="string">Nome do produto.</ResponseField>
<ResponseField name="description" type="string">Descrição, ou `""`.</ResponseField>
<ResponseField name="status" type="string">`active` ou `archived`.</ResponseField>
<ResponseField name="metadata" type="object">Seus metadados.</ResponseField>

<ResponseField name="default_offer" type="object | null">
  A [oferta](/api-reference/offers/create#objeto-de-oferta) padrão atual, ou `null` se nenhuma estiver ativa.
</ResponseField>

<ResponseField name="created_at" type="string">Data/hora de criação em ISO 8601.</ResponseField>
<ResponseField name="updated_at" type="string">Data/hora da última alteração em ISO 8601.</ResponseField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.