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

# Criar Produto

> Aprenda a criar produtos para vendas avulsas ou assinaturas via API

## Visão Geral

O endpoint de criação de produtos permite que você crie produtos para vendas avulsas (one-time purchases) ou assinaturas (recurring billing). Cada produto criado recebe um `uuid` único que é usado para gerar o link de pagamento.

## Requisição

### Campo Obrigatório

<ParamField body="name" type="string" required>
  Nome do produto. Será exibido na página de pagamento.
</ParamField>

### Campos Opcionais

Todos os campos abaixo possuem valores padrão e não precisam ser enviados:

<ParamField body="description" type="string" default="">
  Descrição do produto. Ajuda o cliente a entender o que está comprando.
</ParamField>

<ParamField body="value" type="number" default="0">
  Preço do produto em Reais (BRL). Use `0` para produtos de assinatura.
</ParamField>

<ParamField body="pix" type="boolean" default="true">
  Habilita pagamento via PIX.
</ParamField>

<ParamField body="creditCard" type="boolean" default="true">
  Habilita pagamento via cartão de crédito.
</ParamField>

<ParamField body="boleto" type="boolean" default="true">
  Habilita pagamento via boleto bancário.
</ParamField>

<ParamField body="pixAutomatic" type="boolean" default="false">
  Habilita o [Pix Automático](/guias/pix-automatico) (débito recorrente do Pix) no checkout do produto. Vem desligado por padrão.
</ParamField>

<ParamField body="installments" type="number" default="1">
  Número máximo de parcelas permitidas (1-12).
</ParamField>

<ParamField body="image" type="string">
  URL da imagem do produto.
</ParamField>

<ParamField body="tags" type="string[]">
  Tags para categorizar o produto.
</ParamField>

<ParamField body="returnUrl" type="string">
  URL para redirecionar o cliente após o pagamento.
</ParamField>

<ParamField body="returnUrlButtonText" type="string">
  Texto do botão de redirecionamento (máximo 100 caracteres).
</ParamField>

<ParamField body="pixelFB" type="string">
  ID do Facebook Pixel para rastreamento.
</ParamField>

<ParamField body="isSubscription" type="boolean" default="false">
  Define se o produto é de assinatura (cobrança recorrente). Para produtos de assinatura, o preço é definido nos [preços de assinatura](/api-reference/assinaturas/precos/criar), não no campo `value`.
</ParamField>

<Note>
  Com a API simplificada, você pode criar um produto enviando apenas o campo `name`. Todos os métodos de pagamento serão habilitados por padrão.
</Note>

## Exemplo de Requisição

### Exemplo Mínimo

Crie um produto enviando apenas o nome. Todos os métodos de pagamento serão habilitados automaticamente:

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/products \
    -H "Authorization: Bearer sk_test_sua_chave_api" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Meu Produto"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://garu.com.br/api/products', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.GARU_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Meu Produto'
    })
  });

  const product = await response.json();
  console.log(`Link de pagamento: https://garu.com.br/pay/${product.uuid}`);
  ```

  ```python Python theme={null}
  import requests
  import os

  response = requests.post(
      "https://garu.com.br/api/products",
      headers={"Authorization": f"Bearer {os.environ['GARU_API_KEY']}"},
      json={"name": "Meu Produto"}
  )

  product = response.json()
  print(f"Link de pagamento: https://garu.com.br/pay/{product['uuid']}")
  ```
</CodeGroup>

### Exemplo Completo

Personalize todas as opções do produto:

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/products \
    -H "Authorization: Bearer sk_test_sua_chave_api" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Curso de Marketing Digital",
      "description": "Aprenda marketing digital do zero ao avançado",
      "value": 297.00,
      "pix": true,
      "creditCard": true,
      "boleto": true,
      "installments": 12
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://garu.com.br/api/products', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.GARU_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Curso de Marketing Digital',
      description: 'Aprenda marketing digital do zero ao avançado',
      value: 297.00,
      pix: true,
      creditCard: true,
      boleto: true,
      installments: 12
    })
  });

  const product = await response.json();
  console.log(`Link de pagamento: https://garu.com.br/pay/${product.uuid}`);
  ```

  ```python Python theme={null}
  import requests
  import os

  url = "https://garu.com.br/api/products"
  headers = {
      "Authorization": f"Bearer {os.environ['GARU_API_KEY']}",
      "Content-Type": "application/json"
  }
  payload = {
      "name": "Curso de Marketing Digital",
      "description": "Aprenda marketing digital do zero ao avançado",
      "value": 297.00,
      "pix": True,
      "creditCard": True,
      "boleto": True,
      "installments": 12
  }

  response = requests.post(url, json=payload, headers=headers)
  product = response.json()
  print(f"Link de pagamento: https://garu.com.br/pay/{product['uuid']}")
  ```

  ```php PHP theme={null}
  <?php
  $url = 'https://garu.com.br/api/products';
  $apiKey = getenv('GARU_API_KEY');

  $payload = [
      'name' => 'Curso de Marketing Digital',
      'description' => 'Aprenda marketing digital do zero ao avançado',
      'value' => 297.00,
      'pix' => true,
      'creditCard' => true,
      'boleto' => true,
      'installments' => 12
  ];

  $ch = curl_init($url);
  curl_setopt_array($ch, [
      CURLOPT_POST => true,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HTTPHEADER => [
          "Authorization: Bearer {$apiKey}",
          'Content-Type: application/json'
      ],
      CURLOPT_POSTFIELDS => json_encode($payload)
  ]);

  $response = curl_exec($ch);
  $product = json_decode($response, true);
  echo "Link de pagamento: https://garu.com.br/pay/{$product['uuid']}\n";
  ```
</CodeGroup>

### Exemplo para Assinatura

Para produtos com cobrança recorrente, defina `isSubscription: true`. O preço será configurado posteriormente nos [preços de assinatura](/api-reference/assinaturas/precos/criar):

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/products \
    -H "Authorization: Bearer sk_test_sua_chave_api" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Plano Premium",
      "description": "Acesso completo a todos os recursos",
      "isSubscription": true
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://garu.com.br/api/products', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.GARU_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Plano Premium',
      description: 'Acesso completo a todos os recursos',
      isSubscription: true
    })
  });

  const product = await response.json();
  // Próximo passo: criar preços de assinatura com o UUID do produto
  console.log(`Produto criado: ${product.uuid}`);
  ```

  ```python Python theme={null}
  import requests
  import os

  response = requests.post(
      "https://garu.com.br/api/products",
      headers={"Authorization": f"Bearer {os.environ['GARU_API_KEY']}"},
      json={
          "name": "Plano Premium",
          "description": "Acesso completo a todos os recursos",
          "isSubscription": True
      }
  )

  product = response.json()
  # Próximo passo: criar preços de assinatura com o UUID do produto
  print(f"Produto criado: {product['uuid']}")
  ```
