Prévia e publicação
Confere o que seria enviado ao marketplace, publica o anúncio, define logística e marca por anúncio e consulta o que foi guardado para um produto.
Antes de publicar, você pode pedir ao Hub uma prévia: ele monta exatamente o que enviaria ao canal e aponta os problemas (atributo obrigatório faltando, categoria que não é folha, imagem ausente), sem escrever nada. Quando a prévia vem limpa, a publicação coloca o anúncio na fila de envio. O canal pode ainda recusar depois; o resultado final aparece em status, last_issues e nos jobs.
Prévia do anúncio
/api/v1/vendor/markethub/listings/{id}/previewSellerMostra o que seria enviado e os problemas encontrados
Não escreve no canal, não enfileira nada e não muda a situação do anúncio. Sem corpo. Use para validar um rascunho a cada alteração.
Parâmetros de caminho
iduuidobrigatório{
"fiscal_version": "",
"external_id": "",
"issues": [
{ "code": "missing_required_attribute", "message": "Preencha a cor.", "attr_id": "COLOR" },
{ "code": "short_title", "message": "Título curto.", "warning": true }
],
"payload": { "title": "Smartphone Plus Roxo 128 GB", "category_id": "MLB1055" }
}Campos da resposta
issuesarray[] quando não há nenhum.issues[].codestringissues[].messagestringissues[].attr_idstringissues[].warningbooleantrue é só um aviso: não impede a publicação. Sem ele (ou false), o problema é bloqueante.payloadobjectnull quando o canal não tem prévia.external_idstringfiscal_versionstringPublicar
/api/v1/vendor/markethub/listings/{id}/publishSellerColoca o anúncio na fila de publicação
Confere o plano do seller e a prévia. Se há problema bloqueante, nada é enfileirado, os problemas ficam gravados em last_issues e a resposta é 422. Se está tudo certo, o anúncio vai para Q (na fila) e um job publish é criado, ou update quando o anúncio já tem external_id. O envio e a resposta do canal acontecem depois.
Em conta desligada ou em execução seca (dry_run), a plataforma monta e guarda a prévia mas não chama o canal: a resposta traz dry_run: true.
Parâmetros de caminho
iduuidobrigatório{ "ok": true, "dry_run": false, "fiscal_version": "" }{
"error": "listing_issues",
"issues": [
{ "code": "missing_required_attribute", "message": "Preencha a cor.", "attr_id": "COLOR" }
]
}Campos da resposta
okbooleantrue quando aceito.dry_runbooleantrue quando a conta não chama o canal: nada foi enviado.fiscal_versionstringLogística do anúncio
/api/v1/vendor/markethub/listings/{id}/logisticsSellerDefine o canal de logística de um anúncio
Grava qual canal de logística do marketplace (por exemplo, envio pelo próprio canal ou por conta do seller) este anúncio usa, em vez do padrão da conta. A gravação vale para os próximos envios.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
channel_idstring{ "ok": true }Mapear uma marca
/api/v1/vendor/markethub/brand-mappingsSellerLiga uma marca local à marca do canal
Alguns canais exigem a marca como um id próprio deles. Esta rota ensina a conta que a marca "Plus" da loja é a marca 12345 do canal, para uma categoria. Gravar de novo a mesma marca na mesma conta e categoria substitui o mapeamento anterior.
Corpo da requisição
account_iduuidobrigatóriocategory_ext_idstringlocal_brandstringobrigatórioexternal_brand_idstringobrigatórioexternal_namestring{ "ok": true }Dados comerciais de um produto
/api/v1/vendor/markethub/products/{productID}/commercialSellerMarca e logística guardadas nos anúncios de um produto
Para um produto da loja, lista os anúncios dele nas suas contas com a marca e a logística guardadas, o SKU e o último preço e estoque enviados. Anúncios em contas de outros sellers não aparecem. Produto sem anúncios devolve lista vazia.
Parâmetros de caminho
productIDuuidobrigatório{
"listings": [
{
"listing_id": "a7c1d0e2-3b4f-4c5a-8d6e-9f0a1b2c3d4e",
"account_id": "e4648fc4-dd0d-45cd-9eaf-4fad48de4a78",
"account_name": "Mercado Livre (produção)",
"marketplace": "mercadolivre",
"external_id": "MLB123456789",
"brand_ext_id": "12345",
"logistics": { "channel_id": "fulfillment" },
"status": "A",
"seller_sku": "SMART-ROXO-128",
"sent_price_cents": 129900,
"sent_stock": 12
}
]
}Campos da resposta
listingsarraylistings[].listing_iduuidlistings[].account_iduuidlistings[].account_namestringlistings[].marketplacestringlistings[].external_idstringlistings[].brand_ext_idstringlistings[].logisticsobjectchannel_id). Ausente quando não definida.listings[].statusstringlistings[].seller_skustringlistings[].sent_price_centsintegerlistings[].sent_stockintegerExemplo de requisição
LISTING=a7c1d0e2-3b4f-4c5a-8d6e-9f0a1b2c3d4e
# 1. prévia
curl -X POST "$BASE_URL/api/v1/vendor/markethub/listings/$LISTING/preview" \
-H "Authorization: Bearer $TOKEN"
# 2. publicar (só se a prévia não tem problema bloqueante)
curl -X POST "$BASE_URL/api/v1/vendor/markethub/listings/$LISTING/publish" \
-H "Authorization: Bearer $TOKEN"Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo não é JSON (logística, marca). | {"error":"invalid body","detail":"..."} |
| 400 | local_brand ou external_brand_id vazio. | {"error":"failed to save brand mapping","detail":"markethub: invalid input"} |
| 401 | Sem token. | {"error":"authentication required"} |
| 403 | Módulo desligado. | {"error":"module_disabled","module":"marketplace-hub"} |
| 403 | O plano do seller não inclui este canal. | {"error":"failed to publish listing","detail":"plan_feature_required"} |
| 404 | Anúncio ou conta de outro seller, ou inexistente. | {"error":"listing not found","detail":"markethub: listing not found"} |
| 422 | Problemas bloqueantes na publicação ou na prévia. | {"error":"listing_issues","issues":[...]} |
| 4xx/5xx | O canal recusou a prévia; o status é o do canal. | {"error":"failed to preview listing","code":"...","detail":"..."} |
| 500 | account_id ou id que não é UUID válido. | {"error":"failed to save brand mapping","detail":"o valor \"\" não é um uuid válido. ..."} |