The SnowSEO API lets you access your SEO data programmatically. Use it to run audits, check keyword rankings, look up domain ratings and backlinks, or embed SnowSEO data into your own dashboards, scripts, and integrations.
The API is available on the Scale plan. Generate API keys from Settings → Integrations → API in your dashboard. Each key is scoped to a specific brand — one key per brand.
Base URL
All API requests go to this base URL:
https://api.snowseo.com/v3
Every response is JSON. Send request bodies as JSON with the Content-Type: application/json header.
What You Can Do With the API
| Use Case | Example |
|---|
| Run site audits | Check any website’s SEO health score and get detailed findings |
| Track keywords | Add, list, and monitor keyword rankings over time |
| Fetch traffic data | Pull GSC and Google Analytics metrics for your articles |
| Manage articles | List, create, and publish content via connected CMS |
| Read brand settings | Pull brand info, target audience, and competitors |
| Build dashboards | Pipe SnowSEO data into your own BI tools or internal reports |
Authentication
All endpoints require an API key in the Authorization header:
Authorization: Bearer sk_live_your_key_here
Keys start with sk_ and are generated in Settings → Integrations → API. See the Authentication guide for full details on creating keys, scoping, and security best practices.
How to Make a Request
Here’s the typical pattern for any API call:
# 1. Choose an endpoint
# 2. Set the Authorization header
# 3. Send JSON body (for POST/PUT requests)
curl -X POST https://api.snowseo.com/v3/website-audit \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "example.com"}'
For GET requests, pass parameters as query strings:
curl "https://api.snowseo.com/v3/rank-tracking/keywords" \
-H "Authorization: Bearer YOUR_API_KEY"
Your First Integration
Here’s a minimal Node.js example to get you started:
const SNOWSEO_API_KEY = process.env.SNOWSEO_API_KEY;
const BASE_URL = 'https://api.snowseo.com/v3';
async function auditSite(url) {
const response = await fetch(`${BASE_URL}/website-audit`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${SNOWSEO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url }),
});
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
return response.json();
}
// Run it
auditSite('example.com').then(data => {
console.log(`SEO Score: ${data.seoAudit.overallScore}/100`);
});
The API key carries your brand context automatically — no need to pass teamId as a query parameter.
Endpoints Overview
The API is organized into these categories:
| Group | Description |
|---|
| Website Analysis | Audit, ratings, backlinks, health score |
| Keywords & Research | Keyword research, suggestions, search history |
| Traffic & Analytics | GSC and Google Analytics data |
| Rank Tracking | Tracked keywords, position history, changes |
| Content | Article management and CMS integration |
| Dashboard | Activity feed and overview data |
| Settings | Brand settings and configuration |
Browse all endpoints using the navigation on the left.
All responses follow a consistent structure. Successful responses return the data directly:
{
"url": "https://example.com",
"seoAudit": {
"overallScore": 87,
"totalTests": 32,
"passedTests": 28
}
}
Error responses always include an error field:
{
"error": "RESOURCE_NOT_FOUND",
"message": "Team with ID 'abc123' was not found."
}
Rate Limits
Limits vary by endpoint — most are 20–60 requests per minute, with heavier endpoints like website-ratings capped at 10 per day.
When rate limited, the API returns 429 with a retryAfter hint:
{
"error": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please wait a moment and try again.",
"retryAfter": 60
}
Handling rate limits:
- Wait for the number of seconds indicated by
retryAfter
- If you don’t have a
retryAfter value, use exponential backoff (1s, 2s, 4s, 8s…)
- If you’re regularly hitting the limit, batch your requests or add delays between calls
Error Handling
The API uses standard HTTP status codes:
| Code | Meaning |
|---|
200 | Success |
201 | Created |
400 | Bad request — check your parameters |
401 | Unauthorized — invalid or missing API key |
403 | Forbidden — valid key but no access to this resource |
404 | Not found |
429 | Rate limited |
500 | Internal error — something went wrong on our end |
503 | Service unavailable — try again later |
Always check both the HTTP status code and the error field in the response body:
const response = await fetch(url, options);
if (!response.ok) {
const error = await response.json();
console.log(error.error); // e.g., "RATE_LIMIT_EXCEEDED"
console.log(error.message); // Human-readable description
// Handle accordingly
}
Testing with cURL
The quickest way to test the API is with cURL from your terminal:
# Check your API key is working
curl https://api.snowseo.com/v3/website-ratings?url=example.com \
-H "Authorization: Bearer YOUR_KEY"
# Run a site audit
curl -X POST https://api.snowseo.com/v3/website-audit \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "example.com"}'
# List tracked keywords
curl https://api.snowseo.com/v3/rank-tracking/keywords \
-H "Authorization: Bearer YOUR_KEY"
SDKs & Client Libraries
Currently, the API is raw HTTP — no official SDK yet. The authentication guide has examples in Node.js and Python that you can copy into your project.
If you build a client library, let us know and we can list it here.
Need Help?