</CodeGroup>

<Tip>
  Após criar um produto de assinatura, você precisa [criar preços de assinatura](/api-reference/assinaturas/precos/criar) para definir os planos (mensal, anual, etc.) e seus valores.
</Tip>

## Resposta de Sucesso

<ResponseField name="id" type="number">
  ID interno do produto.
</ResponseField>

<ResponseField name="uuid" type="string">
  Identificador único usado para o link de pagamento.
</ResponseField>

<ResponseField name="name" type="string">
  Nome do produto.
</ResponseField>

<ResponseField name="description" type="string">
  Descrição do produto.
</ResponseField>

<ResponseField name="value" type="number">
  Preço do produto.
</ResponseField>

<ResponseField name="pix" type="boolean">
  Se PIX está habilitado.
</ResponseField>

<ResponseField name="creditCard" type="boolean">
  Se cartão de crédito está habilitado.
</ResponseField>

<ResponseField name="boleto" type="boolean">
  Se boleto está habilitado.
</ResponseField>

<ResponseField name="pixAutomatic" type="boolean">
  Se o Pix Automático (débito recorrente) está habilitado.
</ResponseField>

<ResponseField name="installments" type="array">
  Lista de parcelas com valores calculados.
</ResponseField>

<ResponseField name="isActive" type="boolean">
  Status do produto.
</ResponseField>

<ResponseField name="isSubscription" type="boolean">
  Se o produto é de assinatura (cobrança recorrente).
</ResponseField>

<ResponseField name="createdAt" type="string">
  Data de criação (ISO 8601).
</ResponseField>

<ResponseField name="updatedAt" type="string">
  Data da última atualização (ISO 8601).
</ResponseField>

### Exemplo de Resposta (201 Created)

```json theme={null}
{
  "id": 123,
  "name": "Curso de Marketing Digital",
  "description": "Aprenda marketing digital do zero ao avançado",
  "value": 297.00,
  "uuid": "prod_a1b2c3d4e5f6",
  "pix": true,
  "creditCard": true,
  "boleto": true,
  "installments": [
    { "quantity": 1, "value": 297.00 },
    { "quantity": 2, "value": 153.45 },
    { "quantity": 3, "value": 104.94 },
    { "quantity": 4, "value": 80.69 },
    { "quantity": 5, "value": 66.15 },
    { "quantity": 6, "value": 56.52 },
    { "quantity": 7, "value": 49.68 },
    { "quantity": 8, "value": 44.55 },
    { "quantity": 9, "value": 40.59 },
    { "quantity": 10, "value": 37.42 },
    { "quantity": 11, "value": 34.85 },
    { "quantity": 12, "value": 32.72 }
  ],
  "isActive": true,
  "isSubscription": false,
  "createdAt": "2024-12-24T10:30:00.000Z",
  "updatedAt": "2024-12-24T10:30:00.000Z"
}
```

## Erros Comuns

<AccordionGroup>
  <Accordion title="400 - Valor mínimo não atingido">
    ```json theme={null}
    {
      "statusCode": 400,
      "message": ["value must be at least 5"]
    }
    ```

    **Solução:** O preço mínimo é R\$ 5,00.
  </Accordion>

  <Accordion title="400 - Nome é obrigatório">
    ```json theme={null}
    {
      "statusCode": 400,
      "message": ["name should not be empty"]
    }
    ```

    **Solução:** O campo `name` é o único campo obrigatório. Verifique se está preenchido.
  </Accordion>

  <Accordion title="401 - Não autorizado">
    ```json theme={null}
    {
      "statusCode": 401,
      "message": "API key is required"
    }
    ```

    **Solução:** Verifique se o header `Authorization` está correto.
  </Accordion>
</AccordionGroup>

## Próximos Passos

<CardGroup cols={2}>
  <Card title="Link de Pagamento" icon="link" href="/api-reference/produtos/link-pagamento">
    Aprenda a usar e compartilhar o link de pagamento
  </Card>

  <Card title="Listar Produtos" icon="list" href="/api-reference/produtos/listar">
    Consulte seus produtos existentes
  </Card>

  <Card title="Criar Preço de Assinatura" icon="tag" href="/api-reference/assinaturas/precos/criar">
    Configure planos de preço para produtos de assinatura
  </Card>

  <Card title="Guia de Assinaturas" icon="repeat" href="/guias/assinaturas">
    Aprenda a configurar cobrança recorrente
  </Card>
</CardGroup>
