Coleções e marcas
Endereço base: https://api.denaryx.com/admin/2026-10. Exemplos e regras no guia Produtos, coleções e marcas. Os erros seguem o formato comum. A especificação inteira: baixar o OpenAPI.
GET /collections
As coleções da loja
Escopo read_products ou read_content
As categorias da loja, em árvore, numa lista plana na ordem do menu: cada coleção seguida das de baixo dela. Todas (no máximo 2.000) cabem numa página só.
Resposta
200 Sucesso. (CollectionList)
Os campos da resposta (13)
| Campo | Tipo | Descrição |
|---|---|---|
data | lista de objeto | |
data[].id | string (uuid) | |
data[].parent_id | string (uuid) ou null | |
data[].title | string | |
data[].handle | string | |
data[].path | string | |
data[].level | integer | |
data[].products_count | integer | |
data[].attributes | lista de objeto | |
data[].attributes[].attribute_id | string (uuid) | |
data[].attributes[].required | boolean | |
data[].google_category_id | integer ou null | |
next_cursor | string ou null |
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
POST /collections
Cria uma coleção
Escopo write_products
No fim das coleções do mesmo lugar da árvore (até 3 níveis). Sem handle, o endereço sai do título.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Corpo application/json: CollectionCreate
| Campo | Tipo | Descrição |
|---|---|---|
titleobrigatório | string | Até 60 caracteres. |
handle | string | Até 60 caracteres. |
parent_id | string (uuid) ou null | |
attributes | lista de objeto | Até 100 itens. |
attributes[].attribute_idobrigatório | string (uuid) | |
attributes[].required | boolean | Sem ele: false. |
google_category_id | integer ou null | Maior que 0. |
description | string | Até 5000 caracteres. |
seo | objeto | |
seo.title | string | Até 70 caracteres. |
seo.description | string | Até 320 caracteres. |
template_suffix | string | Até 40 caracteres. |
Resposta
201 Sucesso. (CollectionWithContent)
Os campos da resposta (16)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
parent_id | string (uuid) ou null | |
title | string | |
handle | string | |
path | string | |
level | integer | |
products_count | integer | |
attributes | lista de objeto | |
attributes[].attribute_id | string (uuid) | |
attributes[].required | boolean | |
google_category_id | integer ou null | |
description | string | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
template_suffix | string |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).409O estado do recurso não permite a mudança, ou ele mudou desde a leitura (conflict).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
GET /collections/{id}
Uma coleção
Escopo read_products ou read_content
Com o texto da página e o título e a descrição para os buscadores.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da coleção. |
Resposta
200 Sucesso. (CollectionWithContent)
Os campos da resposta (16)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
parent_id | string (uuid) ou null | |
title | string | |
handle | string | |
path | string | |
level | integer | |
products_count | integer | |
attributes | lista de objeto | |
attributes[].attribute_id | string (uuid) | |
attributes[].required | boolean | |
google_category_id | integer ou null | |
description | string | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
template_suffix | string |
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
PATCH /collections/{id}
Muda campos de uma coleção
Escopo write_products ou write_content
Só o que vier muda. Um parent_id novo move a coleção, com as de baixo, para o fim do lugar novo; o endereço antigo leva ao novo. Com write_content, só os textos: title, description, seo e handle; qualquer outro campo dá 403 missing_scope, com os campos que pedem write_products em fields.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da coleção. |
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Corpo application/json: CollectionUpdate
| Campo | Tipo | Descrição |
|---|---|---|
title | string | Até 60 caracteres. |
handle | string | Até 60 caracteres. |
parent_id | string (uuid) ou null | |
attributes | lista de objeto | Até 100 itens. |
attributes[].attribute_idobrigatório | string (uuid) | |
attributes[].required | boolean | Sem ele: false. |
google_category_id | integer ou null | Maior que 0. |
description | string | Até 5000 caracteres. |
seo | objeto | |
seo.title | string | Até 70 caracteres. |
seo.description | string | Até 320 caracteres. |
template_suffix | string | Até 40 caracteres. |
Resposta
200 Sucesso. (CollectionWithContent)
Os campos da resposta (16)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
parent_id | string (uuid) ou null | |
title | string | |
handle | string | |
path | string | |
level | integer | |
products_count | integer | |
attributes | lista de objeto | |
attributes[].attribute_id | string (uuid) | |
attributes[].required | boolean | |
google_category_id | integer ou null | |
description | string | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
template_suffix | string |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).409O estado do recurso não permite a mudança, ou ele mudou desde a leitura (conflict).422O pedido é válido, mas não pode ser atendido como está (invalid_request).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
DELETE /collections/{id}
Exclui uma coleção
Escopo write_products
Os produtos saem dela e continuam nas outras. A coleção com outras debaixo dela não sai (409).
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da coleção. |
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Resposta
204 Sucesso, sem corpo.
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).409O estado do recurso não permite a mudança, ou ele mudou desde a leitura (conflict).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
GET /brands
As marcas da loja
Escopo read_products ou read_content
Todas (no máximo 2.000), em ordem de nome, numa página só.
Resposta
200 Sucesso. (BrandList)
Os campos da resposta (11)
| Campo | Tipo | Descrição |
|---|---|---|
data | lista de Brand | |
data[].id | string (uuid) | |
data[].name | string | |
data[].handle | string | |
data[].description | string | |
data[].logo_url | string ou null | |
data[].seo | objeto | |
data[].seo.title | string | |
data[].seo.description | string | |
data[].products_count | integer | |
next_cursor | string ou null |
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
POST /brands
Cria uma marca
Escopo write_products
Sem handle, o endereço sai do nome. O logo se envia pelo painel.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Corpo application/json: BrandCreate
| Campo | Tipo | Descrição |
|---|---|---|
nameobrigatório | string | Até 60 caracteres. |
handle | string | Até 60 caracteres. |
description | string | Até 2000 caracteres. |
seo | objeto | |
seo.title | string | Até 70 caracteres. |
seo.description | string | Até 320 caracteres. |
Resposta
201 Sucesso. (Brand)
Os campos da resposta (9)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
name | string | |
handle | string | |
description | string | |
logo_url | string ou null | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
products_count | integer |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).409O estado do recurso não permite a mudança, ou ele mudou desde a leitura (conflict).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
GET /brands/{id}
Uma marca
Escopo read_products ou read_content
A marca, com quantos produtos são dela.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da marca. |
Resposta
200 Sucesso. (Brand)
Os campos da resposta (9)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
name | string | |
handle | string | |
description | string | |
logo_url | string ou null | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
products_count | integer |
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
PATCH /brands/{id}
Muda campos de uma marca
Escopo write_products ou write_content
Só o que vier muda; o logo fica. Um handle novo leva o endereço antigo ao novo. Todos os campos da marca são texto: write_content basta.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da marca. |
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Corpo application/json: BrandUpdate
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Até 60 caracteres. |
handle | string | Até 60 caracteres. |
description | string | Até 2000 caracteres. |
seo | objeto | |
seo.title | string | Até 70 caracteres. |
seo.description | string | Até 320 caracteres. |
Resposta
200 Sucesso. (Brand)
Os campos da resposta (9)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
name | string | |
handle | string | |
description | string | |
logo_url | string ou null | |
seo | objeto | |
seo.title | string | |
seo.description | string | |
products_count | integer |
Erros
400A chamada veio com campos inválidos; os campos recusados vão em fields (invalid_request).401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).409O estado do recurso não permite a mudança, ou ele mudou desde a leitura (conflict).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).
DELETE /brands/{id}
Exclui uma marca
Escopo write_products
Os produtos dela ficam sem marca.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da marca. |
Idempotency-Key | cabeçalho | string | Até 255 caracteres. A mesma escrita mandada de novo com a mesma chave, em até 24 horas, devolve a resposta guardada (com Idempotent-Replayed: true) em vez de acontecer duas vezes. |
Resposta
204 Sucesso, sem corpo.
Erros
401O token falta, não existe, foi revogado ou venceu (authentication_error).403O token não tem o escopo da rota, ou, com write_content, mandou campos que pedem write_products, listados em fields (permission_error).404O recurso não existe nesta loja (not_found).429Chamadas demais: espere o Retry-After (rate_limited).500Erro do nosso lado (api_error).503A API está ocupada com outras chamadas: espere o Retry-After (api_error).