API de Produtos
A API de Produtos foi projetada para gerenciar dados de produtos de forma eficiente em um ambiente de e-commerce. Ela suporta a criação, modificação e exclusão de produtos, gerenciando detalhes de preços, informações de estoque, configurações de recorrência, impostos e gestão de imagens.
A API garante respostas claras e consistentes, incluindo tratamento detalhado de erros e suporte para múltiplas moedas com validação de precisão adequada.
Criar um produto¶
Endpoint
POST /v1/products/
Este endpoint permite criar um novo produto no sistema enviando uma solicitação POST com os detalhes do produto — como nome, descrição, preço, moeda, estoque, impostos, imagens e configurações de recorrência.
Parâmetros de Consulta (Query Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| test | Indica se o produto está no modo de teste | boolean | false |
Campos do Corpo da Solicitação (Request Body Fields):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| name | Nome do produto (máx. 50 caracteres) | string | true |
| short_description | Descrição breve do produto (máx. 100 caracteres) | string | false |
| description | Descrição detalhada do produto (máx. 300 caracteres) | string | false |
| price | Preço do produto (validado pela moeda) | decimal | true |
| currency | Código da moeda (USD, EUR, CRC, etc.) | string | false |
| stock | Número de itens em estoque | integer | false |
| is_physical | Se o produto é físico (true/false) | boolean | false |
| bar_code | Código de barras do produto | string | false |
| sku | Unidade de manutenção de estoque (Stock keeping unit) | string | false |
| taxes | IDs de impostos separados por vírgula | string | false |
| recurrence | Configurações de recorrência (objeto JSON) | object | false |
Formato do Objeto de Recorrência:
{
"recurrence": "period", // ou "specific_billing_day"
"duration_period": 1 // Válido: 1, 2, 3, 4, 6, 12 (meses)
}
Ou:
Parâmetros de Upload de Arquivo:
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| image_default | Imagem padrão do produto (arquivo) | file | false |
| images | Imagens adicionais do produto (máx. 4) | file | false |
Solicitação:
curl -X POST 'https://api.4geeks.io/v1/products/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:' \
-F 'name=Premium Widget' \
-F 'description=This is a premium widget product' \
-F 'price=99.99' \
-F 'currency=USD' \
-F 'stock=50' \
-F 'is_physical=true' \
-F 'taxes=1,3' \
-F 'sku=PREMIUM-WIDGET-001' \
-F 'image_default=@/path/to/image.jpg' \
-F 'recurrence={"recurrence":"period","duration_period":3}'
Resposta (201 Created):
{
"code": 201,
"title": "Complete registration",
"content": "The registration was successfully completed.",
"type": "success",
"data": {
"id": "d36a4a5c-9fa9-4d55-b47f-4f1d50f2a180"
}
}
Obter todos os produtos¶
Endpoint
GET /v1/products/
Este endpoint recupera uma lista paginada de todos os produtos com suporte a filtragem avançada. Suporta paginação, busca, filtragem por tipo, faixa de preço e níveis de estoque.
Parâmetros de Consulta (Query Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| page | O número da página a ser recuperada (padrão: 1) | integer | false |
| page_size | Produtos por página (padrão: 10, máx: 100) | integer | false |
| test | Filtrar pelo modo de teste (true/false) | boolean | false |
| search | Buscar por nome ou SKU | string | false |
| type | Filtrar por tipo (físico/digital) | string | false |
| stock_min | Nível mínimo de estoque | integer | false |
| stock_max | Nível máximo de estoque | integer | false |
| price_min | Preço mínimo (na moeda do produto) | decimal | false |
| price_max | Preço máximo (na moeda do produto) | decimal | false |
Solicitação:
curl -X GET 'https://api.4geeks.io/v1/products/?page=1&page_size=10&test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Solicitação (Com Filtros):
curl -X GET 'https://api.4geeks.io/v1/products/?page=1&search=widget&type=physical&price_min=10&price_max=100&stock_min=5' \
-u 'sk_test_51O62xYzAbcDef123:'
Resposta (200 OK):
{
"count": 25,
"current_page": 1,
"total_pages": 3,
"results": [
{
"id": "a232cccc-956a-44ca-a2e8-d763afddc89f",
"name": "Premium Widget",
"short_description": "High-quality widget",
"description": "This is a premium widget product with advanced features",
"stock": 50,
"price": "99.99",
"currency": "USD",
"total_price": "109.99",
"is_physical": true,
"bar_code": "123456789012",
"sku": "PREMIUM-WIDGET-001",
"recurrence": {
"recurrence": "period",
"duration_period": 3
},
"images": {
"default": "https://storage.googleapis.com/bucket/image-default.jpg",
"additional_images": [
{"image": "https://storage.googleapis.com/bucket/image-1.jpg"},
{"image": "https://storage.googleapis.com/bucket/image-2.jpg"}
]
},
"payment_link": false,
"created_on": "2025-12-04T10:30:00Z",
"test": false,
"taxes": [
{"id": 1, "name": "VAT", "value": 10.0}
]
}
]
}
Obter um produto específico¶
Endpoint
GET /v1/products/{id}/
Este endpoint recupera os detalhes completos de um produto específico através do seu ID único.
Parâmetros de Caminho (Path Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| id | O identificador único de um produto (UUID) | string | true |
Parâmetros de Consulta (Query Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| test | Filtrar pelo modo de teste (true/false) | boolean | false |
Solicitação:
curl -X GET 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Resposta (200 OK):
{
"id": "f9b77185-a62e-4da9-a056-3c7b812ca334",
"name": "Premium Widget",
"short_description": "High-quality widget",
"description": "This is a premium widget product with advanced features",
"stock": 50,
"price": "99.99",
"currency": "USD",
"total_price": "109.99",
"is_physical": true,
"bar_code": "123456789012",
"sku": "PREMIUM-WIDGET-001",
"recurrence": {
"recurrence": "period",
"duration_period": 3
},
"images": {
"default": "https://storage.googleapis.com/bucket/image-default.jpg",
"additional_images": [
{"image": "https://storage.googleapis.com/bucket/image-1.jpg"},
{"image": "https://storage.googleapis.com/bucket/image-2.jpg"}
]
},
"payment_link": false,
"created_on": "2025-12-04T10:30:00Z",
"test": false,
"taxes": [
{"id": 1, "name": "VAT", "value": 10.0}
]
}
Atualizar um produto¶
Endpoint
PUT /v1/products/{id}/
Atualiza um produto existente com novos detalhes. Você pode atualizar campos individuais sem afetar os outros.
Parâmetros de Caminho (Path Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| id | O identificador único de um produto (UUID) | string | true |
Parâmetros de Consulta (Query Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| test | Filtrar pelo modo de teste (true/false) | boolean | false |
Campos do Corpo da Solicitação (todos opcionais):
| Parâmetro | Descrição | Tipo |
|---|---|---|
| name | Nome do produto (máx. 50 caracteres) | string |
| short_description | Descrição breve do produto (máx. 100 caracteres) | string |
| description | Descrição detalhada do produto (máx. 300 caracteres) | string |
| price | Preço do produto (validado pela moeda) | decimal |
| currency | Código da moeda (USD, EUR, CRC, etc.) | string |
| stock | Número de itens em estoque | integer |
| is_physical | Se o produto é físico (true/false) | boolean |
| bar_code | Código de barras do produto | string |
| sku | Unidade de manutenção de estoque | string |
| taxes | IDs de impostos separados por vírgula | string |
| payment_link | Ativar como link de pagamento | boolean |
Sinalizadores de Gestão de Imagem (Image Management Flags):
| Parâmetro | Valor | Ação |
|---|---|---|
| default | -1 | Manter imagem padrão existente |
| default | -remove- | Remover imagem padrão |
| default | <arquivo> | Substituir por nova imagem |
| additional_images | -1 | Manter imagens adicionais existentes |
| additional_images | -remove- | Remover todas as imagens adicionais |
| additional_images | <arquivos> | Substituir por novas imagens (máx. 4) |
Solicitação:
curl -X PUT 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:' \
-F 'name=Updated Widget Name' \
-F 'description=Updated description' \
-F 'price=79.99' \
-F 'stock=100' \
-F 'default=-1'
Resposta (200 OK):
{
"code": 200,
"title": "Updated product",
"content": "The product was successfully updated.",
"type": "success",
"data": {
"id": "f9b77185-a62e-4da9-a056-3c7b812ca334",
"name": "Updated Widget Name",
"description": "Updated description",
"price": "79.99",
"stock": 100,
"total_price": "87.99"
}
}
Excluir um produto¶
Endpoint
DELETE /v1/products/{id}/
Exclui permanentemente um produto e o desativa.
Parâmetros de Caminho (Path Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| id | O identificador único de um produto (UUID) | string | true |
Parâmetros de Consulta (Query Parameters):
| Parâmetro | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| test | Filtrar pelo modo de teste (true/false) | boolean | false |
Solicitação:
curl -X DELETE 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Resposta (200 OK):
{
"code": 200,
"title": "Product deleted",
"content": "The product was successfully deleted.",
"type": "success"
}
Tratamento de Erros¶
A API retorna códigos de status HTTP padrão para indicar o sucesso ou a falha de uma solicitação. Abaixo estão erros comuns específicos para produtos:
400 Bad Request (Solicitação Inválida)¶
Ocorre quando a solicitação está malformada ou contém dados inválidos.
Cenários:
| Cenário | Mensagem de Erro | Solução |
|---|---|---|
| Formato de preço inválido | "Price validation error: {message}" | Verifique a precisão do preço para a moeda (ex: JPY usa 0 decimais) |
| JSON de recorrência inválido | "Please check the format of recurrence, remember that it is a JSON object." | Certifique-se de que a recorrência está em um formato JSON válido |
| Período de duração inválido | "The duration_period can contain only the following values 1, 2, 3, 4, 6, 12" | Use durações de meses válidas: 1, 2, 3, 4, 6 ou 12 |
| Dia de pagamento inválido | "The payday has to be greater than 0 and less than or equal to 28." | Use um dia entre 1 e 28 |
Exemplo de Resposta de Erro:
{
"code": 400,
"title": "Invalid price format",
"content": "Price validation error: JPY requires 0 decimal places. Please adjust the price according to the currency requirements.",
"type": "danger"
}
401 Unauthorized (Não Autorizado)¶
Falha na autenticação. A Chave de API é inválida, está ausente ou malformada.
Exemplo:
Solução: - Verifique se você incluiu o parâmetro -u 'sk_test_...: ou o cabeçalho Authorization: Basic. - Certifique-se de que sua Chave de API está correta e ativa. - Teste com o Postman usando Basic Auth.
404 Not Found (Não Encontrado)¶
O produto solicitado não existe.
Exemplo:
{
"code": 404,
"title": "Product does not exist",
"content": "The id 'f9b77185-a62e-4da9-a056-3c7b812ca334' does not correspond to any product",
"type": "danger"
}
Solução: - Verifique se o ID do produto existe. - Use o endpoint de listagem para encontrar o ID correto do produto. - Certifique-se de que o produto pertence à sua conta de desenvolvedor.
406 Not Acceptable (Não Aceitável)¶
A solicitação viola regras de negócio ou restrições de validação.
Exemplo:
{
"code": 406,
"title": "Product registration failure",
"content": "Failed to register the product, please check: Invalid field values",
"type": "danger"
}
Notas Importantes¶
Validação de Preço
- Os preços são validados com base nas casas decimais da moeda.
- JPY, CLP e moedas similares usam 0 casas decimais.
- USD, EUR, GBP usam 2 casas decimais.
- KWD e moedas similares usam 3 casas decimais.
Gestão de Imagem
- Imagem padrão: Exibida como a imagem principal do produto.
- Imagens adicionais: Suporta até 4 imagens suplementares.
- Formatos suportados: JPEG, PNG.
- Tamanho máximo do arquivo: 10MB por imagem.
- Use sinalizadores especiais (
-1,-remove-) para gerenciar imagens existentes.
Impostos
- Os produtos podem ter múltiplos impostos aplicados.
- O preço total inclui os cálculos de impostos.
- Os impostos foram vinculados pelos seus IDs.
- Envie os IDs dos impostos separados por vírgula:
"taxes": "1,3,5".
Configurações de Recorrência
period: Recorrência mensal fixa (1, 2, 3, 4, 6 ou 12 meses).specific_billing_day: Mensal em um dia específico (1-28).- Estas configurações se aplicam quando o produto é usado em assinaturas.
Teste vs Produção
- Use sua Chave de Teste (
sk_test_...) para desenvolvimento e testes. - Use sua Chave de Produção (
sk_live_...) para transações reais. - O parâmetro de consulta
?test=trueou?test=falsecontrola o modo. - O sistema detecta automaticamente o modo com base na Chave de API utilizada.
Melhores Práticas¶
- Valide os preços cuidadosamente - Garanta que os preços correspondam aos requisitos de casas decimais da moeda.
- Use nomes descritivos - Ajude os clientes a entenderem os produtos claramente.
- Defina estoque preciso - Mantenha as contagens de inventário atualizadas.
- Adicione imagens - Imagens de produtos aumentam as taxas de conversão.
- Use SKUs - SKUs exclusivos ajudam na gestão de inventário.
- Aplique impostos corretamente - Inclua todos os IDs de impostos aplicáveis.
- Teste antes da produção - Use o modo de teste com chaves de API de teste para validação.
- Use a recorrência com sabedoria - Defina a recorrência apenas para produtos elegíveis para assinatura.
Solução de Problemas¶
Problema: “Price validation error: JPY requires 0 decimal places”¶
Causa: Uso de casas decimais não suportadas pela moeda.
Solução: - JPY: Use números inteiros (sem decimais). - USD/EUR: Use 2 casas decimais (99.99). - KWD: Use 3 casas decimais (99.999).
Problema: “The duration_period can contain only the following values 1, 2, 3, 4, 6, 12”¶
Causa: Período de recorrência inválido fornecido.
Solução: - Use apenas: 1 (mensal), 2 (bimestral), 3 (trimestral), 4 (quadrimestral), 6 (semestral) ou 12 (anual).
Problema: “The payday has to be greater than 0 and less than or equal to 28”¶
Causa: Dia de faturamento inválido fornecido.
Solução: - O dia de pagamento deve estar entre 1 e 28. - Dias 29-31 não são suportados para garantir a consistência mensal.
Problema: “Product does not exist”¶
Causa: O ID do produto não existe ou pertence a uma conta de desenvolvedor diferente.
Solução: - Verifique o ID do produto usando o endpoint de listagem. - Certifique-se de que está usando a Chave de API correta. - Verifique se o produto não foi excluído.
Problema: “The specified state is invalid”¶
Causa: Tipo de produto ou valor de filtro inválido.
Solução: - Use valores de tipo válidos: “physical” or “digital”. - Garanta que os parâmetros de filtro estejam formatados corretamente.
- Ainda tem dúvidas? Pergunte na comunidade..
- Consulte el changelog.