Pular para o conteúdo principal

Guia do Seller — Criar e Publicar Produto

Guia completo para um seller criar e publicar um produto. O seller trabalha sobre o catálogo já configurado pelo admin — ele não cria ProductTypes, Assets ou Templates.

Visão geral


Upload da artwork

Use o fluxo de presign para fazer upload da arte.

Endpoints:

POST /uploads/artworks/presign — pedir URL de upload
POST /uploads/artworks/{artworkId}/complete — confirmar e criar registro

Criar produto

O SellerProduct é criado já com pelo menos 1 variante.

aviso

A criação NÃO gera renders automaticamente. O seller deve configurar o placement e disparar o render explicitamente.

POST /seller-products/me
{
"productTypeId": "uuid-product-type",
"artworkId": "uuid-artwork",
"title": "Caneca Arte Abstrata",
"slug": "caneca-arte-abstrata",
"description": "Caneca com arte exclusiva",
"variants": [
{
"productVariantId": "uuid-variante-350ml-glossy",
"priceCents": 4990,
"allowedOptions": {
"color": ["black", "white", "red", "blue"]
}
},
{
"productVariantId": "uuid-variante-350ml-matte",
"priceCents": 4990,
"allowedOptions": {
"color": ["black", "white"]
}
}
]
}

Campos do produto

CampoObrigatórioDescrição
titleSimNome do produto
slugNãoSlug para URL. Auto-convertido para lowercase
descriptionNãoDescrição do produto

Campos da variante

CampoObrigatórioDescrição
productVariantIdSimUUID da ProductVariant do catálogo
priceCentsSimPreço de venda em centavos
allowedOptionsNãoQuais options permitir. {} = todas
skuNãoSKU do seller (controle próprio)

Regras do allowedOptions

CenárioO que acontece
{} (vazio)Herda todas as options ativas do ProductType
{"color": ["black", "white"]}Comprador só pode escolher preto ou branco
{"color": []}Erro 400 se color é required
{"corErrada": ["x"]}Erro 400 — key não existe
{"color": ["roxo"]}Erro 400 — value não existe

Adicionar variante depois

POST /seller-products/me/{sellerProductId}/variants
{
"productVariantId": "uuid-variante-700ml-glossy",
"priceCents": 6990,
"allowedOptions": { "color": ["black", "blue"] }
}

Criar para terceiros (admin)

POST /seller-products/admin

Mesma lógica, mas inclui sellerProfileId no body.


Renders

Conceito

O render não é automático. O seller decide quais templates renderizar e controla o posicionamento.

Sistema de coordenadas

Todas as coordenadas são em pixels do sourceImage, com referência no canto superior esquerdo da arte (igual ao Figma).

(0,0)(200,252)sourceImage (200x252)printArea (80x88)(50,73)ARTE(55,80)x=50pxprintAreaartwork (x, y, scale)
CampoUnidadeDescrição
xpxPosição X do canto superior esquerdo da arte
ypxPosição Y do canto superior esquerdo da arte
scalemultiplicador1.0 = tamanho original, 0.5 = metade
rotationgrausSentido horário. 0 = sem rotação

Pré-visualização (sem salvar)

POST /products/templates/{templateId}/preview-placement
{
"artworkId": "uuid-da-artwork",
"x": 95,
"y": 110,
"scale": 0.14,
"rotation": 0
}

Retorna imagem PNG diretamente. Headers de resposta indicam fit:

HeaderDescrição
X-Fits-Within-Print-Areatrue ou false
X-Overflow-Top/Right/Bottom/LeftOverflow em pixels por direção
X-Bleed-ToleranceTolerância aceita em pixels (ex: {"width": 4, "height": 4})
X-Artwork-BoundsBounding box da arte (JSON)
X-Print-Area-BoundsRetângulo da printArea (JSON)

Disparar render

