openapi: 3.2.0 info: title: Shop ICON Storefront Catalog API version: '2026-08-22' description: 'Anonymous, read-only JSON access to the Shop ICON storefront at store.iconaircraft.com — the ICON Aircraft merchandise store (A5 apparel, hats, scale models, publishing and flight-training products), built on Shopify. ICON Aircraft publishes no developer program and no product API for the A5 aircraft itself. This storefront surface is nonetheless a genuine, documented, machine-readable interface: the store''s own /agents.md and /robots.txt name these endpoints as the supported read path for AI agents, and each one was probed live and returned 200 without credentials on 2026-08-22. Ownership is established from the storefront''s own metadata rather than the fetch URL: GET /meta.json returns name "Shop ICON", domain store.iconaircraft.com, myshopify_domain iconaircraft.myshopify.com, and city Vacaville, California — ICON Aircraft''s headquarters. The store also stocks Flight Design branded merchandise, consistent with Flight Design being ICON Aircraft''s sister company under Shang Gong Group. Derived by API Evangelist from https://store.iconaircraft.com/agents.md and from live anonymous probes of every operation below. The transactional surface (cart, checkout, order) is NOT described here — Shopify exposes it to agents through the UCP/MCP endpoint instead; see mcp/icon-aircraft-mcp.yml.' contact: name: Shop ICON url: https://store.iconaircraft.com/ termsOfService: https://store.iconaircraft.com/policies/terms-of-service servers: - url: https://store.iconaircraft.com description: Shop ICON storefront (Shopify, Cloudflare edge) - url: https://iconaircraft.myshopify.com description: Canonical myshopify origin for the same store tags: - name: Catalog description: Products and product variants. paths: /products.json: get: operationId: listProducts summary: List published products description: Lists every published product with its variants, options and images. Verified live at 43 published products on 2026-08-22. Paginate with page and limit; an empty products array signals the end of the collection. tags: - Catalog parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/page' responses: '200': description: A page of products. content: application/json: schema: type: object properties: products: type: array items: $ref: '#/components/schemas/Product' /products/{handle}.json: get: operationId: getProduct summary: Get a single product by handle description: Returns the full product record for one storefront handle, including every variant with its SKU, price, compare-at price, weight in grams and availability flag. tags: - Catalog parameters: - $ref: '#/components/parameters/handle' responses: '200': description: The product. content: application/json: schema: type: object properties: product: $ref: '#/components/schemas/Product' '404': $ref: '#/components/responses/NotFound' /cart.js: get: operationId: getCart summary: Get the current session cart description: Returns the cart bound to the caller's Shopify session cookie. An anonymous caller with no prior session receives a new empty cart. Agents should prefer the UCP/MCP cart tools over this endpoint — see mcp/icon-aircraft-mcp.yml — because checkout on this storefront requires contemporaneous human approval and cannot be completed through the storefront JSON surface. tags: - Catalog responses: '200': description: The session cart. content: application/json: schema: $ref: '#/components/schemas/Cart' components: responses: NotFound: description: No published object exists at that handle. content: text/html: schema: type: string schemas: Image: type: object properties: id: type: integer product_id: type: integer src: type: string format: uri width: type: integer height: type: integer position: type: integer alt: type: - string - 'null' variant_ids: type: array items: type: integer Option: type: object properties: name: type: string position: type: integer values: type: array items: type: string Variant: type: object properties: id: type: integer product_id: type: integer title: type: string option1: type: - string - 'null' option2: type: - string - 'null' option3: type: - string - 'null' sku: type: - string - 'null' price: type: string description: Decimal string in the store currency, for example "30.00". compare_at_price: type: - string - 'null' available: type: boolean grams: type: integer requires_shipping: type: boolean taxable: type: boolean position: type: integer featured_image: oneOf: - $ref: '#/components/schemas/Image' - type: 'null' Product: type: object properties: id: type: integer title: type: string handle: type: string body_html: type: string published_at: type: string format: date-time created_at: type: string format: date-time updated_at: type: string format: date-time vendor: type: string product_type: type: string tags: type: array items: type: string variants: type: array items: $ref: '#/components/schemas/Variant' images: type: array items: $ref: '#/components/schemas/Image' options: type: array items: $ref: '#/components/schemas/Option' Cart: type: object properties: token: type: string note: type: - string - 'null' attributes: type: object additionalProperties: true original_total_price: type: integer total_price: type: integer item_count: type: integer currency: type: string items: type: array items: type: object additionalProperties: true parameters: page: name: page in: query description: 1-indexed page of the collection. schema: type: integer minimum: 1 default: 1 handle: name: handle in: path required: true description: The storefront handle (URL slug) of the object. schema: type: string limit: name: limit in: query description: Items per page. Shopify caps this at 250. schema: type: integer minimum: 1 maximum: 250 default: 30