Set your location

Shoppage Search API

Query every Shoppage surface from your own software: the same results as the site, as JSON.

Get a key

Create an API key from your account. Keys look like sp_live_… and are shown once. Keep them secret; revoke a key from the same page if it leaks.

Search

GET /api/v1/search?q=stoneware+mug&surface=shopping&page=1&limit=20
Authorization: Bearer sp_live_YOUR_KEY
ParameterDescription
qSearch text (up to 300 characters). Required by most surfaces.
surfaceOne of all, shopping, maps, videos, images, news. Defaults to all.
pagePage number, from 1.
limitResults per page, up to 50.
f.<field>, sortThe same filters and sort orders as the website's search pages (for example f.shop=studio-clay, sort=price_asc).

You can pass the key as ?key= for quick tests, but prefer the Authorization header so keys don't end up in logs and browser history.

Response

{
  "query": "stoneware mug",
  "surface": "shopping",
  "total": 42,
  "page": 1,
  "page_size": 20,
  "results": [
    {
      "title": "Speckled stoneware mug",
      "url": "https://…/shop/studio-clay/product/1",
      "snippet": "A 350 ml mug with a speckled oatmeal glaze.",
      "image": "https://…",
      "source": "Studio Clay",
      "meta": { "price": 28, "currency": "USD", "shop": "studio-clay", "availability": "In stock" }
    }
  ]
}

Catalogue (for shops)

A shop owner's key also manages that shop's products, so a POS, ERP or stock system can keep prices and stock current. Products are addressed by SKU.

CallDoes
GET /api/v1/products?page=&limit=Lists your products (up to 200 a page).
GET /api/v1/products/{sku}One product.
PUT /api/v1/products/{sku}Creates or replaces a product. Needs at least title and price. Answers 201 when created.
PATCH /api/v1/products/{sku}Changes only the fields you send, e.g. {"price": 4499, "stock": 3}.
DELETE /api/v1/products/{sku}Archives the product (it becomes a draft).
curl -X PATCH /api/v1/products/GEN-3K   -H "Authorization: Bearer sp_live_…" -H "Content-Type: application/json"   -d '{"price": 4499, "stock": 3}'

Fields: title, description, price, compare_at_price, currency, stock, status (active/draft), images, brand, category, barcode, tags, weight_kg. Unknown fields are refused. Errors: invalid (422), sku_taken and catalogue_limit (409), no_shop (403, the key's owner has no shop). Prefer a spreadsheet? Use Product feeds in the dashboard.

Limits

Each key has a daily quota that you set (up to the platform maximum), counted per UTC day, and a short-term rate limit of a few requests per second.

Errors

Errors are JSON: {"error": {"code": "…", "message": "…"}}.

StatusCodeMeaning
400unknown_surface, query_too_longFix the request.
401unauthorizedMissing, wrong or revoked key.
429quota_exceededDaily quota used; Retry-After says when it resets.
429rate_limitedToo fast; wait for Retry-After seconds.
500internalOur fault; retry later.