Publish Storefront
Copy the saved draft of a storefront (Creator page) to the live visitor page.
The path is nested under the storefront UUID. There is no request body.
Re-publishing an already-published storefront is the same 200 with a new
published_at. There is no content gate: a page with empty widgets still
publishes.
Your store must have an active Easytools plan. If it does not, the call
returns 422 and the live page stays as it was — including when {id} does
not exist. Re-publish is gated the same way. See
Active plan required.
Request
POST /storefronts/{id}/publish
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Storefront UUID |
Example Request
curl -X POST "https://cart.easy.tools/api/v1/storefronts/b10f5980-d653-4494-ad1c-6a9d68c96d19/publish" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json"
Response
Success Response (200)
Returns the same lean identity as a Get Storefronts
list item, plus a required preview_url. status is published and
public_url is the shareable live link. Re-publish is this same 200
with a new published_at and a fresh preview_url.
{
"id": "b10f5980-d653-4494-ad1c-6a9d68c96d19",
"slug": "my-studio",
"name": "My Studio",
"status": "published",
"public_url": "https://mysite.com/",
"preview_url": "https://cart.easy.tools/storefront-preview/b10f5980-d653-4494-ad1c-6a9d68c96d19?expires=1788355193&signature=e491397e0a53d7fef406f950b1ae8def3f435f9acbfbf2ec26d2660259826440",
"domains": [
{
"domain": "mysite.com",
"status": "configured",
"include_www": true
}
],
"created_at": "2026-03-12T10:00:00+00:00",
"updated_at": "2026-09-02T12:16:51+00:00",
"published_at": "2026-09-02T12:16:51+00:00"
}
preview_url is a fresh signature of the saved draft. The expires /
signature query in this example will already be stale; the shape is
what matters. See Draft preview.
Response Fields
Same lean projection as a Get Storefronts list item, plus:
| Field | Type | Nullable | Description |
|---|---|---|---|
preview_url | string | No | Temporary signed URL of the saved draft. Expires after about one hour. See Draft preview. |
Error Responses
Bad Request (400)
Returned when {id} is not a UUID.
{
"message": "Invalid storefront ID"
}
Not Found Error (404)
Returned when the UUID does not exist, belongs to another store, or points at
a deleted storefront. Without an active Easytools plan, a missing {id}
returns the 422 below instead.
{
"message": "Storefront not found"
}
Publishing Not Allowed (422 — No Active Plan)
Returned when the store has no active Easytools plan. The live page stays as
it was. Re-publish is refused the same way. This 422 is also returned when
{id} does not exist. Activate a plan and retry.
The body carries a message and no errors key.
{
"message": "Storefront cannot be published without an active Easytools plan"
}
Unauthorized (401)
{
"message": "Unauthenticated."
}
Forbidden (403)
Returned when your API key has not been granted access to the requested store.
{
"message": "You do not have API access to the requested store."
}
Too Many Requests (429)
Returned when you exceed the rate limit. The Retry-After response header gives
the number of seconds to wait.
{
"message": "Too many requests. Please retry after 60 seconds."
}