Propostas
Endereço base: https://api.denaryx.com/admin/2026-10. Exemplos e regras no guia Propostas (modo de aprovação). Os erros seguem o formato comum. A especificação inteira: baixar o OpenAPI.
GET /proposals
As propostas desta integração
Escopo write_products ou write_content
Numa integração em modo proposta (approval_mode "proposal" em GET /token), as escritas de texto (PATCH de produto, foto, coleção, marca e página, e POST /pages) respondem 202 com uma proposta, e nada muda na loja até alguém da equipe aprovar em "Sugestões dos agentes", no painel. Aqui você acompanha: pendente, aprovada (com o change_id da mudança no histórico), recusada (com o motivo, quando o lojista escreveu), em conflito (o valor de base mudou antes da aprovação: o valor de agora vem em conflict) ou expirada (ninguém decidiu em 7 dias). Da mais nova para a mais velha.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
limit | consulta | integer | Quantos itens por página, de 1 a 100 (50 sem ele). |
cursor | consulta | string | O next_cursor da página anterior, como veio. Os filtros continuam os mesmos. |
status | consulta | string | Só as que estão nesta situação.Um de: pending, approved, rejected, conflict, expired. |
batch_id | consulta | string (uuid) | Só as da mesma chamada. |
Resposta
200 Sucesso. (ProposalList)
Os campos da resposta (28)
| Campo | Tipo | Descrição |
|---|---|---|
data | lista de Proposal | |
data[].id | string (uuid) | |
data[].resource_type | string | Um de: product, collection, brand, page, image. |
data[].resource_id | string (uuid) ou null | |
data[].product_id | string (uuid) ou null | |
data[].label | string | |
data[].action | string | Um de: update, create, revert. |
data[].fields | lista de objeto | |
data[].fields[].field | string | |
data[].fields[].before | string ou integer ou boolean ou null | |
data[].fields[].after | string ou integer ou boolean | |
data[].batch_id | string (uuid) ou null | |
data[].origin | string | Um de: mcp, api. |
data[].status | string | Um de: pending, approved, rejected, conflict, expired. |
data[].created_at | string | |
data[].expires_at | string | |
data[].decided_at | string ou null | |
data[].rejection_reason | string ou null | |
data[].conflict | objeto ou null | |
data[].conflict.code | string | |
data[].conflict.message | string | |
data[].conflict.fields | lista de objeto | |
data[].conflict.fields[].field | string | |
data[].conflict.fields[].expected | string ou integer ou boolean ou null | |
data[].conflict.fields[].current | string ou integer ou boolean ou null | |
data[].change_id | string (uuid) ou null | |
data[].reverts | string (uuid) ou null | |
next_cursor | string ou null |
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).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 /proposals/{id}
Uma proposta
Escopo write_products ou write_content
A proposta desta integração, com os campos (o before é o valor de base, que a aprovação confere), a situação e, decidida, quando e como.
Parâmetros
| Nome | Onde | Tipo | Descrição |
|---|---|---|---|
idobrigatório | caminho | string (uuid) | O id da proposta. |
Resposta
200 Sucesso. (Proposal)
Os campos da resposta (26)
| Campo | Tipo | Descrição |
|---|---|---|
id | string (uuid) | |
resource_type | string | Um de: product, collection, brand, page, image. |
resource_id | string (uuid) ou null | |
product_id | string (uuid) ou null | |
label | string | |
action | string | Um de: update, create, revert. |
fields | lista de objeto | |
fields[].field | string | |
fields[].before | string ou integer ou boolean ou null | |
fields[].after | string ou integer ou boolean | |
batch_id | string (uuid) ou null | |
origin | string | Um de: mcp, api. |
status | string | Um de: pending, approved, rejected, conflict, expired. |
created_at | string | |
expires_at | string | |
decided_at | string ou null | |
rejection_reason | string ou null | |
conflict | objeto ou null | |
conflict.code | string | |
conflict.message | string | |
conflict.fields | lista de objeto | |
conflict.fields[].field | string | |
conflict.fields[].expected | string ou integer ou boolean ou null | |
conflict.fields[].current | string ou integer ou boolean ou null | |
change_id | string (uuid) ou null | |
reverts | string (uuid) 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).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).