# markedet shopify launch watch

> Pay-per-call API for e-commerce and product-research agents: what did these Shopify stores launch recently? Per store: Shopify yes/no, product count, newest products (title, URL, created/published dates, price range, tags), flags fresh_launch, held_then_published, long_survivor, recently_updated, telling tags (winner, test, tiktok, upsell). Cross-store: similar titles launched by 2+ of your stores in the window.

Price: $0.01 per store in USDC on Base mainnet (eip155:8453) via x402 v2 (scheme exact). 1 to 20 stores per call. No account or API key. Invalid input sent with a payment is a free 422 (never settled). If every store fails, no charge.

## Endpoints

- [POST /check](https://shopify-launch-watch.onrender.com/check): paid. Body `{"stores": ["allbirds.com", "deathwishcoffee.com"], "since_days": 7}`
- [GET /demo](https://shopify-launch-watch.onrender.com/demo): free cached sample on one fixed store
- [GET /openapi.json](https://shopify-launch-watch.onrender.com/openapi.json): OpenAPI 3.1 with x-payment-info
- [GET /stats](https://shopify-launch-watch.onrender.com/stats): calls and latency since last restart
- [GET /.well-known/x402](https://shopify-launch-watch.onrender.com/.well-known/x402): x402 discovery
- [MCP https://shopify-launch-watch.onrender.com/mcp](https://shopify-launch-watch.onrender.com/mcp): remote MCP (streamable HTTP), paid tool `watch_shopify_launches` (x402 MCP transport), free tool `demo`
- [A2A agent card](https://shopify-launch-watch.onrender.com/.well-known/agent-card.json), JSON-RPC at https://shopify-launch-watch.onrender.com/a2a
- [Guide](https://shopify-launch-watch.onrender.com/guide): See what Shopify competitors launched this week, from products.json (real example, limits, paid call)

## Paid call

1. `curl -si -X POST https://shopify-launch-watch.onrender.com/check -H 'content-type: application/json' -d '{"stores": ["allbirds.com", "deathwishcoffee.com"], "since_days": 7}'` returns 402 with the quote (PAYMENT-REQUIRED header).
2. Sign it with an x402 client (Python `x402`, TypeScript `@x402/fetch`) and resend with header `PAYMENT-SIGNATURE`.
3. The 200 response carries the results and a PAYMENT-RESPONSE header with the settlement transaction.

## Limits

- Reads only public /products.json. Stores can disable or hide it, password-protect the shop or block bots; you then get status products_json_disabled, password_protected or blocked (charged, it is an answer).
- products.json lists published products only. Drafts, unlisted and deleted products are invisible.
- updated_at changes for many reasons (edits, apps, images, metafields), so recently_updated hints at inventory or price movement but does not prove it. No sales or stock numbers.
- At most 4 pages of 250 products per store; bigger catalogues are marked product_count_capped.
- Polite fetching: 1 request per second per store, 10 minute cache, robots.txt respected. A call with 20 stores can take 10 to 30 seconds.
- Cross-store matching compares title words (Jaccard >= 0.6), not images; renamed products are missed and generic titles can match by chance.
- Runs on Render Free: after ~15 minutes idle the first call takes ~30-60 s (cold start).

Source (MIT): https://bitbucket.org/markedet/shopify-launch-watch
