Send confirmation test
API v2 is in public beta: endpoints and fields can change before general availability. See the changelog
/preorders/templates/confirmation/send_testCosts 2 rate-limit points · Rate limits
Send the preorder confirmation email to one email address as a test, rendered in the body locale (omit it for the shop default language) against one of the shop's own preorder offer products. Matches the preorder template page's Send test email button.
email defaults to the shop's reply-to address; one address only. offer_id (from GET /preorders/offers) and shopify_variant_id (a ProductVariant gid) pick the offer and product shown; omit both for the first product of the first enabled offer. Fails (422) when email sending is turned off, when the shop has no product in a preorder offer, or when the variant is not in the offer; 404 when the offer is not found or the shop has no single preorder confirmation template.
Also searched assend test preorder emailsend a test preorder confirmationpreview the preorder email in my inbox
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
localestringExample:fremailstring, nullableExample:shopper@example.comoffer_idstring, nullableExample:stringshopify_variant_idstring, nullableExample:45000000001
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.
The request failed validation.
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 POST "https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation/send_test" \
-H "X-Auth-Token: $STOQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"locale": "fr",
"email": "shopper@example.com",
"offer_id": "string",
"shopify_variant_id": "45000000001"
}'const res = await fetch("https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation/send_test", {
method: "POST",
headers: {
"X-Auth-Token": process.env.STOQ_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"locale": "fr",
"email": "shopper@example.com",
"offer_id": "string",
"shopify_variant_id": "45000000001"
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation/send_test",
headers={"X-Auth-Token": os.environ["STOQ_API_KEY"]},
json={
"locale": "fr",
"email": "shopper@example.com",
"offer_id": "string",
"shopify_variant_id": "45000000001"
},
)
data = res.json()require "net/http"
require "json"
uri = URI("https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation/send_test")
req = Net::HTTP::Post.new(uri, "X-Auth-Token" => ENV["STOQ_API_KEY"], "Content-Type" => "application/json")
req.body = {
locale: "fr",
email: "shopper@example.com",
offer_id: "string",
shopify_variant_id: "45000000001"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body){
"job_id": "job_a1b2c3",
"status_url": "/api/v2/external/jobs/job_a1b2c3"
}{
"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": [
"name is required"
],
"code": "validation_failed",
"details": [
{
"code": "validation_failed",
"message": "name is required",
"path": null,
"value": null,
"expected": null
}
]
}{
"errors": [
"Rate limit exceeded"
],
"code": "rate_limited",
"details": [
{
"code": "rate_limited",
"message": "Rate limit exceeded",
"path": null,
"value": null,
"expected": null
}
]
}