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

# Criar produto

> A oferta pertence a um produto. Sem product_hash não há oferta, e sem oferta não há checkout.

**Rota:** `POST /api/v1/products` · **Headers:** `X-Api-Client-Token`, `Authorization: Bearer <user_token>`

O produto é criado em nome do produtor, por isso a rota exige o `public_token` recebido em [Criar usuário](/guia/criar-usuario). Preço, métodos de pagamento e parcelamento **não** ficam no produto: são configurados na [oferta](/guia/criar-oferta).

<Steps>
  <Step title="Descubra o category_id">
    Consulte `GET /api/v1/products/categories` com os mesmos headers. A resposta traz `data`, uma lista de objetos com `value` (ID da categoria) e `label` (nome). Use o `value` no passo seguinte.

    ```bash cURL theme={null}
    curl https://nexus-sandbox.ticto.dev/api/v1/products/categories \
      -H "Accept: application/json" \
      -H "X-Api-Client-Token: <seu_client_auth_token>" \
      -H "Authorization: Bearer <seu_user_public_token>"
    ```
  </Step>

  <Step title="Crie o produto">
    Envie `POST /api/v1/products` como `application/json` para produtos `course` ou `ebook`. Produtos `physical` exigem `multipart/form-data` por causa do arquivo `image_stock`.
  </Step>

  <Step title="Guarde o hash">
    O response `201 Created` devolve o produto com o campo `hash`. Ele é o `product_hash` usado na rota de oferta.
  </Step>
</Steps>

## Parâmetros obrigatórios (body)

<ParamField body="name" type="string" required>
  Nome do produto (3 a 191 caracteres).
</ParamField>

<ParamField body="category_id" type="integer" required>
  ID da categoria, obtido em `GET /products/categories`.
</ParamField>

<ParamField body="description" type="string" required>
  Descrição do produto (3 a 1000 caracteres).
</ParamField>

<ParamField body="type" type="string" required>
  `course`, `ebook` ou `physical`.
</ParamField>

<ParamField body="support_email" type="string" required>
  E-mail de suporte válido (máximo 191 caracteres).
</ParamField>

<ParamField body="support_phone" type="string" required>
  Telefone de suporte (máximo 20 caracteres). Ex.: `11999999999`.
</ParamField>

<ParamField body="refund_deadline" type="integer" required>
  Prazo de reembolso em dias: `7`, `15` ou `30`.
</ParamField>

<ParamField body="soft_descriptor" type="string" required>
  Descritor que aparece na fatura do cartão do comprador. Apenas alfanumérico, até 13 caracteres. Ex.: `MEUPRODUTO`.
</ParamField>

## Parâmetros opcionais relevantes

<ParamField body="allow_affiliation" type="boolean" default="true">
  Se permite afiliação. **Atenção:** o padrão é `true`, e nesse caso `affiliate_percentage` (1 a 80), `affiliation_description` e `affiliation_terms` (50 a 1000 caracteres cada) passam a ser obrigatórios. Para a primeira venda, envie `false`.
</ParamField>

<ParamField body="has_auto_affiliation" type="boolean" default="false">
  Se permite afiliação automática.
</ParamField>

<ParamField body="cover_picture" type="string">
  URL da imagem de capa.
</ParamField>

<ParamField body="image_stock" type="file">
  Documento de garantia. Obrigatório apenas para `physical` (PNG, JPG ou JPEG, até 10 MB, via `multipart/form-data`).
</ParamField>

## Exemplo mínimo (produto digital)

```bash cURL theme={null}
curl -X POST https://nexus-sandbox.ticto.dev/api/v1/products \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "X-Api-Client-Token: <seu_client_auth_token>" \
  -H "Authorization: Bearer <seu_user_public_token>" \
  -d '{
    "name": "Curso de Integração Nexus",
    "category_id": <category_id>,
    "description": "Curso de exemplo para validar a integração no sandbox.",
    "type": "course",
    "support_email": "suporte@exemplo.com.br",
    "support_phone": "11999999999",
    "refund_deadline": 7,
    "soft_descriptor": "CURSONEXUS",
    "allow_affiliation": false
  }'
```

## Response de sucesso (201 Created)

<ResponseField name="hash" type="string" required>
  Hash único do produto. É o `product_hash` da rota `POST /products/{product_hash}/offers`.
</ResponseField>

<ResponseField name="status" type="string" required>
  `approved`, `pending` ou `reproved`.
</ResponseField>

<ResponseField name="name / category_id / description / type / support_email / support_phone / refund_deadline" type="mixed" required>
  Ecoam os valores enviados.
</ResponseField>

<Check>
  Com o `hash` em mãos, siga para [Criar oferta do produto](/guia/criar-oferta).
</Check>


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