Node.js
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.blogPosts.create({
categoryId: "...",
});<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->blogPosts->create([
'categoryId' => '...',
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.blogPosts.create(categoryId="...")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/blog/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"categoryId": "<string>",
"title": "How to get started"
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/blog/posts"
payload := strings.NewReader("{\n \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\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}/blog/posts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/blog/posts")
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 \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "57d066e1-e807-42dc-8d81-b0ff59fa7eb3",
"categoryId": "c3b25928-c119-4d41-8df1-0525a3a69be5",
"title": "Activating Northwind Pro",
"slug": "activating-northwind-pro",
"path": "/blog/guides/activating-northwind-pro/",
"status": "draft",
"coverUrl": null,
"views": 0,
"publishedAt": null,
"updatedAt": "2026-10-22 16:20:18.846",
"body": "",
"coverAlt": "",
"seoTitle": "",
"seoDescription": "",
"url": "https://northwind.myshoply.gg/blog/guides/activating-northwind-pro/",
"search": {
"title": "Activating Northwind Pro - Northwind Keys",
"description": "",
"html": "",
"checks": [
{
"ok": true,
"text": "The search title fits: 41 of 60 characters"
},
{
"ok": false,
"text": "No description. Search engines will use the first lines"
}
]
}
}
}{
"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": {}
}Blog
Create a blog post
Starts a post as a draft with a title and nothing else. Write it and publish it with “Update a blog post”.
Needs the blog.write permission (Change Blog).
POST
/
stores
/
{storeId}
/
blog
/
posts
Node.js
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.blogPosts.create({
categoryId: "...",
});<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->blogPosts->create([
'categoryId' => '...',
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.blogPosts.create(categoryId="...")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/blog/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"categoryId": "<string>",
"title": "How to get started"
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/blog/posts"
payload := strings.NewReader("{\n \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\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}/blog/posts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/blog/posts")
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 \"categoryId\": \"<string>\",\n \"title\": \"How to get started\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "57d066e1-e807-42dc-8d81-b0ff59fa7eb3",
"categoryId": "c3b25928-c119-4d41-8df1-0525a3a69be5",
"title": "Activating Northwind Pro",
"slug": "activating-northwind-pro",
"path": "/blog/guides/activating-northwind-pro/",
"status": "draft",
"coverUrl": null,
"views": 0,
"publishedAt": null,
"updatedAt": "2026-10-22 16:20:18.846",
"body": "",
"coverAlt": "",
"seoTitle": "",
"seoDescription": "",
"url": "https://northwind.myshoply.gg/blog/guides/activating-northwind-pro/",
"search": {
"title": "Activating Northwind Pro - Northwind Keys",
"description": "",
"html": "",
"checks": [
{
"ok": true,
"text": "The search title fits: 41 of 60 characters"
},
{
"ok": false,
"text": "No description. Search engines will use the first lines"
}
]
}
}
}{
"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.
Body
application/json

