A storefront on Crystallize reads the catalogue from the Discovery API and does everything that concerns a shopper through the Shop API: carts, prices for the customer, checkout, orders and bookings. This section explains which API to call for each task and in what order. It also covers caching, languages and markets, performance, accessibility and security, and how search engines, answer engines and AI agents read and use the store.
The API pages under APIs tell you how each API behaves. This section tells you which API to call for a task and in what order. It follows a storefront from the first catalogue read to a confirmed order, and then covers what makes the store good to use: fast pages, an accessible interface, structured data for search engines, and tools for AI agents.
The examples come from working storefronts on Crystallize demo tenants (see "Reference implementations and inspiration" below). They use Next.js (App Router) where a framework is needed, but the API calls are the same in any stack.
A Crystallize storefront talks to two APIs at runtime:
Two more APIs exist, and a storefront rarely needs them:
If you read one page, read The storefront API contract. It has the rule in five lines, the tokens each API needs, and a table of storefront tasks with the API and call for each.
Check four things on the tenant before writing the first page:
discoverable: false is left out of the Discovery schema, and so is a shape with no discoverable components left.superfast.shop is a set of live demo stores, one per industry. Each runs on its own Crystallize tenant with a storefront on the Discovery and Shop APIs, and each was built agentically with the Crystallize MCP server. Use them to see how a storefront can be built, and as a starting point for your own:
The pages in this section link to the store that shows each topic best.
Discovery examples run against the public Furnitut demo tenant unless they say otherwise. The Discovery schema is generated from each tenant's shapes, so field names such as defaultPrice or brand depend on your own model. Shop API examples work on any tenant. Replace your-tenant-identifier with your tenant identifier.