curl -X POST https://{loja}.com.br/api/hunter/v1/produtos \
-H "Content-Type: application/json" \
-H "X-API-Key: hk_..." \
-d '{
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15
}
]
}'
const res = await fetch(`${BASE_URL}/produtos`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.API_KEY,
},
body: JSON.stringify({
produtos: [
{
hunter_id: "PROD-001",
nome: "Produto Exemplo A",
descricao: "Descrição textual.",
categoria_hunter_id: "CAT-01",
sku_base: "SKU-001",
marca: "Marca Exemplo",
peso_kg: 0.15,
},
],
}),
});
import requests
res = requests.post(
f"{BASE_URL}/produtos",
headers={"X-API-Key": API_KEY},
json={
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15,
}
]
},
)
{
"success": true,
"data": {
"processados": 2,
"criados": 1,
"atualizados": 1,
"erros": 0,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "atualizado" }
],
"parcial": false,
"totalmente_falho": false
}
}
{
"success": true,
"data": {
"processados": 3,
"criados": 2,
"atualizados": 0,
"erros": 1,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "criado" },
{
"hunter_id": "PROD-003",
"id_loja": null,
"acao": "erro",
"erro": "categoria_hunter_id 'CAT-INEXISTENTE' não encontrada."
}
],
"parcial": true,
"totalmente_falho": false
}
}
{
"success": false,
"error": {
"code": "VALIDATION",
"message": "Payload inválido — veja details pra campos com erro.",
"details": [
{
"path": "produtos.0.ativo",
"message": "Campo 'ativo' é gerenciado pela loja, não deve ser enviado.",
"code": "custom"
}
]
}
}
Produtos
Criar / atualizar produtos
Upsert em lote de produtos, com chave de idempotência hunter_id.
POST
/
api
/
hunter
/
v1
/
produtos
curl -X POST https://{loja}.com.br/api/hunter/v1/produtos \
-H "Content-Type: application/json" \
-H "X-API-Key: hk_..." \
-d '{
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15
}
]
}'
const res = await fetch(`${BASE_URL}/produtos`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.API_KEY,
},
body: JSON.stringify({
produtos: [
{
hunter_id: "PROD-001",
nome: "Produto Exemplo A",
descricao: "Descrição textual.",
categoria_hunter_id: "CAT-01",
sku_base: "SKU-001",
marca: "Marca Exemplo",
peso_kg: 0.15,
},
],
}),
});
import requests
res = requests.post(
f"{BASE_URL}/produtos",
headers={"X-API-Key": API_KEY},
json={
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15,
}
]
},
)
{
"success": true,
"data": {
"processados": 2,
"criados": 1,
"atualizados": 1,
"erros": 0,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "atualizado" }
],
"parcial": false,
"totalmente_falho": false
}
}
{
"success": true,
"data": {
"processados": 3,
"criados": 2,
"atualizados": 0,
"erros": 1,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "criado" },
{
"hunter_id": "PROD-003",
"id_loja": null,
"acao": "erro",
"erro": "categoria_hunter_id 'CAT-INEXISTENTE' não encontrada."
}
],
"parcial": true,
"totalmente_falho": false
}
}
{
"success": false,
"error": {
"code": "VALIDATION",
"message": "Payload inválido — veja details pra campos com erro.",
"details": [
{
"path": "produtos.0.ativo",
"message": "Campo 'ativo' é gerenciado pela loja, não deve ser enviado.",
"code": "custom"
}
]
}
}
Comportamento
Envia um lote de produtos. Cada item é:- Criado se
hunter_idnovo (não existe na loja). - Atualizado se
hunter_idjá cadastrado (só campos “de catálogo” — nome, descrição, marca, gênero, dimensões).
Produto criado entra sempre com
ativo=false. A loja ativa manualmente após revisar imagens, descrições e vincular a categorias.Payload
array
required
Lista de produtos. Máx 500 por request.
string
required
Identificador único do produto no sistema integrado. Chave de idempotência.
string
required
Nome do produto. 2–200 caracteres.
string
Descrição textual. Até 20.000 caracteres.
string
Identificador da categoria no sistema integrado. Se não encontrar na loja, produto é aceito mas aparece um hint em
resultados[].erro.string
SKU base do produto. Se ausente, gerado automaticamente (
HTR-{hunter_id}).string
string
Um de:
feminino, masculino, unissex, infantil.number
Peso em quilos. Mínimo
0.001.number
number
number
Não envie o campo
ativo. Se enviar, response é HTTP 400 VALIDATION. A loja controla ativação.Comportamento no UPDATE
Ao atualizar, os seguintes campos nunca são tocados (loja é dona):slugordemdestaquelancamentoficha_tecnicaseo_title,seo_descriptionimagensativo
nome na criação e nunca regenerado (não sobrescreve ajustes manuais do admin).
curl -X POST https://{loja}.com.br/api/hunter/v1/produtos \
-H "Content-Type: application/json" \
-H "X-API-Key: hk_..." \
-d '{
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15
}
]
}'
const res = await fetch(`${BASE_URL}/produtos`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.API_KEY,
},
body: JSON.stringify({
produtos: [
{
hunter_id: "PROD-001",
nome: "Produto Exemplo A",
descricao: "Descrição textual.",
categoria_hunter_id: "CAT-01",
sku_base: "SKU-001",
marca: "Marca Exemplo",
peso_kg: 0.15,
},
],
}),
});
import requests
res = requests.post(
f"{BASE_URL}/produtos",
headers={"X-API-Key": API_KEY},
json={
"produtos": [
{
"hunter_id": "PROD-001",
"nome": "Produto Exemplo A",
"descricao": "Descrição textual.",
"categoria_hunter_id": "CAT-01",
"sku_base": "SKU-001",
"marca": "Marca Exemplo",
"peso_kg": 0.15,
}
]
},
)
{
"success": true,
"data": {
"processados": 2,
"criados": 1,
"atualizados": 1,
"erros": 0,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "atualizado" }
],
"parcial": false,
"totalmente_falho": false
}
}
{
"success": true,
"data": {
"processados": 3,
"criados": 2,
"atualizados": 0,
"erros": 1,
"resultados": [
{ "hunter_id": "PROD-001", "id_loja": "uuid-1", "acao": "criado" },
{ "hunter_id": "PROD-002", "id_loja": "uuid-2", "acao": "criado" },
{
"hunter_id": "PROD-003",
"id_loja": null,
"acao": "erro",
"erro": "categoria_hunter_id 'CAT-INEXISTENTE' não encontrada."
}
],
"parcial": true,
"totalmente_falho": false
}
}
{
"success": false,
"error": {
"code": "VALIDATION",
"message": "Payload inválido — veja details pra campos com erro.",
"details": [
{
"path": "produtos.0.ativo",
"message": "Campo 'ativo' é gerenciado pela loja, não deve ser enviado.",
"code": "custom"
}
]
}
}
Erros específicos
| Status | Code | Situação |
|---|---|---|
400 | VALIDATION | Payload malformado, campo ativo presente, nome fora do range, hunter_id ausente |
207 | — | Lote parcial (alguns itens falharam individualmente) |
400 | VALIDATION | Todos os itens do lote falharam |