curl --request POST \
--url https://api.snowseo.com/v3/generate-article/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "<string>",
"teamId": "<string>",
"customInstructions": "<string>",
"customInstructionsUseWithBrand": true,
"targetWordCount": 5150
}
'import requests
url = "https://api.snowseo.com/v3/generate-article/start"
payload = {
"slug": "<string>",
"teamId": "<string>",
"customInstructions": "<string>",
"customInstructionsUseWithBrand": True,
"targetWordCount": 5150
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: '<string>',
teamId: '<string>',
customInstructions: '<string>',
customInstructionsUseWithBrand: true,
targetWordCount: 5150
})
};
fetch('https://api.snowseo.com/v3/generate-article/start', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snowseo.com/v3/generate-article/start",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'slug' => '<string>',
'teamId' => '<string>',
'customInstructions' => '<string>',
'customInstructionsUseWithBrand' => true,
'targetWordCount' => 5150
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/generate-article/start"
payload := strings.NewReader("{\n \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\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.snowseo.com/v3/generate-article/start")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/generate-article/start")
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 \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"generating": true,
"slug": "<string>",
"requiredCredits": 123,
"message": "<string>",
"alreadyRunning": true
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Start Generation
Start content generation for an existing draft article.
curl --request POST \
--url https://api.snowseo.com/v3/generate-article/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "<string>",
"teamId": "<string>",
"customInstructions": "<string>",
"customInstructionsUseWithBrand": true,
"targetWordCount": 5150
}
'import requests
url = "https://api.snowseo.com/v3/generate-article/start"
payload = {
"slug": "<string>",
"teamId": "<string>",
"customInstructions": "<string>",
"customInstructionsUseWithBrand": True,
"targetWordCount": 5150
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: '<string>',
teamId: '<string>',
customInstructions: '<string>',
customInstructionsUseWithBrand: true,
targetWordCount: 5150
})
};
fetch('https://api.snowseo.com/v3/generate-article/start', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snowseo.com/v3/generate-article/start",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'slug' => '<string>',
'teamId' => '<string>',
'customInstructions' => '<string>',
'customInstructionsUseWithBrand' => true,
'targetWordCount' => 5150
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/generate-article/start"
payload := strings.NewReader("{\n \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\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.snowseo.com/v3/generate-article/start")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/generate-article/start")
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 \"slug\": \"<string>\",\n \"teamId\": \"<string>\",\n \"customInstructions\": \"<string>\",\n \"customInstructionsUseWithBrand\": true,\n \"targetWordCount\": 5150\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"generating": true,
"slug": "<string>",
"requiredCredits": 123,
"message": "<string>",
"alreadyRunning": true
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}slug (required), teamId, customInstructions (saved on the article; send an empty string to clear), customInstructionsUseWithBrand, and targetWordCount (300-10000, only used when the draft has no outline yet). Returns { success: true, generating: true, slug, requiredCredits } when a run starts. If a run is already in progress it returns { success: true, generating: true, slug, alreadyRunning: true } instead, with no requiredCredits. 404 if the slug is not found for the team. Limited to 100 requests per day.
402 with code INSUFFICIENT_CREDITS, generating: false and requiredCredits, and nothing starts.error before reading the article with Get Article. Calling Start Generation again while a run is already in progress is safe and will not start a duplicate.Generation Status
GET /v3/generate-article/generation-status?slug=<slug>
Check whether an article is currently being generated or updated, and how far along it is. Pass the article’s slug as a query parameter. When generating is false, check error before reading the article; a successful new generation has status: "generated". The response includes slug, articleId, status, generating, kind (generate or update), phase, progress, enrichmentPhase (post-content JSON-LD and audit work that can continue after generating is false), and error. Returns 404 for an unknown slug.Authorizations
Your SnowSEO API key (sk_...).
Body
Slug of the draft article to generate.
Team id (falls back to the session's active project).
Optional free-text writing instructions for this article, layered on top of the team's default content guidelines. Persists onto the article for future regenerations. Omit to leave the stored value unchanged; send an empty string to clear it.
When true (default), the article's custom instructions are applied together with the brand's content guidelines. When false, they replace the brand guidelines for this article. Persists onto the article.
Target article length in words. Only used when the draft has NO outline yet - the worker plans one and this sets its size (and the credit cost). Ignored when an outline already exists, since its own target wins. Defaults to 1900.
300 <= x <= 10000Response
Success: { success:true, generating:true, slug } (+ alreadyRunning:true when a run was already in flight).
Was this page helpful?

