SKUHelm

Docs

How SKUHelm works

SKUHelm reads your shop, turns each product and variant into a row in OpenAI's product feed format, checks every row against the spec and publishes the rows that pass at a fixed address.

From shop to feed

  1. 01Read. We fetch your public catalogue: Shopify's products.json, WooCommerce's Store API, or a CSV, JSON or JSONL file you upload or link. Every variant becomes its own row.
  2. 02Fill. Store settings you set once (seller name, brand, policy links, countries, shipping) fill the gaps the shop can't. Your own edits to a single item win over both.
  3. 03Check. Each row is checked against the spec: the 9 required fields, formats, lengths, variant grouping and the extra fields checkout needs. Every problem names the field and the rule.
  4. 04Publish. Rows that pass go into a new feed version, but only when something changed. Blocked rows stay out until they're fixed. Price and stock always come from your shop.

What the statuses mean

  • Ready. Passes every rule and carries what Instant Checkout needs.
  • No checkout. Accepted in the feed, so it can be found in ChatGPT, but it can't be bought there yet. Usually the privacy or terms link is missing.
  • Blocked. Breaks a required rule, so it isn't published.

Your feed address

Each store gets one address per format. It never changes, so you give it to OpenAI once.

  • https://www.skuhelm.com/feeds/your-shop.jsonl
  • https://www.skuhelm.com/feeds/your-shop.csv
  • https://www.skuhelm.com/api/v1/feeds/your-shop/acp.json

The files send an ETag and answer 304 when nothing changed, so polling them is cheap.

Try it from a terminal

Validation needs no key. Send a row and see what the spec makes of it.

curl -X POST https://www.skuhelm.com/api/v1/catalog/validate \
  -H "content-type: application/json" \
  -d '{"items":[{
    "item_id": "MUG-01",
    "title": "Speckled stoneware mug",
    "price": "24.00 GBP",
    "availability": "in_stock"
  }]}'