ShopEazydevelopers
API referenceMerchant API BetaPages

Make a page from a page starter design

Beta
Credentials
  • OAuth access token
Scopes
design:write
Role
Owners and admins only. Staff get 403 forbidden.
Subscription
Needs an active plan. Otherwise 403 subscription_locked.
Idempotency
Send an Idempotency-Key header. A retry with the same key does the work once.
POST
/v1/merchant/stores/{storeId}/pages/starters

Step 3 of a new page: a draft page from a design listPageStarters lists, filled from the shop's own listings, categories and settings, with the merchant's title, slug (its address) and menu place: top, footer or none. Each left out is the item's own. A page in the top menu of a shop with a custom menu is added to that menu too. categoryId picks the category of an "A category" page (the fullest when left out). filledWith says what the page was made from ("4 tours"), null when nothing. Saves a draft; shoppers see it after publishPage.

An unknown design or menu place, or an address that can't be used or another page has: 422 validation_error. Below Growth only About pages: 403 plan_limit.

Access: OAuth scope design:write; owner/admin only; write-gated by the subscription.

Authorization

merchantOAuth design:write
headerAuthorizationBearer <token>

OAuth 2.1 (authorization code + PKCE S256, public clients, dynamic registration) for connected AI apps. Effective power is scopes granted AND the person's role today AND the plan. orders:refund, billing:write and team:write are opt-in on the consent screen. Write implies read for marketing:read and messages:read, so a grant holding marketing:write passes a marketing:read check, and messages:send passes messages:read.

Scope: design:write

Path Parameters

storeId*string

A store the person can reach. Any other id answers 404, never 403.

Header Parameters

Idempotency-Key*string

Required on every write. Minted on the device when the person taps, reused on every retry. A write without one, or with one that does not match the pattern, is refused with 422 validation_error. Scoped to the token's subject, remembered 24 hours. A replay returns the first 2xx response with Idempotent-Replay: true; a request still running answers 409 in_flight; the same key with a different method, path or body answers 409 idempotency_key_reused; non-2xx results are not remembered. If the key store cannot be read nothing is processed and the answer is 503 idempotency_unavailable: retry with the same key.

Match^[A-Za-z0-9_-]{8,128}$

Request Body

application/json
  1. body
design*string

A design id from listPageStarters, e.g. tours.road-trip.

title?string
slug?string

The page's address, e.g. trips for /trips.

menu?PageMenuPlace

Where a page goes: the top menu, the footer, or nowhere.

Value in"top""footer""none"
categoryId?string

Response Body

OK

application/json
  1. response
data*
Example Request
curl -X POST 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/pages/starters' \  -H 'Authorization: Bearer <access_token>' \  -H 'Idempotency-Key: <unique_key>' \  -H 'Content-Type: application/json' \  -d '{  "design": "string"}'
Example Response
{  "data": {    "page": {      "id": "string",      "title": "string",      "slug": "string",      "live": true,      "unpublishedChanges": true,      "inMenu": true,      "inFooter": true,      "catalogPage": "physical",      "visibility": "everyone"    },    "menu": "top",    "filledWith": {      "count": 0,      "noun": "string"    },    "previewUrl": "string"  }}

What a new page can be, and the designs for each GET

New page in three steps: step 1 is what the page is for (an item: Tours, Services, A category, Events, Gift cards, About, Team, FAQ, Lookbook, Size guide, Contact, Sale or launch, Wholesale, Link in bio, Blank, in three `groups`), step 2 a design for it (`designs`), step 3 its name, address and menu place (createStarterPage). Each item is filled from the shop's own listings, categories and settings: `count` is how many of its listings the page is made from (null when it isn't made from listings) and `sub` says so in words ("4 tours"). `title`, `slug` and `menu` are what the page gets when createStarterPage is not told otherwise. Each design says how many `sections` (blocks) it makes for this shop. `locked` items need Growth (below it only About). `previewUrl` is a private link to every design of the item, stacked, as the storefront draws them for this shop; nothing is saved (null when no link can be signed). Access: OAuth scope `store:read`; not write-gated. Paged: `{ items, nextCursor }`, `limit` (default 50, at most 200) and an opaque `cursor`.

Publish, unpublish or delete several pages POST

Up to 200 pages, one at a time (each change rewrites the store's pages index in a transaction, so running them side by side would only make them retry). Each page is re-read and decided again: one that is gone, already in that state, or that the plan does not allow is left alone with the reason. `delete` is permanent. The answer is one `{ id, ok, error? }` per id (`BulkResult`), always 200. A retry is safe: a page already published, unpublished or deleted is left alone (`ok: false`, for example `already live` or `not_found`) and nothing happens twice; the same `Idempotency-Key` replays the first answer. Access: OAuth scope `design:write`; owner/admin only; write-gated by the subscription.