Programmatic access to SEO audits, keyword tracking, and reports.
All API requests require a Bearer token. Generate API keys from your Settings page.
curl https://seosync.ca/api/v1/projects \
-H "Authorization: Bearer sk_live_your_api_key_here"Keep your API keys secret. Do not expose them in client-side code or public repositories. API keys inherit the permissions of your organization plan.
| Plan | Requests/min | Max Keys |
|---|---|---|
| Free | 10 | 5 |
| Pro | 60 | 5 |
| Enterprise | 120 | 5 |
/api/v1/projectsList all projects in your organization.
// Response
{
"projects": [
{
"id": "cmm...",
"name": "My Website",
"domain": "example.com",
"createdAt": "2026-01-01T00:00:00Z",
"_count": { "audits": 5, "keywords": 12, "competitors": 3 }
}
]
}/api/v1/projects/:projectId/auditGet the latest audit for a project. Pass ?auditId=xxx for a specific audit.
// Response
{
"audit": {
"id": "cmm...",
"overallScore": 78,
"metaScore": 85,
"contentScore": 72,
"linksScore": 80,
"technicalScore": 75,
"performanceScore": 68,
"pagesCrawled": 24,
"status": "COMPLETED",
"issues": [
{ "title": "Missing meta description", "severity": "WARNING", "category": "META" }
]
}
}/api/v1/projects/:projectId/auditTrigger a new SEO audit. Returns 202 Accepted with a job ID.
// Response (202)
{
"message": "Audit queued",
"jobId": "abc123"
}/api/v1/projects/:projectId/keywordsList tracked keywords with latest ranking position.
// Response
{
"keywords": [
{
"id": "cmm...",
"term": "seo audit tool",
"position": 5,
"url": "https://example.com/seo",
"lastChecked": "2026-03-15T07:00:00Z"
}
]
}| Status | Meaning |
|---|---|
| 401 | Invalid or missing API key |
| 403 | Plan limit reached or insufficient permissions |
| 404 | Resource not found |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
const API_KEY = "sk_live_your_key";
const BASE = "https://seosync.ca/api/v1";
// List projects
const res = await fetch(`${BASE}/projects`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const { projects } = await res.json();
// Trigger audit
const audit = await fetch(`${BASE}/projects/${projects[0].id}/audit`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
});
console.log(await audit.json()); // { message: "Audit queued", jobId: "..." }import requests
API_KEY = "sk_live_your_key"
BASE = "https://seosync.ca/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# List projects
projects = requests.get(f"{BASE}/projects", headers=headers).json()["projects"]
# Get latest audit
audit = requests.get(
f"{BASE}/projects/{projects[0]['id']}/audit", headers=headers
).json()
print(f"Score: {audit['audit']['overallScore']}")# List projects
curl -H "Authorization: Bearer sk_live_your_key" \
https://seosync.ca/api/v1/projects
# Trigger audit
curl -X POST -H "Authorization: Bearer sk_live_your_key" \
https://seosync.ca/api/v1/projects/PROJECT_ID/audit