Update shipping (PATCH /preorders/templates/shipping_update)
API v2 is in public beta: endpoints and fields can change before general availability. See the changelog
/preorders/templates/shipping_updateCosts 2 rate-limit points · Rate limits
Update the shipping-update email STOQ sends when a preorder ships late or its date changes: its subject, heading, body and optional Klaviyo flow. The body is the GET shape, email{...}; an optional body locale writes the copy in that language only (omit it for the shop default).
Deep partial: absent fields are unchanged, unknown or read-only keys are rejected. Errors are 422 keyed "template.<path>". Returns the template.
Also searched aschange shipping update email
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
emailobjectShow 4 child attributesHide child attributes
subjectstringEmail subject of the shipping-update email. Liquid variables such as {{order.name}} work.
headingstringHeading at the top of the shipping-update email.
bodystringMessage body of the shipping-update email.
klaviyo_flow_namestringKlaviyo flow to trigger for the shipping update instead of sending it here. Only used while the email platform is Klaviyo.
localestringLanguage the translated fields are written in, such as 'fr' or 'pt-BR'. Omitted: the shop's default language. Untranslated fields ignore it.
Errors
Missing or invalid X-Auth-Token.
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/templates/shipping_update" \
-H "X-Auth-Token: $STOQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": {
"subject": "string",
"heading": "string",
"body": "string",
"klaviyo_flow_name": "Summer Sneaker Drop"
},
"locale": "fr"
}'const res = await fetch("https://app.stoqapp.com/api/v2/external/preorders/templates/shipping_update", {
method: "PATCH",
headers: {
"X-Auth-Token": process.env.STOQ_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"email": {
"subject": "string",
"heading": "string",
"body": "string",
"klaviyo_flow_name": "Summer Sneaker Drop"
},
"locale": "fr"
}),
});
const data = await res.json();import os
import requests
res = requests.patch(
"https://app.stoqapp.com/api/v2/external/preorders/templates/shipping_update",
headers={"X-Auth-Token": os.environ["STOQ_API_KEY"]},
json={
"email": {
"subject": "string",
"heading": "string",
"body": "string",
"klaviyo_flow_name": "Summer Sneaker Drop"
},
"locale": "fr"
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.stoqapp.com/api/v2/external/preorders/templates/shipping_update")
req = Net::HTTP::Patch.new(uri, "X-Auth-Token" => ENV["STOQ_API_KEY"], "Content-Type" => "application/json")
req.body = {
email: {
subject: "string",
heading: "string",
body: "string",
klaviyo_flow_name: "Summer Sneaker Drop"
},
locale: "fr"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body){
"errors": [
"Invalid API key"
],
"code": "auth_invalid",
"details": [
{
"code": "auth_invalid",
"message": "Invalid API key",
"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
}
]
}