Ir para o conteúdo

API de Produtos

🤖 Explicar com IA

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:

{
  "recurrence": "specific_billing_day",
  "payday": 15                       // Válido: 1-28
}

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:

{
  "detail": "Authentication credentials were not provided."
}

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=true ou ?test=false controla o modo.
  • O sistema detecta automaticamente o modo com base na Chave de API utilizada.

Melhores Práticas

  1. Valide os preços cuidadosamente - Garanta que os preços correspondam aos requisitos de casas decimais da moeda.
  2. Use nomes descritivos - Ajude os clientes a entenderem os produtos claramente.
  3. Defina estoque preciso - Mantenha as contagens de inventário atualizadas.
  4. Adicione imagens - Imagens de produtos aumentam as taxas de conversão.
  5. Use SKUs - SKUs exclusivos ajudam na gestão de inventário.
  6. Aplique impostos corretamente - Inclua todos os IDs de impostos aplicáveis.
  7. Teste antes da produção - Use o modo de teste com chaves de API de teste para validação.
  8. 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.