Skip to main content
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 CaseExample
Run site auditsCheck any website’s SEO health score and get detailed findings
Track keywordsAdd, list, and monitor keyword rankings over time
Fetch traffic dataPull GSC and Google Analytics metrics for your articles
Manage articlesList, create, and publish content via connected CMS
Read brand settingsPull brand info, target audience, and competitors
Build dashboardsPipe 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:
GroupDescription
Website AnalysisAudit, ratings, backlinks, health score
Keywords & ResearchKeyword research, suggestions, search history
Traffic & AnalyticsGSC and Google Analytics data
Rank TrackingTracked keywords, position history, changes
ContentArticle management and CMS integration
DashboardActivity feed and overview data
SettingsBrand settings and configuration
Browse all endpoints using the navigation on the left.

Response Format

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:
CodeMeaning
200Success
201Created
400Bad request — check your parameters
401Unauthorized — invalid or missing API key
403Forbidden — valid key but no access to this resource
404Not found
429Rate limited
500Internal error — something went wrong on our end
503Service 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?