Perform a comprehensive SEO audit on a website
curl --request POST \
--url https://api.snowseo.com/v3/seo-audit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"teamId": "<string>",
"auditType": "single",
"async": "true",
"includeTags": "<string>",
"excludeTags": "<string>",
"selection": {
"mode": "ids",
"ids": [
"<string>"
]
},
"preview": "<string>",
"urls": [
"<string>"
]
}
'import requests
url = "https://api.snowseo.com/v3/seo-audit"
payload = {
"url": "<string>",
"teamId": "<string>",
"auditType": "single",
"async": "true",
"includeTags": "<string>",
"excludeTags": "<string>",
"selection": {
"mode": "ids",
"ids": ["<string>"]
},
"preview": "<string>",
"urls": ["<string>"]
}
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({
url: '<string>',
teamId: '<string>',
auditType: 'single',
async: 'true',
includeTags: '<string>',
excludeTags: '<string>',
selection: {mode: 'ids', ids: ['<string>']},
preview: '<string>',
urls: ['<string>']
})
};
fetch('https://api.snowseo.com/v3/seo-audit', 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/seo-audit",
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([
'url' => '<string>',
'teamId' => '<string>',
'auditType' => 'single',
'async' => 'true',
'includeTags' => '<string>',
'excludeTags' => '<string>',
'selection' => [
'mode' => 'ids',
'ids' => [
'<string>'
]
],
'preview' => '<string>',
'urls' => [
'<string>'
]
]),
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/seo-audit"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\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/seo-audit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/seo-audit")
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 \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"eligibility": {
"selected": 123,
"eligible": 123,
"skipped": 123,
"byReason": {}
},
"units": 123,
"url": "<string>",
"title": "<string>",
"suggestedBrand": "<string>",
"seoAudit": {
"overallScore": 123,
"totalTests": 123,
"passedTests": 123,
"timestamp": "2023-11-07T05:31:56Z",
"brandName": "<string>",
"categoryScores": {
"commonSeoIssues": 123,
"serverAndSecurity": 123,
"mobileUsability": 123,
"advancedSeo": 123,
"content": 123,
"socialTags": 123,
"localization": 123,
"performance": 123,
"links": 123
},
"results": {
"commonSeoIssues": {},
"serverAndSecurity": {},
"mobileUsability": {},
"advancedSeo": {},
"content": {},
"socialTags": {},
"localization": {},
"performance": {},
"links": {}
},
"auditSummary": {
"score": 123,
"grade": "<string>",
"status": "<string>",
"categories": {
"commonSeo": {
"score": 123,
"status": "<string>"
},
"security": {
"score": 123,
"status": "<string>"
},
"mobile": {
"score": 123,
"status": "<string>"
},
"advanced": {
"score": 123,
"status": "<string>"
},
"content": {
"score": 123,
"status": "<string>"
},
"socialTags": {
"score": 123,
"status": "<string>"
},
"localization": {
"score": 123,
"status": "<string>"
},
"performance": {
"score": 123,
"status": "<string>"
},
"links": {
"score": 123,
"status": "<string>"
}
}
},
"linkDistribution": {
"total": 123,
"external": 123,
"internal": 123,
"nofollow": 123,
"noreferrer": 123,
"dofollow": 123,
"noopener": 123,
"anchor": 123
},
"metadata": {
"metadataFoundCount": 123,
"chart": {},
"detectedCms": "<string>",
"images": {
"totalImages": 123,
"imageTypeDistribution": {},
"imageIssues": {
"brokenImages": 123,
"bigImages": 123,
"slowImages": 123,
"missingAltTags": 123
}
}
}
},
"screenshot": "<string>",
"success": true,
"message": "<string>",
"totalPages": 123,
"auditStatus": "running",
"acceptedUrls": [
"<string>"
],
"acceptedAt": 123,
"results": [
{
"url": "<string>",
"score": 123,
"data": {}
}
]
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Website Analysis
SEO Audit
Run an SEO audit for a page or a website.
POST
/
v3
/
seo-audit
Perform a comprehensive SEO audit on a website
curl --request POST \
--url https://api.snowseo.com/v3/seo-audit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"teamId": "<string>",
"auditType": "single",
"async": "true",
"includeTags": "<string>",
"excludeTags": "<string>",
"selection": {
"mode": "ids",
"ids": [
"<string>"
]
},
"preview": "<string>",
"urls": [
"<string>"
]
}
'import requests
url = "https://api.snowseo.com/v3/seo-audit"
payload = {
"url": "<string>",
"teamId": "<string>",
"auditType": "single",
"async": "true",
"includeTags": "<string>",
"excludeTags": "<string>",
"selection": {
"mode": "ids",
"ids": ["<string>"]
},
"preview": "<string>",
"urls": ["<string>"]
}
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({
url: '<string>',
teamId: '<string>',
auditType: 'single',
async: 'true',
includeTags: '<string>',
excludeTags: '<string>',
selection: {mode: 'ids', ids: ['<string>']},
preview: '<string>',
urls: ['<string>']
})
};
fetch('https://api.snowseo.com/v3/seo-audit', 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/seo-audit",
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([
'url' => '<string>',
'teamId' => '<string>',
'auditType' => 'single',
'async' => 'true',
'includeTags' => '<string>',
'excludeTags' => '<string>',
'selection' => [
'mode' => 'ids',
'ids' => [
'<string>'
]
],
'preview' => '<string>',
'urls' => [
'<string>'
]
]),
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/seo-audit"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\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/seo-audit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/seo-audit")
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 \"url\": \"<string>\",\n \"teamId\": \"<string>\",\n \"auditType\": \"single\",\n \"async\": \"true\",\n \"includeTags\": \"<string>\",\n \"excludeTags\": \"<string>\",\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"preview\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"eligibility": {
"selected": 123,
"eligible": 123,
"skipped": 123,
"byReason": {}
},
"units": 123,
"url": "<string>",
"title": "<string>",
"suggestedBrand": "<string>",
"seoAudit": {
"overallScore": 123,
"totalTests": 123,
"passedTests": 123,
"timestamp": "2023-11-07T05:31:56Z",
"brandName": "<string>",
"categoryScores": {
"commonSeoIssues": 123,
"serverAndSecurity": 123,
"mobileUsability": 123,
"advancedSeo": 123,
"content": 123,
"socialTags": 123,
"localization": 123,
"performance": 123,
"links": 123
},
"results": {
"commonSeoIssues": {},
"serverAndSecurity": {},
"mobileUsability": {},
"advancedSeo": {},
"content": {},
"socialTags": {},
"localization": {},
"performance": {},
"links": {}
},
"auditSummary": {
"score": 123,
"grade": "<string>",
"status": "<string>",
"categories": {
"commonSeo": {
"score": 123,
"status": "<string>"
},
"security": {
"score": 123,
"status": "<string>"
},
"mobile": {
"score": 123,
"status": "<string>"
},
"advanced": {
"score": 123,
"status": "<string>"
},
"content": {
"score": 123,
"status": "<string>"
},
"socialTags": {
"score": 123,
"status": "<string>"
},
"localization": {
"score": 123,
"status": "<string>"
},
"performance": {
"score": 123,
"status": "<string>"
},
"links": {
"score": 123,
"status": "<string>"
}
}
},
"linkDistribution": {
"total": 123,
"external": 123,
"internal": 123,
"nofollow": 123,
"noreferrer": 123,
"dofollow": 123,
"noopener": 123,
"anchor": 123
},
"metadata": {
"metadataFoundCount": 123,
"chart": {},
"detectedCms": "<string>",
"images": {
"totalImages": 123,
"imageTypeDistribution": {},
"imageIssues": {
"brokenImages": 123,
"bigImages": 123,
"slowImages": 123,
"missingAltTags": 123
}
}
}
},
"screenshot": "<string>",
"success": true,
"message": "<string>",
"totalPages": 123,
"auditStatus": "running",
"acceptedUrls": [
"<string>"
],
"acceptedAt": 123,
"results": [
{
"url": "<string>",
"score": 123,
"data": {}
}
]
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Run SEO checks for one page or crawl a site for a broader audit. Send the options in the JSON body.
GET /v3/seo-audit supports the same audit with query parameters; it requires url, because urls (batch) is POST only.
Single-page audits stream newline-delimited JSON (application/x-ndjson). Progress lines contain status; the final line contains url, seoAudit, and screenshot. The seoAudit object includes overall and category scores, individual checks, and an audit summary. Read the final line to get the completed result. If an error occurs after streaming begins, it arrives as an error line while the HTTP status remains 200.
Preview and multiple-page modes return ordinary JSON. Their shape depends on the selected options: a preview includes a suggested brand, a selected-page audit includes auditStatus, totalPages, acceptedUrls, and acceptedAt, and a synchronous multiple-page audit includes results. Full-site background audits also include acceptedAt. Background audits do not return a job ID. Poll GET /v3/seo-audit/active-run?teamId=<teamId> for the team’s audit status, progress, and in-flight page URLs.
auditProgress is weighted by the target-page counts of currently active runs. It is not a cumulative percentage of every run started in the browser, so it may drop when one of several runs finishes.
Body and query fields: url (required unless urls is sent), urls (POST only; audit selected pages, requires teamId), teamId (required for background and crawlOnly runs, and the caller must belong to the team), auditType (single default, or multiple), async (multiple mode; defaults to true), crawlOnly (discover pages without auditing them), preview, brandName, includeTags, excludeTags.
Each audited page counts against your plan’s page-audit allowance. If it is exhausted, the call returns 402. Starting a full-site audit while one is already running returns 409.
A website-wide audit can take time and may continue in the background. Check the active-run endpoint before starting another run for the team.
Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Body
application/json
URL to audit (https:// prefixed automatically)
Team ID (required for async multiple mode)
Audit mode: single page or deep multi-page crawl
Available options:
single, multiple Enable async background processing (multiple mode only)
Available options:
true, false HTML tags to include during crawl
HTML tags to exclude during crawl
- Option 1
- Option 2
Show child attributes
Show child attributes
Batch of URLs to audit (alternative to url for Audit Selected). Requires teamId.
Minimum array length:
1Response
Preview and multi-page requests return JSON. Single-page audits stream status updates followed by the final result as NDJSON.
Show child attributes
Show child attributes
Final SEO audit result for a single page.
Show child attributes
Show child attributes
Available options:
running, idle Show child attributes
Show child attributes
Was this page helpful?

