Arrange the home page sections in the design draft
- 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-Keyheader. A retry with the same key does the work once.
Order, show, hide, add page blocks and remove blocks that were added. The shop's own sections can be hidden, not removed.
Lands in the design draft, as the console's designer saves it; shoppers see it after the design is published.
Read the draft fresh on every call, so changes made seconds apart build on each other.
Access: OAuth scope design:write; owner/admin only; write-gated by the subscription.
merchantOAuth design:writeAuthorizationBearer <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
storeId*stringA store the person can reach. Any other id answers 404, never 403.
Idempotency-Key*stringRequired 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.
^[A-Za-z0-9_-]{8,128}$application/json- body
order?array<string>items <= 60show?array<string>items <= 60hide?array<string>items <= 60remove?array<string>items <= 60add?array<>OK
application/json- response
data*The draft after a change, and what the save said.
curl -X PATCH 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/design/home-sections' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": { "design": { "look": "string", "colours": { "primary": "string", "accent": "string", "background": "string", "foreground": "string" }, "corners": "string", "hero": { "headline": "string", "line": "string", "button": "string", "photo": "string" }, "announcement": { "text": "string", "href": "string", "endsAt": 0, "more": [ "string" ] } }, "sections": [ { "id": "string", "type": "string", "label": "string", "shown": true, "kind": "string", "block": {} } ], "popup": { "kind": "string", "code": "string", "heading": "string", "text": "string", "imageUrl": "string", "delay": 0, "every": "string" }, "problems": [ "string" ], "draftDiffersFromLive": true, "previewUrl": "string" }}Set or clear the announcement bar in the design draft PUT
The thin bar across the top of the shop. Send `clear: true` to remove it. Lands in the design draft, as the console's designer saves it; shoppers see it after the design is published. Read the draft fresh on every call, so changes made seconds apart build on each other. Access: OAuth scope `marketing:write`; owner/admin only; write-gated by the subscription.
Set or clear the pop-up in the design draft PUT
An offer code or a newsletter sign-up shoppers see after a few seconds. Send `clear: true` to remove it. Lands in the design draft, as the console's designer saves it; shoppers see it after the design is published. Read the draft fresh on every call, so changes made seconds apart build on each other. Access: OAuth scope `marketing:write`; owner/admin only; write-gated by the subscription.