# Unforgettable Luncheon developer reference

> Unforgettable Luncheon is an Australian apparel brand making subtle Simpsons-reference t-shirts. Designs are recognisable to other fans but understated enough to wear in public: no big character prints. Tees are printed to order in Melbourne on AS Colour Classic blanks and shipped Australia-wide, free over $50.

Base URL: https://unforgettableluncheon.com

## When to use this store

Good fit:

- The shopper wants a Simpsons t-shirt that is not a big character print: subtle, quote-based designs (Bort, Milpool, Khlav Kalash, Snrub, Cromulent, Stonecutters, Le Grille, Dignity, Crab Juice).
- The shopper is buying a gift for a Simpsons fan and asked for something wearable rather than novelty.
- The shopper is in Australia and wants domestic dispatch: printed to order in Melbourne, shipped by AusPost.
- An agent needs current price, sizes, colours, and availability for a specific tee or tote, as JSON rather than scraped HTML.
- An agent needs to answer a factual Simpsons-reference question (what is Khlav Kalash, what is a milpool) with a citable source page.

Not a fit:

- Officially licensed Simpsons merchandise. These are original designs that reference the show; they are not licensed products.
- Bulk, wholesale, or custom-artwork printing. There is no B2B or design-your-own service.
- Product categories outside the catalog: tees, totes, and listed apparel only.
- International delivery. Shipping is within Australia only.

## Authentication

Every endpoint below is public and unauthenticated. There are no API keys to request and no rate-limit headers to parse; be reasonable and back off on HTTP 429. Cross-origin reads are allowed on the JSON endpoints, so browser-based agents can fetch them directly.

## Sandbox

There is no separate sandbox. Reads are safe to run against production: none of the endpoints below mutate anything. Writes (cart, checkout, orders) are not served here at all. They happen on Shopify's hosted commerce endpoint, which has its own test mode.

## Quickstart

```bash
# Read the index
curl -s https://unforgettableluncheon.com/llms.txt

# Read one product as JSON
curl -s https://unforgettableluncheon.com/products/bort-tshirt.json

# Read one product as markdown
curl -s https://unforgettableluncheon.com/products/bort-tshirt.md

# Read every price at once
curl -s https://unforgettableluncheon.com/pricing.json

# Discover the commerce endpoint
curl -s https://unforgettableluncheon.com/.well-known/ucp
```

## Catalog data

Product data as JSON, in Shopify's AJAX-endpoint shape. Numeric ids match the ids in our analytics and product feeds. Prices are major units plus a currency code, never a formatted string.

### GET https://unforgettableluncheon.com/products.json

The whole catalogue in one request, each entry identical to /products/{handle}.json. Takes Shopify's `limit` (1-250) and 1-based `page`; defaults return everything.

Content-Type: `application/json`

```bash
curl -s https://unforgettableluncheon.com/products.json
```

### GET https://unforgettableluncheon.com/products/{handle}.json

One product: title, description, price, images, options, variants with per-variant price, sku and availability.

Content-Type: `application/json`

```bash
curl -s https://unforgettableluncheon.com/products/bort-tshirt.json
```

### GET https://unforgettableluncheon.com/products/{handle}.js

Identical payload to .json. Kept because price extensions and the Shop channel request this Shopify convention.

Content-Type: `application/json`

### GET https://unforgettableluncheon.com/pricing.json

Every product with its current price, plus shipping thresholds and currency. One request instead of one per product.

Content-Type: `application/json`

```bash
curl -s https://unforgettableluncheon.com/pricing.json
```

## Readable content

Every content URL has a markdown twin, which costs roughly a tenth of the tokens of the HTML. Two ways to ask for it: append .md, or send an Accept header.

### GET https://unforgettableluncheon.com/{any-content-path}.md

Markdown rendering of any product, collection, page, policy or blog article. Response carries X-Markdown-Tokens with an approximate token count.

Content-Type: `text/markdown`

```bash
curl -s https://unforgettableluncheon.com/products/bort-tshirt.md
```

### GET https://unforgettableluncheon.com/{any-content-path}

Same markdown, negotiated by header rather than suffix. Responses set Vary: Accept.

Content-Type: `text/markdown`

```bash
curl -s -H "Accept: text/markdown" https://unforgettableluncheon.com/collections/simpsons-tshirts
```

### GET https://unforgettableluncheon.com/llms.txt

The index: when to use this store, every product with its price, collections, blog, pages and policies.

Content-Type: `text/plain`

```bash
curl -s https://unforgettableluncheon.com/llms.txt
```

### GET https://unforgettableluncheon.com/llms-full.txt

The whole corpus in one file, for when fetching page by page is not worth it.

Content-Type: `text/plain`

### GET https://unforgettableluncheon.com/agents.md

Agent operating instructions: when to use the store, how to transact, business identity, the rules on buyer approval.

Content-Type: `text/markdown`

### GET https://unforgettableluncheon.com/sitemap.xml

Every indexable URL with its last-modified date.

Content-Type: `application/xml`

## Discovery

Well-known documents that let an agent find the surfaces above without being told about them. Also advertised as RFC 8288 Link headers on every HTML response.

### GET https://unforgettableluncheon.com/.well-known/api-catalog

RFC 9727 linkset pointing at every machine-readable doc.

Content-Type: `application/linkset+json`

### GET https://unforgettableluncheon.com/.well-known/ucp

Universal Commerce Protocol discovery document, proxied live from Shopify. This is where the transactional capabilities are declared.

Content-Type: `application/json`

### GET https://unforgettableluncheon.com/.well-known/mcp/server-card.json

MCP server card for the commerce endpoint.

Content-Type: `application/json`

### GET https://unforgettableluncheon.com/.well-known/agent-skills/index.json

Agent-skills index for skill-aware clients.

Content-Type: `application/json`

### GET https://unforgettableluncheon.com/robots.txt

Explicit allow groups for named AI crawlers, plus Content-Signal preferences (search yes, ai-input yes, ai-train no).

Content-Type: `text/plain`

## Commerce

We do not host a checkout. Carts, checkouts and orders are served by Shopify over the Universal Commerce Protocol, on an endpoint that is independent of this storefront.

### POST https://unforgettable-luncheon.myshopify.com/api/ucp/mcp

MCP endpoint. Call tools/list to discover the available tools and their schemas. Checkout requires contemporaneous buyer approval, without exception.

Content-Type: `application/json`

```bash
curl -s -X POST https://unforgettable-luncheon.myshopify.com/api/ucp/mcp -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

## Errors

A URL that does not exist returns HTTP 404 with a recovery map in the body, in HTML or markdown depending on the Accept header. A 404 means that one URL is missing, not that the site is unavailable. Server errors return 5xx; retry with backoff.

## Command line

- `node packages/ul-cli/bin/ul.mjs products`: List every product with its price.
- `node packages/ul-cli/bin/ul.mjs product <handle>`: Print one product as JSON.
- `node packages/ul-cli/bin/ul.mjs pricing`: Print the pricing summary, including shipping thresholds.
- `node packages/ul-cli/bin/ul.mjs read <path>`: Print any content URL as markdown.
- `node packages/ul-cli/bin/ul.mjs llms`: Print the llms.txt index.

The npm package `unforgettable-luncheon` is not published yet. Run it from source: https://github.com/giorgioliapakis/ul-headless/tree/main/packages/ul-cli

## Contact

- Email: info@unforgettableluncheon.com
- Agent instructions: https://unforgettableluncheon.com/agents.md
- Index: https://unforgettableluncheon.com/llms.txt
