Skip to main content

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​

ParameterTypeRequiredDescription
idstringYesStorefront 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:

FieldTypeNullableDescription
preview_urlstringNoTemporary 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."
}