Merchant execution
Use the signup flow when you are evaluating catalog, payments, and storefront rollout.
Start a storeDeveloper docs
Public reference for ReTale integrators: generated OpenAPI operations, TypeScript client usage, checkout-safe idempotency, pagination, error envelopes, tenant scoping, and generated storefront boundaries.
Start at the quickstart, then verify the same contracts in API reference before wiring storefront actions.
Entry points
Use the signup flow when you are evaluating catalog, payments, and storefront rollout.
Start a storeRead install and usage steps for both public catalog + merchant-scoped calls.
Jump to quickstartOpen trust, security, and policy pages for public statements before procurement or legal review.
View trust postureSDK quickstart
npm install @retale/api-client @retale/commerce-sdkUse @retale/api-client for typed REST calls and @retale/commerce-sdk for generated storefront commerce surfaces.
import { createRetaleClient } from "@retale/api-client";
import { createCommerceSdk } from "@retale/commerce-sdk";
const api = createRetaleClient({
baseUrl: process.env.NEXT_PUBLIC_RETALE_API_URL ?? "http://localhost:4100/api/v1",
publishableKey: process.env.NEXT_PUBLIC_RETALE_PUBLISHABLE_KEY
});
export const commerce = createCommerceSdk(api);Local examples target http://localhost:4100/api/v1. Public storefront calls scope by storeSlug; merchant calls scope by storeId plus a merchant session token.
import { ApiClientError } from "@retale/api-client";
try {
const checkout = await commerce.checkout.create({
storeSlug: "demo-store",
cartId: "cart_123",
idempotencyKey: "checkout-cart_123-attempt_1"
});
await commerce.checkout.initiateGatewayPayment({
storeSlug: "demo-store",
checkoutId: checkout.id,
returnUrl: "http://localhost:4102/checkout/return",
cancelUrl: "http://localhost:4102/cart",
idempotencyKey: "payment-session-cart_123-attempt_1"
});
} catch (error) {
if (error instanceof ApiClientError) {
console.error(error.status, error.code, error.requestId, error.details);
}
throw error;
}Retryable cart, checkout, payment, loyalty, and order mutations should pass a stable idempotencyKey. Non-2xx responses throw ApiClientError with status, code, message, requestId, and optional details.
const page = await api.listProducts("demo-store", {
limit: 24,
offset: 48,
sort: "best_selling"
});
console.log(page.items, page.limit, page.offset, page.total);List endpoints return items, limit, offset, and total. Keep UI paging state explicit so generated storefronts can render stable catalog and review views.
Generated from OpenAPI
This operation index is generated from openapi/v1.yaml. Run npm run developer-docs:check to verify the checked-in docs artifact still matches the OpenAPI contract.
Slug-scoped catalog, cart, checkout, account, content, loyalty, membership, and review endpoints.
/stores/{storeSlug}/account/addressesstoreSlugpathrequiredstring200Saved customer addressesCustomerAddress[]/stores/{storeSlug}/account/addressesstoreSlugpathrequiredstringRequired: CustomerAddressRequest
201Address savedCustomerAddress/stores/{storeSlug}/account/addresses/{addressId}storeSlugpathrequiredstringaddressIdpathrequiredstringRequired: CustomerAddressPatchRequest
200Address updatedCustomerAddress/stores/{storeSlug}/account/addresses/{addressId}storeSlugpathrequiredstringaddressIdpathrequiredstring204Address deleted/stores/{storeSlug}/account/content-commentsstoreSlugpathrequiredstringRequired: ContentCommentSubmissionRequest
201Content comment submittedContentComment/stores/{storeSlug}/account/loginstoreSlugpathrequiredstringRequired: CustomerLoginRequest
200Customer session createdCustomerSessionResponse/stores/{storeSlug}/account/logoutstoreSlugpathrequiredstring204Customer session revoked401Missing or invalid customer sessionErrorResponse/stores/{storeSlug}/account/loyaltystoreSlugpathrequiredstring200Loyalty account projectionLoyaltyAccount/stores/{storeSlug}/account/loyalty/ledgerstoreSlugpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Loyalty ledger entriesLoyaltyLedgerListResponse/stores/{storeSlug}/account/marketing-consentstoreSlugpathrequiredstringRequired: CustomerMarketingConsentRequest
200Updated customer profileCustomer/stores/{storeSlug}/account/mestoreSlugpathrequiredstring200Current customer profileCustomer401Missing or invalid customer sessionErrorResponse/stores/{storeSlug}/account/mestoreSlugpathrequiredstringRequired: CustomerProfilePatchRequest
200Updated customer profileCustomer401Missing or invalid customer sessionErrorResponse/stores/{storeSlug}/account/membership-billing-subscriptions/{membershipBillingSubscriptionId}/plan/{membershipPlanId}storeSlugpathrequiredstringmembershipBillingSubscriptionIdpathrequiredstringmembershipPlanIdpathrequiredstringOptional: MembershipSubscriptionChangeRequest
200Membership plan changed and proration recorded when applicableMembershipBillingPlanChangeResponse/stores/{storeSlug}/account/membershipsstoreSlugpathrequiredstring200Customer membershipsCustomerMembership[]/stores/{storeSlug}/account/memberships/{customerMembershipId}/cancelstoreSlugpathrequiredstringcustomerMembershipIdpathrequiredstringOptional: object
200Customer membership cancelledCustomerMembership/stores/{storeSlug}/account/memberships/{membershipPlanId}/joinstoreSlugpathrequiredstringmembershipPlanIdpathrequiredstringOptional: CustomerMembershipJoinRequest
200Customer membershipCustomerMembership/stores/{storeSlug}/account/memberships/{membershipPlanId}/subscriptionsstoreSlugpathrequiredstringmembershipPlanIdpathrequiredstringRequired: MembershipSubscriptionCreateRequest
201Membership and recurring billing subscription createdMembershipBillingSubscriptionResponse409Gateway, membership, or payment source is not in a subscribable stateErrorResponse/stores/{storeSlug}/account/ordersstoreSlugpathrequiredstringcustomerIdqueryoptionalstringemailqueryoptionalstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Customer-scoped order historyOrderListResponse/stores/{storeSlug}/account/password-resetstoreSlugpathrequiredstringRequired: CustomerPasswordResetRequest
202Password reset request acceptedobject/stores/{storeSlug}/account/password-reset/completestoreSlugpathrequiredstringRequired: CustomerPasswordResetCompleteRequest
204Password reset completed/stores/{storeSlug}/account/payment-methodsstoreSlugpathrequiredstring200Tokenized payment methodsCustomerPaymentMethod[]/stores/{storeSlug}/account/payment-methodsstoreSlugpathrequiredstringRequired: CustomerPaymentMethodRequest
201Payment method savedCustomerPaymentMethod/stores/{storeSlug}/account/payment-methods/{paymentMethodId}storeSlugpathrequiredstringpaymentMethodIdpathrequiredstring204Payment method deleted/stores/{storeSlug}/account/reviewsstoreSlugpathrequiredstringRequired: ProductReviewSubmissionRequest
201Review submitted for moderation or rejected by abuse controlsProductReview409Purchase verification, duplicate, or abuse limit failedErrorResponse/stores/{storeSlug}/account/signupstoreSlugpathrequiredstringRequired: CustomerSignupRequest
201Customer account and session createdCustomerSessionResponse/stores/{storeSlug}/cart-recoveriesstoreSlugpathrequiredstringRequired: object
200The cart, restoredCartReopenResult/stores/{storeSlug}/cartsstoreSlugpathrequiredstringIdempotency-KeyheaderrequiredstringOptional: CartCreateRequest
201Cart created or idempotently returnedCart/stores/{storeSlug}/carts/{cartId}storeSlugpathrequiredstringcartIdpathrequiredstring200Cart detailCart404Cart not found in this storeErrorResponse/stores/{storeSlug}/carts/{cartId}/checkoutstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringOptional: CheckoutCreateRequest
201Checkout created with inventory reservedCheckoutSession409Cart expired or inventory unavailableErrorResponse/stores/{storeSlug}/carts/{cartId}/customerstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: CheckoutCustomer
200Customer context attachedCart/stores/{storeSlug}/carts/{cartId}/customer/addressesstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: AttachCustomerAddressToCartRequest
200Saved addresses attached to cart customer contextCart/stores/{storeSlug}/carts/{cartId}/discountsstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: CartDiscountRequest
200Discount appliedCart/stores/{storeSlug}/carts/{cartId}/discounts/{code}storeSlugpathrequiredstringcartIdpathrequiredstringcodepathrequiredstringIdempotency-Keyheaderrequiredstring200Code removed and totals recalculatedCart/stores/{storeSlug}/carts/{cartId}/linesstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: CartLineAddRequest
200Cart updatedCart/stores/{storeSlug}/carts/{cartId}/lines/{lineId}storeSlugpathrequiredstringcartIdpathrequiredstringlineIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: CartLineUpdateRequest
200Cart line updatedCart/stores/{storeSlug}/carts/{cartId}/lines/{lineId}storeSlugpathrequiredstringcartIdpathrequiredstringlineIdpathrequiredstringIdempotency-Keyheaderrequiredstring200Cart line removedCart/stores/{storeSlug}/carts/{cartId}/loyalty-redemptionsstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: LoyaltyRedemptionRequest
201Loyalty redemption reserved for checkoutLoyaltyRedemptionResponse/stores/{storeSlug}/carts/{cartId}/membership-perksstoreSlugpathrequiredstringcartIdpathrequiredstring200Membership perks applicable to the cartMembershipPerkEvaluation/stores/{storeSlug}/carts/{cartId}/reopenstoreSlugpathrequiredstringcartIdpathrequiredstring200The cart, open againCartReopenResult/stores/{storeSlug}/carts/{cartId}/shippingstoreSlugpathrequiredstringcartIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: CartShippingSelectionRequest
200Shipping selectedCart/stores/{storeSlug}/carts/{cartId}/shipping-optionsstoreSlugpathrequiredstringcartIdpathrequiredstring200Shipping optionsCartShippingOptionList/stores/{storeSlug}/catalogstoreSlugpathrequiredstring200Store catalog responsePublicCatalogResponse404Store not foundErrorResponse/stores/{storeSlug}/checkouts/{checkoutId}storeSlugpathrequiredstringcheckoutIdpathrequiredstring200Checkout session detailCheckoutSession404Checkout session not found in this storeErrorResponse/stores/{storeSlug}/checkouts/{checkoutId}/age-checkstoreSlugpathrequiredstringcheckoutIdpathrequiredstring200The checkout's age checkStorefrontAgeCheck/stores/{storeSlug}/checkouts/{checkoutId}/age-checkstoreSlugpathrequiredstringcheckoutIdpathrequiredstringRequired: object
200The checkout's age check, after checkingStorefrontAgeCheck503The age check couldn't be made; nothing can be paid until it isErrorResponse/stores/{storeSlug}/checkouts/{checkoutId}/orderstoreSlugpathrequiredstringcheckoutIdpathrequiredstringIdempotency-KeyheaderrequiredstringOptional: OrderFinalizeRequest
201Order created, checkout completed, and inventory committedOrderFinalizationResponse/stores/{storeSlug}/checkouts/{checkoutId}/payment-statusstoreSlugpathrequiredstringcheckoutIdpathrequiredstring200Payment progressCardPaymentProgress/stores/{storeSlug}/checkouts/{checkoutId}/payments/cardstoreSlugpathrequiredstringcheckoutIdpathrequiredstring200What the Payment Element needsCardPaymentStart409The store is not taking card payments right nowErrorResponse/stores/{storeSlug}/checkouts/{checkoutId}/payments/card/authorize-netstoreSlugpathrequiredstringcheckoutIdpathrequiredstringRequired: object
200How the payment wentAuthorizeNetPaymentOutcome400The token is missing or not an Accept.js tokenErrorResponse409The store is not taking card payments through Authorize.netErrorResponse/stores/{storeSlug}/checkouts/{checkoutId}/payments/confirmstoreSlugpathrequiredstringcheckoutIdpathrequiredstringIdempotency-KeyheaderrequiredstringRequired: GatewayCheckoutPaymentConfirmRequest
200Payment authorization resultGatewayCheckoutPaymentConfirmResponse/stores/{storeSlug}/checkouts/{checkoutId}/payments/sessionstoreSlugpathrequiredstringcheckoutIdpathrequiredstringIdempotency-KeyheaderrequiredstringOptional: GatewayCheckoutPaymentSessionRequest
200Gateway payment session createdGatewayCheckoutPaymentSessionResponse/stores/{storeSlug}/collectionsstoreSlugpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalintegerqqueryoptionalstringsortqueryoptionalPublicCollectionSortOrder200Published collections visible to generated storefrontsPublicCollectionListResponse404Store not foundErrorResponse/stores/{storeSlug}/collections/{handle}storeSlugpathrequiredstringhandlepathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalintegerqqueryoptionalstringvendorqueryoptionalstringbrandqueryoptionalstringtagqueryoptionalstring[]minPricequeryoptionalstringmaxPricequeryoptionalstringsortqueryoptionalstring | PublicProductSortOrderfilterqueryoptionalobject200Collection metadata and visible productsPublicCollectionProductsResponse404Collection not found or unpublishedErrorResponse/stores/{storeSlug}/contentstoreSlugpathrequiredstringtypequeryoptionalContentEntryTypetagqueryoptionalstringcategoryqueryoptionalstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Published content entries visible to generated storefrontsPublicContentEntryListResponse/stores/{storeSlug}/content/{entryId}/commentsstoreSlugpathrequiredstringentryIdpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Approved content commentsPublicContentCommentListResponse/stores/{storeSlug}/content/{type}/{slug}storeSlugpathrequiredstringtypepathrequiredContentEntryTypeslugpathrequiredstring200Published content entryPublicContentEntry404Content not found or not yet publishedErrorResponse/stores/{storeSlug}/filtersstoreSlugpathrequiredstring200The filterable fieldsobject/stores/{storeSlug}/guestsstoreSlugpathrequiredstringRequired: GuestIdentityCreateRequest
201Guest identity createdGuestIdentity/stores/{storeSlug}/guests/{guestId}/convertstoreSlugpathrequiredstringguestIdpathrequiredstringRequired: GuestConvertRequest
201Guest converted to a customer account and sessionCustomerSessionResponse/stores/{storeSlug}/headstoreSlugpathrequiredstring200The store's headobject404Store not foundErrorResponse/stores/{storeSlug}/indexnow-keystoreSlugpathrequiredstring200The keyobject404Store not foundErrorResponse/stores/{storeSlug}/invoices/paystoreSlugpathrequiredstringRequired: DraftInvoiceToken
200The checkout to payobject/stores/{storeSlug}/invoices/viewstoreSlugpathrequiredstringRequired: DraftInvoiceToken
200The draft, as agreedDraftInvoice/stores/{storeSlug}/marketing/unsubscribestoreSlugpathrequiredstringRequired: StorefrontMarketingUnsubscribeRequest
200Marketing opt-out recordedMarketingOptOutResponse/stores/{storeSlug}/memberships/accessstoreSlugpathrequiredstringRequired: MembershipAccessCheckRequest
200Membership access decisionMembershipAccessDecision/stores/{storeSlug}/menus/{handle}storeSlugpathrequiredstringhandlepathrequiredstring200The menuPublicMenu404No menu with this handleErrorResponse/stores/{storeSlug}/orders/{orderId}storeSlugpathrequiredstringorderIdpathrequiredstringemailqueryoptionalstring200Order detailOrder404Order not found for this store, or not owned by the requesting customer/guestErrorResponse/stores/{storeSlug}/pages/{handle}storeSlugpathrequiredstringhandlepathrequiredstring200The pagePublicStorePage404No such pageErrorResponse/stores/{storeSlug}/productsstoreSlugpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalintegerqqueryoptionalstringvendorqueryoptionalstringbrandqueryoptionalstringtagqueryoptionalstring[]minPricequeryoptionalstringmaxPricequeryoptionalstringsortqueryoptionalPublicProductSortOrdercollectionqueryoptionalstringwherequeryoptionalstring[]200Published products visible to generated storefrontsPublicProductListResponse404Store not foundErrorResponse/stores/{storeSlug}/products/{handle}storeSlugpathrequiredstringhandlepathrequiredstring200Published product detailPublicProduct404Product not found or unpublishedErrorResponse/stores/{storeSlug}/products/{handle}/relatedstoreSlugpathrequiredstringhandlepathrequiredstringlimitqueryoptionalinteger200Related products; empty when the product is in no published collectionobject404Product not found or unpublishedErrorResponse/stores/{storeSlug}/products/{handle}/reviewsstoreSlugpathrequiredstringhandlepathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Approved product reviews visible to the storefrontPublicProductReviewListResponse/stores/{storeSlug}/products/{handle}/reviews/summarystoreSlugpathrequiredstringhandlepathrequiredstring200Product review aggregateProductReviewSummary/stores/{storeSlug}/purchasingstoreSlugpathrequiredstring200Purchasing availabilityStorePurchasing/stores/{storeSlug}/redirectsstoreSlugpathrequiredstringpathqueryrequiredstring200The redirectobject404No redirect from that pathErrorResponse/stores/{storeSlug}/resolve-pathstoreSlugpathrequiredstringpathqueryrequiredstringsearchqueryoptionalstringreferrerqueryoptionalstring200The decisionobject/stores/{storeSlug}/robots.txtstoreSlugpathrequiredstring200Robots directives404Store not foundErrorResponse/stores/{storeSlug}/sitemap.xmlstoreSlugpathrequiredstring200XML sitemap404Store not foundErrorResponse/stores/{storeSlug}/sitemaps/{kind}storeSlugpathrequiredstringkindpathrequiredstring200XML sitemap (urlset)404Store or sitemap kind not foundErrorResponse/stores/{storeSlug}/tax-displaystoreSlugpathrequiredstring200Storefront tax display modeStorefrontTaxDisplaySettings404Store not foundErrorResponseStore ID-scoped operations for catalog, inventory, orders, settings, generation, and growth workflows.
/merchant/invitations/acceptRequired: AcceptStaffInvitationRequest
200Active store context and permissionsResolvedMerchantAccess401Missing session or invalid invitation tokenErrorResponse/merchant/legal-acceptance200Each document's current version and what the merchant last agreed toLegalAcceptanceStatus/merchant/legal-acceptanceRequired: LegalVersions
200Recorded, with the version and the timeLegalAcceptanceStatus400Missing, or not the current version (LEGAL_ACCEPTANCE_REQUIRED / LEGAL_VERSION_OUTDATED)ErrorResponse/merchant/loginRequired: MerchantLoginRequest
200Merchant session createdMerchantSessionResponse401Invalid merchant credentialsErrorResponse403Merchant cannot access requested active storeErrorResponse/merchant/logout204Merchant session revoked401Missing or invalid merchant sessionErrorResponse/merchant/oauth/{provider}/callbackproviderpathrequiredstringRequired: MerchantOAuthCallbackRequest
200Merchant session createdMerchantOAuthSessionResponse400The provider did not vouch for an email addressErrorResponse401The code or ID token could not be verifiedErrorResponse409An email/password account already holds this addressErrorResponse/merchant/oauth/{provider}/startproviderpathrequiredstring200Authorization URL for the providerMerchantOAuthStartResponse404Provider is not configuredErrorResponse/merchant/oauth/providers200Configured providersMerchantOAuthProvidersResponse/merchant/onboardingRequired: CompleteOnboardingRequest
201Initialized store and active owner contextOnboardingResponse400Invalid onboarding requestErrorResponse/merchant/onboarding/classifyRequired: ClassifyOnboardingDescriptionRequest
200The guess, in plain words, with the merchant's own words behind itOnboardingClassificationResponse429Too many classification requestsErrorResponse/merchant/onboarding/draft200The carried answer, or nullOnboardingDraftResponse/merchant/onboarding/draftsRequired: CreateOnboardingDraftRequest
201Draft parkedOnboardingDraftCreatedResponse400Empty answerErrorResponse429Too many drafts from this clientErrorResponse/merchant/onboarding/drafts/claimRequired: ClaimOnboardingDraftRequest
200The carried answer, or nullOnboardingDraftResponse/merchant/onboarding/progress200The merchant's onboarding progressOnboardingProgressResponse/merchant/onboarding/progress/buildingRequired: OnboardingBuildRequest
200The saved progressOnboardingProgressResponse400An answer that cannot be usedErrorResponse409An earlier step is not done yet, or the store already existsErrorResponse/merchant/onboarding/progress/business-typeRequired: OnboardingBusinessTypeRequest
200The saved progressOnboardingProgressResponse400An answer that cannot be usedErrorResponse409An earlier step is not done yet, or the store already existsErrorResponse/merchant/onboarding/progress/completeRequired: object
201The store that was created, or the one already createdobject409A step is not done yetErrorResponse/merchant/onboarding/progress/descriptionRequired: OnboardingDescriptionRequest
200The saved progressOnboardingProgressResponse400An answer that cannot be usedErrorResponse409An earlier step is not done yet, or the store already existsErrorResponse/merchant/onboarding/progress/detailsRequired: OnboardingDetailsRequest
200The saved progressOnboardingProgressResponse400An answer that cannot be usedErrorResponse409An earlier step is not done yet, or the store already existsErrorResponse/merchant/onboarding/progress/featuresRequired: OnboardingFeaturesRequest
200The saved progressOnboardingProgressResponse400An answer that cannot be usedErrorResponse409An earlier step is not done yet, or the store already existsErrorResponse/merchant/password-reset/completeRequired: PasswordResetCompleteRequest
204Merchant password reset completed401Password reset token is invalid or expiredErrorResponse/merchant/password-reset/requestRequired: PasswordResetRequest
202Password reset request acceptedPasswordResetRequestResponse400Invalid password reset requestErrorResponse/merchant/signupRequired: MerchantSignupRequest
201Merchant account and session createdMerchantSessionResponse400Invalid signup requestErrorResponse/merchant/stores200Store switcher options for the merchantStoreSwitcherResponse401Missing or invalid merchant sessionErrorResponse/merchant/stores/{storeId}/abandoned-checkoutsstoreIdpathrequiredstring200The abandoned checkoutsobject/merchant/stores/{storeId}/abandoned-checkouts/{cartId}storeIdpathrequiredstringcartIdpathrequiredstring200The cart at the prices the shopper was offeredAbandonedCheckoutDetail/merchant/stores/{storeId}/ai-providersstoreIdpathrequiredstring200Masked AI provider keys for the active tenantAiProviderKeysResponse403Merchant role cannot view store settingsErrorResponse/merchant/stores/{storeId}/ai-providers/{provider}storeIdpathrequiredstringproviderpathrequiredAiProviderIdRequired: AiProviderKeyRequest
200Masked AI provider keys after the saveAiProviderKeysResponse400The key, model, or address was rejectedErrorResponse403Merchant role cannot update store settingsErrorResponse/merchant/stores/{storeId}/ai-providers/{provider}storeIdpathrequiredstringproviderpathrequiredAiProviderId200Masked AI provider keys after the removalAiProviderKeysResponse400No key was saved for that providerErrorResponse403Merchant role cannot update store settingsErrorResponse/merchant/stores/{storeId}/ai-providers/{provider}/checkstoreIdpathrequiredstringproviderpathrequiredAiProviderId200The outcome of the check, plus the refreshed masked listAiProviderKeyCheckResponse403Merchant role cannot update store settingsErrorResponse/merchant/stores/{storeId}/audit-eventsstoreIdpathrequiredstringactorUserIdqueryoptionalstringresourceTypequeryoptionalstringresourceIdqueryoptionalstringactionqueryoptionalstringoccurredFromqueryoptionalstringoccurredToqueryoptionalstringlimitqueryoptionalinteger200Tenant-scoped audit event historyAuditEventListResponse403Merchant role cannot view audit historyErrorResponse/merchant/stores/{storeId}/bookingsstoreIdpathrequiredstring200DoneBookingsWorkspace400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/appointmentsstoreIdpathrequiredstring200Doneobject400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/appointmentsstoreIdpathrequiredstringRequired: object
201DoneAppointment400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/appointments/{appointmentId}storeIdpathrequiredstringappointmentIdpathrequiredstring200DoneAppointment400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/appointments/{appointmentId}storeIdpathrequiredstringappointmentIdpathrequiredstringRequired: object
200DoneAppointment400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/appointments/{appointmentId}/on-the-waystoreIdpathrequiredstringappointmentIdpathrequiredstring200Doneobject400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/messages/{kind}storeIdpathrequiredstringkindpathrequiredstringRequired: object
200Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/rulesstoreIdpathrequiredstringRequired: object
200Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/servicesstoreIdpathrequiredstringRequired: object
201Doneobject400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/services/{serviceId}storeIdpathrequiredstringserviceIdpathrequiredstringRequired: object
200Doneobject400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/services/{serviceId}storeIdpathrequiredstringserviceIdpathrequiredstring204Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/services/{serviceId}/archivestoreIdpathrequiredstringserviceIdpathrequiredstringRequired: object
200Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/staff/{staffUserId}/availabilitystoreIdpathrequiredstringstaffUserIdpathrequiredstringRequired: object
200Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/staff/{staffUserId}/time-offstoreIdpathrequiredstringstaffUserIdpathrequiredstringRequired: object
201Doneobject400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/bookings/time-off/{timeOffId}storeIdpathrequiredstringtimeOffIdpathrequiredstring204Done400Not accepted, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/business-profilestoreIdpathrequiredstring200Store business profileStoreBusinessProfile/merchant/stores/{storeId}/business-profilestoreIdpathrequiredstringRequired: StoreBusinessProfileRequest
200Business profile savedStoreBusinessProfile400A value that cannot be storedErrorResponse/merchant/stores/{storeId}/business-profile/completestoreIdpathrequiredstringRequired: StoreBusinessProfileRequest
200Business profile completeStoreBusinessProfile400One or more fields need another lookErrorResponse/merchant/stores/{storeId}/collectionsstoreIdpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Tenant-scoped admin collectionsAdminCollectionListResponse/merchant/stores/{storeId}/collectionsstoreIdpathrequiredstringRequired: CollectionCreateRequest
201Collection created and audit event writtenCollectionMutationResponse/merchant/stores/{storeId}/collections/{collectionId}storeIdpathrequiredstringcollectionIdpathrequiredstring200The collection404Not this store's collectionErrorResponse/merchant/stores/{storeId}/collections/{collectionId}storeIdpathrequiredstringcollectionIdpathrequiredstringRequired: CollectionUpdateRequest
200Collection updated and audit event writtenCollectionMutationResponse/merchant/stores/{storeId}/collections/{collectionId}storeIdpathrequiredstringcollectionIdpathrequiredstring200Deleted, with the menus it was removed fromobject/merchant/stores/{storeId}/collections/{collectionId}/archivestoreIdpathrequiredstringcollectionIdpathrequiredstring200Collection archived and audit event writtenCollectionMutationResponse/merchant/stores/{storeId}/collections/{collectionId}/filtersstoreIdpathrequiredstringcollectionIdpathrequiredstring200The filtersobject/merchant/stores/{storeId}/collections/{collectionId}/filtersstoreIdpathrequiredstringcollectionIdpathrequiredstringRequired: object
200The filtersobject/merchant/stores/{storeId}/collections/{collectionId}/productsstoreIdpathrequiredstringcollectionIdpathrequiredstringRequired: CollectionProductsReplaceRequest
200Collection membership replaced and audit event writtenCollectionRefreshResponse/merchant/stores/{storeId}/collections/{collectionId}/promote-filtered-viewstoreIdpathrequiredstringcollectionIdpathrequiredstringRequired: object
201The filtersobject/merchant/stores/{storeId}/collections/{collectionId}/refreshstoreIdpathrequiredstringcollectionIdpathrequiredstring200Rule collection refreshed and audit event written when membership changedCollectionRefreshResponse/merchant/stores/{storeId}/collections/previewstoreIdpathrequiredstringRequired: CollectionRuleSet
200Product-level rule preview resultsCollectionRulePreviewResponse/merchant/stores/{storeId}/collections/refreshstoreIdpathrequiredstring200How many smart collections were re-run, and how many changedobject403The signed-in user may not change the catalogueErrorResponse/merchant/stores/{storeId}/contentstoreIdpathrequiredstringtypequeryoptionalContentEntryTypestatusqueryoptionalContentEntryStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Merchant content entriesContentEntryListResponse/merchant/stores/{storeId}/contentstoreIdpathrequiredstringRequired: ContentEntryRequest
201Content entry createdContentEntryMutationResponse/merchant/stores/{storeId}/content-commentsstoreIdpathrequiredstringentryIdqueryoptionalstringstatusqueryoptionalContentCommentStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Content commentsContentCommentListResponse/merchant/stores/{storeId}/content-comments/{commentId}/moderatestoreIdpathrequiredstringcommentIdpathrequiredstringRequired: ContentCommentModerationRequest
200Content comment moderatedContentCommentMutationResponse/merchant/stores/{storeId}/content/{entryId}storeIdpathrequiredstringentryIdpathrequiredstringRequired: ContentEntryRequest
200Content entry updatedContentEntryMutationResponse/merchant/stores/{storeId}/customer-segmentsstoreIdpathrequiredstringstatusqueryoptionalCustomerSegmentStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Customer segment listCustomerSegmentListResponse/merchant/stores/{storeId}/customer-segmentsstoreIdpathrequiredstringRequired: CustomerSegmentRequest
201Customer segment createdCustomerSegment/merchant/stores/{storeId}/customer-segments/{segmentId}storeIdpathrequiredstringsegmentIdpathrequiredstringRequired: CustomerSegmentPatchRequest
200Customer segment updatedCustomerSegment/merchant/stores/{storeId}/customer-segments/{segmentId}storeIdpathrequiredstringsegmentIdpathrequiredstring204Customer segment deleted/merchant/stores/{storeId}/customer-segments/{segmentId}/customersstoreIdpathrequiredstringsegmentIdpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Matching customers with reasonsCustomerSegmentPreviewResponse/merchant/stores/{storeId}/customer-segments/previewstoreIdpathrequiredstringRequired: CustomerSegmentPreviewRequest
200Segment preview with customer match reasonsCustomerSegmentPreviewResponse/merchant/stores/{storeId}/customers/{customerId}/loyalty-adjustmentsstoreIdpathrequiredstringcustomerIdpathrequiredstringRequired: LoyaltyAdjustmentRequest
200Loyalty account adjustedLoyaltyMutationResponse/merchant/stores/{storeId}/customers/{customerId}/loyalty-bonusesstoreIdpathrequiredstringcustomerIdpathrequiredstringRequired: LoyaltyBonusRequest
200Loyalty bonus issued or idempotently returnedLoyaltyMutationResponse/merchant/stores/{storeId}/discountsstoreIdpathrequiredstringstatusqueryoptionalDiscountStatustriggerqueryoptionalDiscountTriggerlimitqueryoptionalintegeroffsetqueryoptionalinteger200Discount listDiscountListResponse/merchant/stores/{storeId}/discountsstoreIdpathrequiredstringRequired: DiscountRequest
201Discount createdDiscount/merchant/stores/{storeId}/discounts/{discountId}storeIdpathrequiredstringdiscountIdpathrequiredstring200The discountDiscount/merchant/stores/{storeId}/discounts/{discountId}storeIdpathrequiredstringdiscountIdpathrequiredstringRequired: DiscountPatchRequest
200Discount updatedDiscount/merchant/stores/{storeId}/discounts/{discountId}storeIdpathrequiredstringdiscountIdpathrequiredstring204Discount deleted409NOR-914. The discount has been used, so it can't be deleted; disable it instead. Orders that used it still name it.ErrorResponse/merchant/stores/{storeId}/domain-setupstoreIdpathrequiredstring200Whether connecting is open here, and the domain in progress or liveCustomDomainSetup/merchant/stores/{storeId}/domain-setupstoreIdpathrequiredstringRequired: object
201Connected; the records to add come back with itCustomDomainSetup409Another store has it, this store already has one, or connecting isn't openErrorResponse/merchant/stores/{storeId}/domain-setup/{domainId}/checkstoreIdpathrequiredstringdomainIdpathrequiredstring200The domain after the checkCustomDomainSetup/merchant/stores/{storeId}/domain-setup/{domainId}/nameserversstoreIdpathrequiredstringdomainIdpathrequiredstring200The records to carry, old beside newCustomDomainSetup/merchant/stores/{storeId}/domain-setup/{domainId}/nameservers/confirmstoreIdpathrequiredstringdomainIdpathrequiredstringRequired: object
200Carried; the nameservers are in `domain.nameserverPlan.nameservers`CustomDomainSetup409The move would drop mail, or wasn't confirmedErrorResponse/merchant/stores/{storeId}/domain-setup/{domainId}/ttlstoreIdpathrequiredstringdomainIdpathrequiredstringRequired: object
200RecordedCustomDomainSetup/merchant/stores/{storeId}/domain-setup/platform-address/checkstoreIdpathrequiredstring200The setup, with the platform address just checkedCustomDomainSetup/merchant/stores/{storeId}/domains/{domainId}/activatestoreIdpathrequiredstringdomainIdpathrequiredstring200The store is live on its domainGoLiveView409A check still failsErrorResponse/merchant/stores/{storeId}/domains/{domainId}/disablestoreIdpathrequiredstringdomainIdpathrequiredstring200Custom domain disabledDomainLifecycleResponse/merchant/stores/{storeId}/domains/{domainId}/verifystoreIdpathrequiredstringdomainIdpathrequiredstring200The domain as it stands after the checkCustomDomainSetup/merchant/stores/{storeId}/domains/customstoreIdpathrequiredstringRequired: CustomDomainIntentRequest
201Custom-domain verification intent createdCustomDomainIntentResponse409Custom domain is unavailableErrorResponse/merchant/stores/{storeId}/domains/platform-subdomainstoreIdpathrequiredstringRequired: PlatformSubdomainRequest
201Platform subdomain reservedPlatformSubdomainResponse409Platform subdomain is unavailableErrorResponse/merchant/stores/{storeId}/draft-ordersstoreIdpathrequiredstring200The draftsobject/merchant/stores/{storeId}/draft-ordersstoreIdpathrequiredstringRequired: object
201The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}storeIdpathrequiredstringdraftIdpathrequiredstring200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}storeIdpathrequiredstringdraftIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}storeIdpathrequiredstringdraftIdpathrequiredstring200Deletedobject/merchant/stores/{storeId}/draft-orders/{draftId}/convertstoreIdpathrequiredstringdraftIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/customerstoreIdpathrequiredstringdraftIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/discountsstoreIdpathrequiredstringdraftIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/discounts/{index}storeIdpathrequiredstringdraftIdpathrequiredstringindexpathrequiredinteger200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/invoicestoreIdpathrequiredstringdraftIdpathrequiredstring200The draft, with its linkDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/linesstoreIdpathrequiredstringdraftIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/lines/{lineId}storeIdpathrequiredstringdraftIdpathrequiredstringlineIdpathrequiredstringRequired: object
200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/{draftId}/lines/{lineId}storeIdpathrequiredstringdraftIdpathrequiredstringlineIdpathrequiredstring200The draft as it now standsDraftOrderView/merchant/stores/{storeId}/draft-orders/matchesstoreIdpathrequiredstringproductsqueryoptionalstringcustomersqueryoptionalstring200What matchedobject/merchant/stores/{storeId}/fulfillments/{fulfillmentId}storeIdpathrequiredstringfulfillmentIdpathrequiredstringRequired: FulfillmentTrackingUpdateRequest
200Fulfillment tracking updatedFulfillmentMutationResponse/merchant/stores/{storeId}/fulfillments/{fulfillmentId}/cancelstoreIdpathrequiredstringfulfillmentIdpathrequiredstringOptional: FulfillmentCancelRequest
200Fulfillment canceled and rollup recalculatedFulfillmentMutationResponse/merchant/stores/{storeId}/fulfillments/{fulfillmentId}/completestoreIdpathrequiredstringfulfillmentIdpathrequiredstring200Fulfillment completedFulfillmentMutationResponse/merchant/stores/{storeId}/go-livestoreIdpathrequiredstring200Every check, whether the store can go live, and the launch if it hasGoLiveView/merchant/stores/{storeId}/go-livestoreIdpathrequiredstring200LiveGoLiveView409A check still failsErrorResponse/merchant/stores/{storeId}/go-live/acknowledgementsstoreIdpathrequiredstringRequired: object
200AcknowledgedGoLiveView/merchant/stores/{storeId}/integration-requestsstoreIdpathrequiredstringRequired: object
201Logged. Nothing is promised.object/merchant/stores/{storeId}/integrationsstoreIdpathrequiredstring200Every connection, with how it is doing. No credential is ever returned.object/merchant/stores/{storeId}/integrations/{integrationId}/deliveriesstoreIdpathrequiredstringintegrationIdpathrequiredstring200The most recent deliveries, newest first, with every attemptobject/merchant/stores/{storeId}/inventory/adjustmentsstoreIdpathrequiredstringRequired: InventoryAdjustmentRequest
201Inventory adjustment applied with ledger and audit eventsInventoryAdjustmentResponse/merchant/stores/{storeId}/inventory/alertsstoreIdpathrequiredstringstatusqueryoptionalInventoryAlertStatus200Inventory alertsobject/merchant/stores/{storeId}/inventory/alerts/{alertId}/acknowledgestoreIdpathrequiredstringalertIdpathrequiredstring200Inventory alert acknowledgedInventoryAlert/merchant/stores/{storeId}/inventory/locationsstoreIdpathrequiredstring200Locationsobject/merchant/stores/{storeId}/inventory/locationsstoreIdpathrequiredstringRequired: InventoryLocationCreateRequest
201Inventory location createdInventoryLocation403Merchant role cannot write inventory dataErrorResponse/merchant/stores/{storeId}/inventory/policystoreIdpathrequiredstringRequired: InventoryPolicyRequest
200Store inventory policy updated and auditedInventoryPolicy/merchant/stores/{storeId}/inventory/reservationsstoreIdpathrequiredstringRequired: InventoryReservationRequest
201Inventory reserved for checkoutInventoryReservation409Requested inventory is unavailableErrorResponse/merchant/stores/{storeId}/inventory/reservations/{reservationId}/commitstoreIdpathrequiredstringreservationIdpathrequiredstringOptional: object
200Reservation committedInventoryReservation/merchant/stores/{storeId}/inventory/reservations/{reservationId}/releasestoreIdpathrequiredstringreservationIdpathrequiredstring200Reservation releasedInventoryReservation/merchant/stores/{storeId}/inventory/reservations/expiredstoreIdpathrequiredstring200Expired reservations releasedobject/merchant/stores/{storeId}/inventory/returnsstoreIdpathrequiredstringRequired: InventoryReturnRequest
201Inventory returned to stockobject/merchant/stores/{storeId}/inventory/variants/{variantId}/policystoreIdpathrequiredstringvariantIdpathrequiredstringRequired: InventoryPolicyRequest
200Variant inventory policy updated and auditedInventoryPolicy/merchant/stores/{storeId}/invitationsstoreIdpathrequiredstringRequired: InviteStaffRequest
201Staff invitation createdStaffInvitationResponse403Merchant role cannot invite staffErrorResponse/merchant/stores/{storeId}/lifecycle-automations/{type}storeIdpathrequiredstringtypepathrequiredLifecycleAutomationTypeRequired: LifecycleAutomationSettingsRequest
200Automation settings updatedLifecycleAutomationSettings/merchant/stores/{storeId}/lifecycle-automations/{type}/previewstoreIdpathrequiredstringtypepathrequiredLifecycleAutomationTypeRequired: LifecycleAutomationPreviewRequest
200Rendered template previewLifecycleAutomationTemplate/merchant/stores/{storeId}/lifecycle-automations/deliveriesstoreIdpathrequiredstringtypequeryoptionalLifecycleAutomationTypestatusqueryoptionalLifecycleAutomationDeliveryStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Automation delivery recordsLifecycleAutomationDeliveryListResponse/merchant/stores/{storeId}/loyalty-settingsstoreIdpathrequiredstring200Loyalty program settingsLoyaltyProgramSettings/merchant/stores/{storeId}/loyalty-settingsstoreIdpathrequiredstringRequired: LoyaltyProgramSettingsRequest
200Loyalty program settings updatedLoyaltyProgramSettings/merchant/stores/{storeId}/marketing/campaignsstoreIdpathrequiredstringstatusqueryoptionalMarketingCampaignStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Marketing campaignsMarketingCampaignListResponse/merchant/stores/{storeId}/marketing/campaignsstoreIdpathrequiredstringRequired: MarketingCampaignRequest
201Marketing campaign createdMarketingCampaign/merchant/stores/{storeId}/marketing/campaigns/{campaignId}storeIdpathrequiredstringcampaignIdpathrequiredstringRequired: MarketingCampaignRequest
200Marketing campaign updatedMarketingCampaign/merchant/stores/{storeId}/marketing/campaigns/{campaignId}/sendstoreIdpathrequiredstringcampaignIdpathrequiredstring200Campaign send resultsMarketingCampaignSendResponse/merchant/stores/{storeId}/marketing/campaigns/send-duestoreIdpathrequiredstring200Due campaign send resultsMarketingCampaignSendResponse[]/merchant/stores/{storeId}/marketing/consentsstoreIdpathrequiredstringRequired: MarketingConsentRequest
200Consent updatedMarketingConsentMutationResponse/merchant/stores/{storeId}/marketing/opt-outsstoreIdpathrequiredstringRequired: MarketingOptOutRequest
200Suppression recordedMarketingOptOutResponse/merchant/stores/{storeId}/media/upload-settingsstoreIdpathrequiredstring200Upload settingsMediaUploadSettings/merchant/stores/{storeId}/media/uploadsstoreIdpathrequiredstringRequired: MediaUploadRequest
201The upload formMediaUploadTicket400Not an accepted photo type, empty, or over the size limitErrorResponse409Photo uploads are not set up for this deploymentErrorResponse/merchant/stores/{storeId}/members/{userId}storeIdpathrequiredstringuserIdpathrequiredstringRequired: ChangeStaffRoleRequest
204Staff member role changed403Merchant role cannot change this staff memberErrorResponse/merchant/stores/{storeId}/members/{userId}storeIdpathrequiredstringuserIdpathrequiredstring204Staff member removed403Merchant role cannot remove this staff memberErrorResponse/merchant/stores/{storeId}/membership-access-rulesstoreIdpathrequiredstringRequired: MembershipAccessRuleRequest
200Membership access ruleMembershipAccessRule/merchant/stores/{storeId}/membership-billing-subscriptions/{membershipBillingSubscriptionId}/cancelstoreIdpathrequiredstringmembershipBillingSubscriptionIdpathrequiredstringOptional: MembershipSubscriptionCancelRequest
200Subscription cancellation recordedMembershipBillingSubscriptionResponse/merchant/stores/{storeId}/membership-billing-subscriptions/{membershipBillingSubscriptionId}/retrystoreIdpathrequiredstringmembershipBillingSubscriptionIdpathrequiredstringOptional: MembershipBillingRetryRequest
200Retry result recorded and dunning state updatedMembershipBillingSubscriptionResponse/merchant/stores/{storeId}/membership-plansstoreIdpathrequiredstringstatusqueryoptionalMembershipPlanStatuslimitqueryoptionalintegeroffsetqueryoptionalinteger200Membership plansMembershipPlanListResponse/merchant/stores/{storeId}/membership-plansstoreIdpathrequiredstringRequired: MembershipPlanRequest
201Membership plan createdMembershipPlan/merchant/stores/{storeId}/membership-plans/{membershipPlanId}storeIdpathrequiredstringmembershipPlanIdpathrequiredstringRequired: MembershipPlanPatchRequest
200Membership plan updatedMembershipPlan/merchant/stores/{storeId}/membership-plans/{membershipPlanId}/archivestoreIdpathrequiredstringmembershipPlanIdpathrequiredstring200Membership plan archivedMembershipPlan/merchant/stores/{storeId}/menusstoreIdpathrequiredstring200Main menu and Footer menu first, then the rest by nameobject/merchant/stores/{storeId}/menusstoreIdpathrequiredstringRequired: object
201The new, empty menuMenuDetail/merchant/stores/{storeId}/menus/{menuId}storeIdpathrequiredstringmenuIdpathrequiredstring200The menuMenuDetail/merchant/stores/{storeId}/menus/{menuId}storeIdpathrequiredstringmenuIdpathrequiredstringRequired: object
200The saved menuMenuDetail400An item points at nothing in this store, nests too deep, or has an address that isn't oneErrorResponse/merchant/stores/{storeId}/menus/{menuId}storeIdpathrequiredstringmenuIdpathrequiredstring200Deletedobject/merchant/stores/{storeId}/menus/{menuId}/proposal/acceptstoreIdpathrequiredstringmenuIdpathrequiredstring200The menu, now the proposalMenuDetail/merchant/stores/{storeId}/menus/{menuId}/proposal/dismissstoreIdpathrequiredstringmenuIdpathrequiredstring200The menu, unchangedMenuDetail/merchant/stores/{storeId}/menus/link-checkstoreIdpathrequiredstring200The report, menu by menuobject/merchant/stores/{storeId}/menus/targetsstoreIdpathrequiredstring200Choices for the editor's pickersobject/merchant/stores/{storeId}/metafieldsstoreIdpathrequiredstring200The definitionsobject/merchant/stores/{storeId}/metafieldsstoreIdpathrequiredstringRequired: MetafieldDefinitionInput
201Created; the key is derived from the nameobject/merchant/stores/{storeId}/metafields/{definitionId}storeIdpathrequiredstringdefinitionIdpathrequiredstringRequired
200Savedobject409The change would rewrite or orphan values products holdErrorResponse/merchant/stores/{storeId}/metafields/{definitionId}storeIdpathrequiredstringdefinitionIdpathrequiredstring200Deletedobject/merchant/stores/{storeId}/modulesstoreIdpathrequiredstringRequired: EnableVerticalModulesRequest
200Updated enabled modules and generator contextEnableVerticalModulesResponse403Merchant role cannot enable modulesErrorResponse/merchant/stores/{storeId}/ordersstoreIdpathrequiredstringstatusqueryoptionalOrderStatuscustomerIdqueryoptionalstringpaymentProviderqueryoptionalstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Tenant-scoped admin orders, each with its delivery, label and return statusAdminOrderListResponse/merchant/stores/{storeId}/orders/{orderId}storeIdpathrequiredstringorderIdpathrequiredstring200Order detailOrder/merchant/stores/{storeId}/orders/{orderId}storeIdpathrequiredstringorderIdpathrequiredstringRequired: OrderStatusTransitionRequest
200Order status changedOrderMutationResponse409Invalid status transitionErrorResponse/merchant/stores/{storeId}/orders/{orderId}/edit-locksstoreIdpathrequiredstringorderIdpathrequiredstring200The locksobject/merchant/stores/{storeId}/orders/{orderId}/emailstoreIdpathrequiredstringorderIdpathrequiredstringRequired: object
200Saved; changed is false when the email was already that oneobject400Not an email addressErrorResponse/merchant/stores/{storeId}/orders/{orderId}/fulfillmentsstoreIdpathrequiredstringorderIdpathrequiredstring200The order's shipmentsobject404Order not found for this storeErrorResponse/merchant/stores/{storeId}/orders/{orderId}/fulfillmentsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: FulfillmentCreateRequest
201Fulfillment created and order fulfillment rollup updatedFulfillmentMutationResponse409Invalid fulfillment allocation or order stateErrorResponse/merchant/stores/{storeId}/orders/{orderId}/notesstoreIdpathrequiredstringorderIdpathrequiredstringRequired: OrderNoteRequest
201Order note addedOrderMutationResponse/merchant/stores/{storeId}/orders/{orderId}/paymentstoreIdpathrequiredstringorderIdpathrequiredstring200The order's paymentobject/merchant/stores/{storeId}/orders/{orderId}/payment-capturestoreIdpathrequiredstringorderIdpathrequiredstring200Capturedobject400Not capturableErrorResponse/merchant/stores/{storeId}/orders/{orderId}/payment-refundsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: object
200Refund sentobject400Not refundable as askedErrorResponse/merchant/stores/{storeId}/orders/{orderId}/refundsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: RefundCreateRequest
201Refund result recordedRefundMutationResponse/merchant/stores/{storeId}/orders/{orderId}/returnsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: ReturnRequestCreateRequest
201Return requestedReturnRequestMutationResponse/merchant/stores/{storeId}/orders/{orderId}/tagsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: OrderTagsRequest
200The order with its tags in metadata.tagsOrder400No usable tag, a tag over 40 characters, or more than 20 tags on the orderErrorResponse/merchant/stores/{storeId}/orders/{orderId}/tagsstoreIdpathrequiredstringorderIdpathrequiredstringRequired: object
200The order's tags nowobject400A tag over 40 characters, or more than 20 tagsErrorResponse/merchant/stores/{storeId}/pagesstoreIdpathrequiredstring200The page, after the changeStorePageList/merchant/stores/{storeId}/pages/{pageHandle}storeIdpathrequiredstringpageHandlepathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/orderstoreIdpathrequiredstringpageHandlepathrequiredstringRequired: object
200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/proposal/acceptstoreIdpathrequiredstringpageHandlepathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/proposal/dismissstoreIdpathrequiredstringpageHandlepathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/sectionsstoreIdpathrequiredstringpageHandlepathrequiredstringRequired: object
201The page, after the changeStorePageWriteResult/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}storeIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstringRequired: object
200The page, after the changeStorePageWriteResult/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}storeIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstring200The page, after the changeStorePageDeleteResult/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}/movestoreIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstringRequired: object
200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}/proposal/acceptstoreIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}/proposal/dismissstoreIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}/restorestoreIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstring200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/{pageHandle}/sections/{sectionId}/visibilitystoreIdpathrequiredstringpageHandlepathrequiredstringsectionIdpathrequiredstringRequired: object
200The page, after the changeStorePageDetail/merchant/stores/{storeId}/pages/choicesstoreIdpathrequiredstring200The page, after the changeSectionChoices/merchant/stores/{storeId}/payment-gateway-settingsstoreIdpathrequiredstring200Store payment gateway settingsStorePaymentGatewaySettings/merchant/stores/{storeId}/payment-gateway-settingsstoreIdpathrequiredstringRequired: StorePaymentGatewaySettingsRequest
200Store payment gateway settings updatedStorePaymentGatewaySettings/merchant/stores/{storeId}/payment-gateway-settings/teststoreIdpathrequiredstring200Payment gateway healthPaymentProviderHealth/merchant/stores/{storeId}/payment-providersstoreIdpathrequiredstring200Payment providersPaymentProviders/merchant/stores/{storeId}/payment-providers/{provider}/connectstoreIdpathrequiredstringproviderpathrequiredstringRequired: PaymentProviderCredentials
200Payment providersPaymentProviders400Missing fields, or the provider rejected themErrorResponse503The provider could not be reached; nothing was savedErrorResponse/merchant/stores/{storeId}/payment-providers/{provider}/credentialsstoreIdpathrequiredstringproviderpathrequiredstring200Payment providersPaymentProviders/merchant/stores/{storeId}/payment-providers/{provider}/disconnectstoreIdpathrequiredstringproviderpathrequiredstringRequired: object
200Payment providersPaymentProviders400Not confirmedErrorResponse/merchant/stores/{storeId}/payment-providers/{provider}/settingsstoreIdpathrequiredstringproviderpathrequiredstringRequired: object
200Payment providersPaymentProviders/merchant/stores/{storeId}/payment-providers/{provider}/teststoreIdpathrequiredstringproviderpathrequiredstringRequired: PaymentProviderCredentials
200The credentials workobject400Missing fields, or the provider rejected themErrorResponse503The provider could not be reached; nothing was savedErrorResponse/merchant/stores/{storeId}/payment-providers/retale_payments/activatestoreIdpathrequiredstring200Payment providersPaymentProviders/merchant/stores/{storeId}/payments-accountstoreIdpathrequiredstring200Payments account statusStorePaymentAccount/merchant/stores/{storeId}/payments-accountstoreIdpathrequiredstring200Payments accountStorePaymentAccount400The business profile is not finishedErrorResponse409ReTale Payments is not open yetErrorResponse/merchant/stores/{storeId}/payments/{paymentTransactionId}/capturestoreIdpathrequiredstringpaymentTransactionIdpathrequiredstringOptional: PaymentOperationRequest
200Capture transactionPaymentTransaction/merchant/stores/{storeId}/payments/{paymentTransactionId}/refundstoreIdpathrequiredstringpaymentTransactionIdpathrequiredstringRequired: PaymentOperationRequest
200Refund transactionPaymentTransaction/merchant/stores/{storeId}/payments/{paymentTransactionId}/voidstoreIdpathrequiredstringpaymentTransactionIdpathrequiredstringOptional: PaymentOperationRequest
200Void transactionPaymentTransaction/merchant/stores/{storeId}/payments/reconciliationstoreIdpathrequiredstringRequired: PaymentReconciliationRequest
200Payment reconciliation recordsPaymentReconciliationResponse/merchant/stores/{storeId}/product-importsstoreIdpathrequiredstring200Recent importsobject/merchant/stores/{storeId}/product-importsstoreIdpathrequiredstringRequired: object
202QueuedProductImport400The file can't be imported, with the reason in plain wordsErrorResponse/merchant/stores/{storeId}/product-imports/{importId}storeIdpathrequiredstringimportIdpathrequiredstring200The importProductImport/merchant/stores/{storeId}/product-imports/{importId}/failed-rowsstoreIdpathrequiredstringimportIdpathrequiredstring200The original header plus an "Import error" column, and each failed row as it was in the fileobject/merchant/stores/{storeId}/productsstoreIdpathrequiredstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Tenant-scoped admin productsAdminProductListResponse403Merchant cannot view this store catalogErrorResponse/merchant/stores/{storeId}/productsstoreIdpathrequiredstringRequired: ProductCreateRequest
201Product created and audit event writtenProductMutationResponse400Product validation failedErrorResponse403Merchant role cannot write catalog dataErrorResponse/merchant/stores/{storeId}/products/{productId}storeIdpathrequiredstringproductIdpathrequiredstring200The productAdminProductListItem404No such product in this storeErrorResponse/merchant/stores/{storeId}/products/{productId}storeIdpathrequiredstringproductIdpathrequiredstringdeferCollectionRefreshqueryoptionalstringRequired: ProductUpdateRequest
200Product updated and audit event writtenProductMutationResponse404Product not found in active storeErrorResponse/merchant/stores/{storeId}/products/{productId}/archivestoreIdpathrequiredstringproductIdpathrequiredstringdeferCollectionRefreshqueryoptionalstring200Product archived and audit event writtenProductMutationResponse/merchant/stores/{storeId}/products/{productId}/duplicatestoreIdpathrequiredstringproductIdpathrequiredstring201Draft product copy created and audit event writtenProductMutationResponse/merchant/stores/{storeId}/products/{productId}/metafieldsstoreIdpathrequiredstringproductIdpathrequiredstring200The definitions and this product's valuesProductMetafields/merchant/stores/{storeId}/products/{productId}/metafieldsstoreIdpathrequiredstringproductIdpathrequiredstringRequired: object
200SavedProductMetafields/merchant/stores/{storeId}/products/{productId}/publishstoreIdpathrequiredstringproductIdpathrequiredstringdeferCollectionRefreshqueryoptionalstring200Product published and audit event writtenProductMutationResponse/merchant/stores/{storeId}/products/{productId}/stockstoreIdpathrequiredstringproductIdpathrequiredstring200The product's stockProductStock/merchant/stores/{storeId}/products/{productId}/stockstoreIdpathrequiredstringproductIdpathrequiredstringRequired: ProductStockUpdateRequest
200The product's stock after the changeProductStock/merchant/stores/{storeId}/returns/{returnRequestId}/approvestoreIdpathrequiredstringreturnRequestIdpathrequiredstringOptional: ReturnDecisionRequest
200Return approvedReturnRequestMutationResponse/merchant/stores/{storeId}/returns/{returnRequestId}/receivestoreIdpathrequiredstringreturnRequestIdpathrequiredstringOptional: ReturnReceiveRequest
200Return received and restock ledger entries recorded when requestedReturnRequestMutationResponse/merchant/stores/{storeId}/returns/{returnRequestId}/rejectstoreIdpathrequiredstringreturnRequestIdpathrequiredstringOptional: ReturnDecisionRequest
200Return rejectedReturnRequestMutationResponse/merchant/stores/{storeId}/reviewsstoreIdpathrequiredstringproductIdqueryoptionalstringstatusqueryoptionalProductReviewStatuscustomerIdqueryoptionalstringlimitqueryoptionalintegeroffsetqueryoptionalinteger200Product reviewsProductReviewListResponse/merchant/stores/{storeId}/reviews/{reviewId}/moderatestoreIdpathrequiredstringreviewIdpathrequiredstringRequired: ProductReviewModerationRequest
200Review moderated and aggregate refreshedProductReviewMutationResponse/merchant/stores/{storeId}/reviews/{reviewId}/responsestoreIdpathrequiredstringreviewIdpathrequiredstringRequired: ProductReviewResponseRequest
200Merchant response saved and auditedProductReviewMutationResponse/merchant/stores/{storeId}/settingsstoreIdpathrequiredstring200Store settings for the active tenantStoreSettings403Merchant role cannot view store settingsErrorResponse/merchant/stores/{storeId}/settingsstoreIdpathrequiredstringRequired: StoreSettingsUpdateRequest
200Updated store settingsStoreSettingsUpdateResponse403Merchant role cannot update these settingsErrorResponse/merchant/stores/{storeId}/storefront-filtersstoreIdpathrequiredstring200The filtersobject/merchant/stores/{storeId}/storefront-filtersstoreIdpathrequiredstringRequired: object
200The filtersobject/merchant/stores/{storeId}/storefront/generation-jobs/{jobId}storeIdpathrequiredstringjobIdpathrequiredstring200The build's statusobject404No such build for this storeErrorResponse/merchant/stores/{storeId}/storefront/generation-requestsstoreIdpathrequiredstringRequired: StorefrontGenerationRequest
202Storefront generation request queuedStorefrontGenerationSubmission/merchant/stores/{storeId}/storefront/versionsstoreIdpathrequiredstring200Storefront version historyStorefrontVersionHistory/merchant/stores/{storeId}/storefront/versions/{storefrontVersionId}storeIdpathrequiredstringstorefrontVersionIdpathrequiredstringcompareToVersionIdqueryoptionalstring200Storefront version previewStorefrontVersionPreview/merchant/stores/{storeId}/storefront/versions/{storefrontVersionId}/approvestoreIdpathrequiredstringstorefrontVersionIdpathrequiredstringOptional: StorefrontVersionActionRequest
200Approved storefront versionStorefrontVersion/merchant/stores/{storeId}/storefront/versions/{storefrontVersionId}/publishstoreIdpathrequiredstringstorefrontVersionIdpathrequiredstringOptional: StorefrontPublishRequest
200Published storefront versionStorefrontVersion/merchant/stores/{storeId}/storefront/versions/{storefrontVersionId}/rollbackstoreIdpathrequiredstringstorefrontVersionIdpathrequiredstringOptional: StorefrontVersionActionRequest
200Rolled back storefront versionStorefrontVersion/merchant/stores/{storeId}/storefront/versions/{storefrontVersionId}/targeted-editsstoreIdpathrequiredstringstorefrontVersionIdpathrequiredstringRequired: StorefrontTargetedEditRequest
201Targeted edit request acceptedStorefrontGenerationSubmission/merchant/stores/{storeId}/switchstoreIdpathrequiredstring200Active store context and permissionsResolvedMerchantAccess403Merchant cannot access this storeErrorResponse/merchant/stores/{storeId}/tax-settingsstoreIdpathrequiredstring200Store tax settingsStoreTaxSettings/merchant/stores/{storeId}/tax-settingsstoreIdpathrequiredstringRequired: StoreTaxSettingsRequest
200Store tax settings updatedStoreTaxSettings/merchant/stores/{storeId}/tax-settings/teststoreIdpathrequiredstring200Tax provider healthTaxProviderHealth/merchant/stores/{storeId}/website-builderstoreIdpathrequiredstring200The conversationWebsiteBuilder/merchant/stores/{storeId}/website-builder/buildsstoreIdpathrequiredstringRequired: object
201The request and the replyobject/merchant/stores/{storeId}/website-builder/messagesstoreIdpathrequiredstringRequired: object
201The request and the replyobject/merchant/stores/{storeId}/website-builder/undostoreIdpathrequiredstringOptional: object
201The undo and its replyobject409Refused, with the reason/merchant/stores/{storeId}/website-previewstoreIdpathrequiredstring201The passobjectProvider callback endpoints that verify external payment and recurring billing events.
/webhooks/shippo/livetokenqueryrequiredstring200Event receivedStripeWebhookReceipt400The body is not a Shippo eventErrorResponse401Token missing or wrongErrorResponse503This endpoint has no token configured yetErrorResponse/webhooks/shippo/testtokenqueryrequiredstring200Event receivedStripeWebhookReceipt400The body is not a Shippo eventErrorResponse401Token missing or wrongErrorResponse503This endpoint has no token configured yetErrorResponse/webhooks/stores/{storeId}/membership-billing/{gateway}storeIdpathrequiredstringgatewaypathrequiredstringRequired: object
200Recurring billing webhook processed or replay ignored idempotentlyMembershipBillingWebhookProcessResponse401Invalid webhook signatureErrorResponse/webhooks/stores/{storeId}/payments/{gateway}storeIdpathrequiredstringgatewaypathrequiredstringRequired: object
200Webhook processed or replay ignored idempotentlyGatewayWebhookProcessResponse401Invalid webhook signatureErrorResponse/webhooks/stripe/connect200Event receivedStripeWebhookReceipt400Signature missing or invalidErrorResponse/webhooks/stripe/platform200Event receivedStripeWebhookReceipt400Signature missing or invalidErrorResponseLow-risk platform endpoints that do not expose tenant data.
/health200API health responseHealthResponse/storefront-hosts/{host}hostpathrequiredstring200The store this host servesStorefrontHost404No live store answers on this host/storefront-previews/{pass}passpathrequiredstring200The store the pass shows, and when the pass stops workingobject404Not a current preview passGenerated storefront boundary
Generated storefronts may render layouts, product grids, content pages, SEO metadata, reviews, visual styling, and local presentation state using documented public API and SDK surfaces.
Cart mutation, tax quotes, inventory reservation, checkout sessions, payment tokenization, order creation, login, account access, loyalty redemption, memberships, refunds, and moderation stay in fixed platform code.
Generated code must not query the database, import server-only modules, call gateways directly, store secrets, process raw card data, disable validation, bypass rate limits, or publish without approval gates.
Generated storefronts must use @retale/commerce-sdk for cart, checkout, payment, login, account, tax, inventory, order, loyalty, membership, and review workflows. Direct gateway, database, server-only module, secret, and internal route imports are forbidden.
Local and sandbox examples
curl -s http://localhost:4100/api/v1/healthcurl -s http://localhost:4100/api/v1/stores/demo-store/products?limit=12&offset=0curl -s -H "Authorization: Bearer $RETALE_LOCAL_MERCHANT_SESSION" \
-H "X-ReTale-Store-Id: $RETALE_LOCAL_STORE_ID" \
http://localhost:4100/api/v1/merchant/stores/$RETALE_LOCAL_STORE_ID/orders?limit=10&offset=0Merchant examples use a local session token from the admin login flow. Do not place provider credentials, payment gateway keys, database URLs, or production bearer tokens in public docs or generated storefronts.