Estoque e preço
Endereço base: https://api.denaryx.com/admin/2026-10. Exemplos e regras no guia Estoque e preço. Os erros seguem o formato comum. A especificação inteira: baixar o OpenAPI.
POST /inventory/adjust
Soma ao estoque, em lote
Escopo write_products
Cada item soma o delta (negativo, subtrai) ao estoque de agora, sem ler antes: o jeito seguro com pedidos acontecendo. Até 100 itens, pelo variant_id ou pelo sku, tudo ou nada: se algum ficaria abaixo de zero, nada muda (409 insufficient_inventory, com o item em fields). A variante de produto sem controle de estoque (inventory_tracked falso) recusa o lote (422 inventory_not_tracked).
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: InventoryAdjust
| Campo | Tipo | Descrição |
|---|---|---|
itemsobrigatório | lista de objeto | De 1 a 100 itens. |
items[].variant_id | string (uuid) | |
items[].sku | string | Até 64 caracteres. |
items[].deltaobrigatório | integer | De -1000000 a 1000000. |
Resposta
200 Sucesso. (BatchResult)
Os campos da resposta (21)
| Campo | Tipo | Descrição |
|---|---|---|
variants | lista de Variant | |
variants[].id | string (uuid) | |
variants[].product_id | string (uuid) | |
variants[].options | lista de string | |
variants[].sku | string ou null | |
variants[].barcode | string ou null | |
variants[].price | integer | |
variants[].compare_at_price | integer ou null | |
variants[].cost | integer ou null | |
variants[].inventory_quantity | integer | |
variants[].inventory_tracked | boolean | |
variants[].prescription_range | objeto ou null | |
variants[].prescription_range.sphere_min | number | |
variants[].prescription_range.sphere_max | number | |
variants[].prescription_range.cylinder_max | number | |
variants[].prescription_range.add_min | number ou null | Sem ele: null. |
variants[].prescription_range.add_max | number ou null | Sem ele: null. |
variants[].prescription_range.base_curve | number ou null | A curva base (BC) da caixa, em mm: só na contact_lens. |
variants[].prescription_range.diameter | number ou null | O diâmetro (DIA) da caixa, em mm: só na contact_lens. |
variants[].position | integer | |
variants[].updated_at | string (data e hora) |
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).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).
POST /inventory/set
Grava o estoque, em lote
Escopo write_products
O estoque de cada item passa a ser o número mandado: o que está à venda, depois dos pedidos já feitos. Até 100 itens, tudo ou nada. A variante de produto sem controle de estoque (inventory_tracked falso) recusa o lote (422 inventory_not_tracked).
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: InventorySet
| Campo | Tipo | Descrição |
|---|---|---|
itemsobrigatório | lista de objeto | De 1 a 100 itens. |
items[].variant_id | string (uuid) | |
items[].sku | string | Até 64 caracteres. |
items[].inventory_quantityobrigatório | integer | De 0 a 1000000. |
Resposta
200 Sucesso. (BatchResult)
Os campos da resposta (21)
| Campo | Tipo | Descrição |
|---|---|---|
variants | lista de Variant | |
variants[].id | string (uuid) | |
variants[].product_id | string (uuid) | |
variants[].options | lista de string | |
variants[].sku | string ou null | |
variants[].barcode | string ou null | |
variants[].price | integer | |
variants[].compare_at_price | integer ou null | |
variants[].cost | integer ou null | |
variants[].inventory_quantity | integer | |
variants[].inventory_tracked | boolean | |
variants[].prescription_range | objeto ou null | |
variants[].prescription_range.sphere_min | number | |
variants[].prescription_range.sphere_max | number | |
variants[].prescription_range.cylinder_max | number | |
variants[].prescription_range.add_min | number ou null | Sem ele: null. |
variants[].prescription_range.add_max | number ou null | Sem ele: null. |
variants[].prescription_range.base_curve | number ou null | A curva base (BC) da caixa, em mm: só na contact_lens. |
variants[].prescription_range.diameter | number ou null | O diâmetro (DIA) da caixa, em mm: só na contact_lens. |
variants[].position | integer | |
variants[].updated_at | string (data e hora) |
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).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).
POST /prices/set
Grava preços, em lote
Escopo write_products
O preço, o "de" (compare_at_price; null tira a promoção) e o custo de cada item, só os que vierem. O "de" precisa ser maior que o preço. Até 100 itens, tudo ou nada. As promoções da loja continuam valendo sobre o preço novo.
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: PriceSet
| Campo | Tipo | Descrição |
|---|---|---|
itemsobrigatório | lista de objeto | De 1 a 100 itens. |
items[].variant_id | string (uuid) | |
items[].sku | string | Até 64 caracteres. |
items[].price | integer | De 0 a 100000000. |
items[].compare_at_price | integer ou null | De 0 a 100000000. |
items[].cost | integer ou null | De 0 a 100000000. |
Resposta
200 Sucesso. (BatchResult)
Os campos da resposta (21)
| Campo | Tipo | Descrição |
|---|---|---|
variants | lista de Variant | |
variants[].id | string (uuid) | |
variants[].product_id | string (uuid) | |
variants[].options | lista de string | |
variants[].sku | string ou null | |
variants[].barcode | string ou null | |
variants[].price | integer | |
variants[].compare_at_price | integer ou null | |
variants[].cost | integer ou null | |
variants[].inventory_quantity | integer | |
variants[].inventory_tracked | boolean | |
variants[].prescription_range | objeto ou null | |
variants[].prescription_range.sphere_min | number | |
variants[].prescription_range.sphere_max | number | |
variants[].prescription_range.cylinder_max | number | |
variants[].prescription_range.add_min | number ou null | Sem ele: null. |
variants[].prescription_range.add_max | number ou null | Sem ele: null. |
variants[].prescription_range.base_curve | number ou null | A curva base (BC) da caixa, em mm: só na contact_lens. |
variants[].prescription_range.diameter | number ou null | O diâmetro (DIA) da caixa, em mm: só na contact_lens. |
variants[].position | integer | |
variants[].updated_at | string (data e hora) |
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).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).