Create a Product
Token-authenticated; requires storefront.update (or legacy
products.update during the migration).
The write keeps the ActiveRecord accepts_nested_attributes_for key
names so the existing Retail::ProductManager / VariantManager
orchestration consumes the payload unchanged. A variant MUST be
priced in at least one country on create
(variant_countries_attributes required). Dynamic bundle-group
writes are NOT accepted; static product_bundles_attributes are.
Triggers fresh Lighthouse + compliance scans automatically — a
subsequent GET :id/lighthouse / :id/compliance returns
scan_status: pending while the queued scans run.
Authorizations
Bearer token authentication. Accepts company-admin tokens with
storefront.view for read operations and storefront.update
for writes and scan triggers (legacy per-resource grants like
categories.update / products.view / etc. are still accepted
during the migration), required on every company operation.
Storefront public operations under /api/v202604/{resource} and
/api/v202604/{resource}/{slug} are unauthenticated
(security: []).
Query Parameters
Response locale. ISO code (e.g. fr, de). When omitted,
responds in the company's default locale. On the public
surface, falls back to en for any translated field missing
in the requested locale.
"fr"
ISO-2 country code that selects COUNTRY-RELATIVE Product pricing.
Product-only — Categories and other storefront resources use
filter[country] as an access-list visibility filter instead.
For Products, country drives the pricing block and each
variant's variant_countries: it picks which per-country variant
price and currency are rendered. On the catalog it also drops
products with no active variant in the requested country. When
omitted, falls back to the company's default country.
"GB"
Body
Company write contract for a Product. Keeps the ActiveRecord
accepts_nested_attributes_for key names (*_attributes) so the
existing Retail::ProductManager / VariantManager write orchestration
consumes the payload unchanged. status is the RAW Product enum key
(active/draft/archived) — the canonical published/scheduled
split is presentation-only on read. NOTE: dynamic bundle-group writes
(product_bundle_groups_attributes) are NOT accepted on this
surface; static bundle-component links (product_bundles_attributes)
ARE.
Response
The created Product.
Shared success envelope for list / show / create / update
responses: the resource payload is returned alongside a top-level
integer status and meta. Composed onto each resource response
via allOf.
200
Response metadata included on every successful response body.
request_id and timestamp are always present; list endpoints
also add pagination.
Authenticated (company-surface) Product read shape: the public
ProductBase plus custom_slug, admin metadata never rendered on
the public surface.