import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.storefronts.codePublish("STOREFRONT_ID", {
rev: 1,
version: 1,
});<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->storefronts->codePublish('STOREFRONT_ID', [
'rev' => 1,
'version' => 1,
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.storefronts.codePublish("STOREFRONT_ID", rev=1, version=1)
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rev": 123,
"version": 123
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish"
payload := strings.NewReader("{\n \"rev\": 123,\n \"version\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rev\": 123,\n \"version\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rev\": 123,\n \"version\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"storefront": {
"id": "93618f34-cfad-44d8-a677-253b7238f272",
"name": "Autumn look, second go",
"theme": "keystone",
"themeVersion": "2.6.0",
"published": true,
"publishedAt": "2026-10-22T16:20:20Z",
"live": true,
"createdAt": "2026-10-22T16:20:20Z",
"updatedAt": "2026-10-22T16:20:20Z",
"code": true,
"engine": "files",
"codeOnCopy": null,
"unpublished": false,
"accent": null,
"headingFont": null,
"pages": 6
},
"theme": "keystone",
"available": true,
"started": true,
"version": 1,
"code": {
"rev": 5,
"ahead": 0,
"designAhead": false,
"base": "2.6.0",
"files": [
{
"path": "assets/theme.css",
"hash": "28159614c556580924ad89d6f391cf7584e095c9955d29452fd67c671ebb136b",
"size": 177668,
"added": false,
"changed": true,
"updatedAt": "2026-10-22T16:20:20Z"
},
{
"path": "assets/theme.js",
"hash": "ff1c708528bdf701288651d9e625dab13517f375460d1b206be9e8243345ccf0",
"size": 144234,
"added": false,
"changed": false,
"updatedAt": "2026-10-22T16:20:20Z"
}
],
"problems": [],
"limits": {
"files": 150,
"fileBytes": 262144,
"bytes": 3145728,
"used": 855369
},
"folders": {
"layout": [
"liquid"
],
"pages": [
"liquid"
],
"elements": [
"liquid"
],
"parts": [
"liquid"
],
"assets": [
"css",
"js"
],
"locales": [
"json"
],
"config": [
"json"
]
}
},
"versions": [
{
"id": "70a791ec-981a-4c83-b541-ff9887690b91",
"number": 1,
"live": true,
"files": 107,
"createdAt": "2026-10-22T16:20:20Z"
}
],
"preview": {
"url": "https://northwind.myshoply.gg",
"param": "shoply_preview",
"token": "93618f34-cfad-44d8-a677-253b7238f272.1792689620.882d8ad47e28f67f6c4cafd72eadbed89290ea46",
"seconds": 3600,
"pages": [
{
"name": "Home",
"path": "/"
},
{
"name": "All products",
"path": "/products/"
}
]
}
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Publish a storefront's code
Puts the draft live, its files and its design together, and makes this storefront the one buyers see, as Publish in the code studio does. Send rev and version from “Get a storefront’s code” as you last read it: if either has moved since (somebody saved in the meantime) it is refused with draft_conflict, so you never publish what you have not seen. A mistake in a template refuses it with code_problems, the mistakes listed in problems.
Needs the storefronts.write permission (Change Storefronts).
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.storefronts.codePublish("STOREFRONT_ID", {
rev: 1,
version: 1,
});<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->storefronts->codePublish('STOREFRONT_ID', [
'rev' => 1,
'version' => 1,
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.storefronts.codePublish("STOREFRONT_ID", rev=1, version=1)
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rev": 123,
"version": 123
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish"
payload := strings.NewReader("{\n \"rev\": 123,\n \"version\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rev\": 123,\n \"version\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/storefronts/{storefrontId}/code/publish")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rev\": 123,\n \"version\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"storefront": {
"id": "93618f34-cfad-44d8-a677-253b7238f272",
"name": "Autumn look, second go",
"theme": "keystone",
"themeVersion": "2.6.0",
"published": true,
"publishedAt": "2026-10-22T16:20:20Z",
"live": true,
"createdAt": "2026-10-22T16:20:20Z",
"updatedAt": "2026-10-22T16:20:20Z",
"code": true,
"engine": "files",
"codeOnCopy": null,
"unpublished": false,
"accent": null,
"headingFont": null,
"pages": 6
},
"theme": "keystone",
"available": true,
"started": true,
"version": 1,
"code": {
"rev": 5,
"ahead": 0,
"designAhead": false,
"base": "2.6.0",
"files": [
{
"path": "assets/theme.css",
"hash": "28159614c556580924ad89d6f391cf7584e095c9955d29452fd67c671ebb136b",
"size": 177668,
"added": false,
"changed": true,
"updatedAt": "2026-10-22T16:20:20Z"
},
{
"path": "assets/theme.js",
"hash": "ff1c708528bdf701288651d9e625dab13517f375460d1b206be9e8243345ccf0",
"size": 144234,
"added": false,
"changed": false,
"updatedAt": "2026-10-22T16:20:20Z"
}
],
"problems": [],
"limits": {
"files": 150,
"fileBytes": 262144,
"bytes": 3145728,
"used": 855369
},
"folders": {
"layout": [
"liquid"
],
"pages": [
"liquid"
],
"elements": [
"liquid"
],
"parts": [
"liquid"
],
"assets": [
"css",
"js"
],
"locales": [
"json"
],
"config": [
"json"
]
}
},
"versions": [
{
"id": "70a791ec-981a-4c83-b541-ff9887690b91",
"number": 1,
"live": true,
"files": 107,
"createdAt": "2026-10-22T16:20:20Z"
}
],
"preview": {
"url": "https://northwind.myshoply.gg",
"param": "shoply_preview",
"token": "93618f34-cfad-44d8-a677-253b7238f272.1792689620.882d8ad47e28f67f6c4cafd72eadbed89290ea46",
"seconds": 3600,
"pages": [
{
"name": "Home",
"path": "/"
},
{
"name": "All products",
"path": "/products/"
}
]
}
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Authorizations
A secret API key, made under Developers in the dashboard: Authorization: Bearer shoply_sk_...
Headers
A word of your own for this one change, up to 180 letters, digits, dots, dashes, underscores and colons. Sent again with the same key, the request is not carried out twice: the first answer comes back, with Idempotent-Replay: true.
Path Parameters
The store's ID. A key reaches the store it was made in: GET /key answers which.
The storefront.