POST /seller-products/me/{sellerProductId}/render
{
"templateId": "caneca-350ml-preta-v1",
"x": 95,
"y": 110,
"scale": 0.14,
"rotation": 0
}

O que acontece:

  1. Valida que o template existe
  2. Valida que a arte cabe na printArea (tolerância de 5% de sangria). Se não cabe, retorna 400 com detalhes do overflow em pixels por lado
  3. Cria/atualiza o placement
  4. Gera o mockup (compõe arte + layers)
  5. Salva no S3 como WebP
  6. Cria/atualiza o registro de Render no banco
  7. Retorna o produto com todos os renders

:::tip Consistência O preview-placement e o render usam exatamente a mesma função de validação. Se o preview aprova, o render aceita. :::

:::warning PUT /artworks/.../placements/{templateId} NÃO dispara re-render Atualizar o placement via PUT só atualiza os valores de posicionamento no banco. Para gerar a imagem com o novo posicionamento, chame POST /seller-products/me/{sellerProductId}/render novamente. :::

Endpoints alternativos de render (via artwork)

Quando você quer gerar render sem passar pelo SellerProduct (ex: admin gerando render direto da artwork):

POST /artworks/{artworkId}/renders — 1 template
POST /artworks/{artworkId}/renders/batch — vários templates de uma vez

Estes retornam a lista de renders gerados (não o produto inteiro). Placement é por (artwork, template) — não por variante — então um mesmo render pode aparecer em múltiplas variantes cujo template casa por subset.


Publicar

O produto é criado com status draft. Para publicar:

PATCH /seller-products/me/{sellerProductId}
{ "status": "active" }

Validações ao ativar:

  • Produto deve ter um slug
  • Produto deve ter pelo menos um render

Ciclo de vida

StatusVisível na lojaDescrição
draftNãoSendo configurado (default)
activeSimPublicado e à venda
pausedNãoTemporariamente oculto
archivedNãoSoft delete

Preview antes de publicar

GET /seller-products/me/{sellerProductId}/preview

Retorna o mesmo formato do endpoint público — funciona para qualquer status.


Referência de endpoints

Artwork

POST /uploads/artworks/presign — pedir URL de upload
POST /uploads/artworks/{artworkId}/complete — confirmar upload
GET /artworks/me — listar minhas artes
GET /artworks/{artworkId} — obter por ID
PATCH /artworks/{artworkId} — atualizar
DELETE /artworks/{artworkId} — desativar
GET /artworks/check-slug?slug=minha-arte — verificar slug
GET /artworks/{artworkId}/placements — listar placements
PUT /artworks/{artworkId}/placements/{templateId} — criar/atualizar placement (NÃO dispara render)
GET /artworks/{artworkId}/renders — listar renders
POST /artworks/{artworkId}/renders — gerar render (1 template)
POST /artworks/{artworkId}/renders/batch — gerar renders (vários)

Públicos (sem autenticação):

GET /artworks/public/{artworkId} — detalhes da arte
GET /artworks/public/by-slug/{artistSlug}/{slug} — por slug
GET /artworks/public/{artworkId}/products — produtos usando essa arte
GET /artworks/public/related/artist/{artistSlug} — artes relacionadas do artista

Seller Product

POST /seller-products/me — criar produto
GET /seller-products/me — listar meus produtos
GET /seller-products/me/{id} — obter produto
PATCH /seller-products/me/{id} — atualizar
POST /seller-products/me/{id}/variants — adicionar variante
PATCH /seller-products/me/{id}/variants/{variantId} — atualizar variante
DELETE /seller-products/me/{id}/variants/{variantId} — desativar variante
POST /seller-products/me/{id}/variants/generate-skus — gerar SKUs
POST /seller-products/me/{id}/render — render template
GET /seller-products/me/{id}/preview — preview página pública
DELETE /seller-products/me/{id} — arquivar (soft delete)
DELETE /seller-products/admin/{sellerProductId} — deletar permanentemente (admin only)