Update an inventory on an offer
API v2 is in public beta: endpoints and fields can change before general availability. See the changelog
/preorders/offers/{id}/inventoryCosts 2 rate-limit points · Rate limits
Update any subset of the inventory settings on a preorder offer.
Deep partial: absent fields are unchanged. Continue selling for newly attached variants is products.eligible_inventory_policy, part of the products section.
Also searched asedit inventorychange inventory settingsmodify inventoryenable continue selling for the whole offerallow oversellingenable oversellauto continue sellingauto-apply continue selling on attachdisable continue sellingstop auto continue sellingdisable oversellprevent overselling on attachenable auto apply continue sellingauto continue selling on attachauto-flip new variants to continueapply oversell to new variantsdisable auto apply continue sellingstop auto continue selling on attachdon't auto-flip new variantsno oversell on new variantsset inventory providerswitch inventory provideruse shopify inventoryuse stoq inventoryset reservation timingchange inventory reservationset when inventory is heldreserve on salereserve on fulfillmentalways show preorderpreorder regardless of stock
Path parameters
idstringRequired
Headers
Idempotency-KeystringA fresh unique key for every write (a new UUID, say); reuse it only to retry that write. Keys are remembered for 1 hour: the same key and the same request within that hour returns the first result, with
Idempotent-Replayed: true, without running again; the same key with a different method, path or body is refused (422idempotency_key_reused); a retry while the first is still running gets 409idempotency_key_in_progress. Keys are per store. Server errors and rate limits are not kept, so their retry runs.
Request body
stock_conditionstringWhen the Preorder button shows: out_of_stock when the product is out of stock (needs Shopify's 'Continue selling when out of stock' on the variants); in_stock only while the product is in stock (at 0 it stops showing); any_stock_level whenever the variant can be bought, in or out of stock, never changing the inventory policy: "even when in stock" or "in stock too" is any_stock_level. in_stock and any_stock_level need specific products.
One ofout_of_stockin_stockany_stock_levelreservestringWhen to deduct from inventory: on_sale is at checkout, on_fulfillment is at fulfillment. in_stock and any_stock_level always deduct on_sale.
One ofon_saleon_fulfillment
Returns
stock_conditionstringExample:out_of_stockreservestringExample:on_fulfillment
Errors
Missing or invalid X-Auth-Token.
The resource does not exist for this shop, or the action path is not registered.
An earlier request with the same Idempotency-Key is still running. Wait, then resend the same request with the same key.
Invalid fields: one details entry per field error, its path the canonical section path. Nothing was saved.
Rate limited: cost-weighted per token (read 1, write 2; 360 points / 60s). Check Retry-After.
Every error has the same shape: see Errors.
curl -X PATCH "https://app.stoqapp.com/api/v2/external/preorders/offers/73a74948-2b57-4cc3-971f-2b441828c977/inventory" \
-H "X-Auth-Token: $STOQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reserve": "on_fulfillment"
}'const res = await fetch("https://app.stoqapp.com/api/v2/external/preorders/offers/73a74948-2b57-4cc3-971f-2b441828c977/inventory", {
method: "PATCH",
headers: {
"X-Auth-Token": process.env.STOQ_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"reserve": "on_fulfillment"
}),
});
const data = await res.json();import os
import requests
res = requests.patch(
"https://app.stoqapp.com/api/v2/external/preorders/offers/73a74948-2b57-4cc3-971f-2b441828c977/inventory",
headers={"X-Auth-Token": os.environ["STOQ_API_KEY"]},
json={
"reserve": "on_fulfillment"
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.stoqapp.com/api/v2/external/preorders/offers/73a74948-2b57-4cc3-971f-2b441828c977/inventory")
req = Net::HTTP::Patch.new(uri, "X-Auth-Token" => ENV["STOQ_API_KEY"], "Content-Type" => "application/json")
req.body = {
reserve: "on_fulfillment"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body){
"stock_condition": "out_of_stock",
"reserve": "on_fulfillment"
}{
"errors": [
"Invalid API key"
],
"code": "auth_invalid",
"details": [
{
"code": "auth_invalid",
"message": "Invalid API key",
"path": null,
"value": null,
"expected": null
}
]
}{
"errors": [
"Offer not found"
],
"code": "not_found",
"details": [
{
"code": "not_found",
"message": "Offer not found",
"path": null,
"value": null,
"expected": null
}
]
}{
"errors": [
"A request with this Idempotency-Key is still running"
],
"code": "idempotency_key_in_progress",
"details": [
{
"code": "idempotency_key_in_progress",
"message": "A request with this Idempotency-Key is still running",
"path": null,
"value": null,
"expected": null
}
]
}{
"errors": [
"widget.button.text_color must be a hex color"
],
"code": "invalid_params",
"details": [
{
"code": "invalid_params",
"message": "must be a hex color",
"path": "widget.button.text_color",
"value": "blue",
"expected": {
"type": "string"
}
}
]
}{
"errors": [
"Rate limit exceeded"
],
"code": "rate_limited",
"details": [
{
"code": "rate_limited",
"message": "Rate limit exceeded",
"path": null,
"value": null,
"expected": null
}
]
}