Send a URL. Get a structured audit report.
9 technical SEO checks in a single HTTP call.
# Run a full technical SEO audit
POST https://seonar.io/api/v1/check
Authorization: Bearer sk_live_••••••••
{
"url": "https://example.com"
}
↓ 200 OK · 4.2s
{
"summary": {
"overall_score": 74,
"passed": 6, "warnings": 2, "failed": 1
},
"results": {
"robots_txt": { "status": "pass", "score": 100 },
"sitemap": { "status": "pass", "score": 100 },
"meta_tags": { "status": "warn", "score": 70 },
"canonical": { "status": "pass", "score": 100 },
"structured_data": { "status": "warn", "score": 60 },
"security_headers":{ "status": "pass", "score": 90 },
"redirect_chain": { "status": "pass", "score": 100 },
"hreflang": { "status": "pass", "score": 100 },
"internal_links": { "status": "fail", "score": 40 }
}
}
Every check returns a status, a score, actionable issues, and raw data.
robots_txt
Existence, Disallow rules, Sitemap directive, syntax errors.
sitemap
XML validity, URL count, lastmod dates, sitemap index support.
meta_tags
Title length, meta description, Open Graph, Twitter Card.
canonical
Presence, self-referencing, multiple conflicting canonicals.
structured_data
JSON-LD presence, schema types, validity, rich snippet eligibility.
security_headers
HSTS, X-Frame-Options, CSP, X-Content-Type-Options, Referrer-Policy.
redirect_chain
Chain length, redirect loops, HTTPS final destination.
hreflang
Language tags, valid BCP-47 codes, x-default, duplicates.
internal_links
Broken internal links (404s), total link count, sampling.
One endpoint. Bearer token auth. Every response follows the same shape — easy to parse, easy to integrate.
Omit the checks array and all checks run by default.
Pass ["robots_txt", "sitemap"] to run only what you need.
Every check returns status, score, issues[], and data.
20 checks/minute per API key. Headers tell you exactly where you stand.
POST /api/v1/check
Authorization: Bearer {token}
{
"url": "https://example.com",
"checks": ["robots_txt"]
}
{
"url": "https://example.com",
"checked_at": "2026-02-22T10:00:00Z",
"results": {
"robots_txt": {
"status": "warn",
"score": 70,
"issues": [{
"severity": "warning",
"message": "No Sitemap directive",
"detail": "Add Sitemap: https://..."
}],
"data": {
"exists": true,
"blocks_all": false,
"sitemaps": []
}
}
},
"summary": {
"overall_score": 70,
"passed": 0, "warnings": 1, "failed": 0
}
}
GET /api/v1/checks
Pay per check or subscribe for volume.
Need more? Contact us for custom plans.
Full reference for the Seonar API.
All write endpoints require a Bearer token. Register at seonar.io to get yours — no credit card required for the free plan.
Pass the token in the Authorization header of every authenticated request.
POST /api/v1/check
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx
Content-Type: application/json
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /api/v1/checks |
— | List all available check keys |
| POST | /api/v1/check |
Bearer | Run SEO checks on a URL |
JSON body, Content-Type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
url |
string | required | Fully qualified URL to audit (must include scheme: https://) |
checks |
string[] | optional | Subset of check keys to run. Omit to run all 9 checks. See available checks. |
url |
string | The audited URL |
checked_at |
ISO 8601 | Timestamp of the audit |
results |
object | Keyed by check name |
summary |
object | Aggregate scores across all checks |
status |
string | pass · warn · fail · error |
score |
integer | 0 – 100 |
issues |
array | List of findings (may be empty) |
data |
object | Raw check-specific data |
severity |
string | critical · warning · info |
message |
string | Short human-readable finding |
detail |
string | Actionable fix suggestion |
{
"url": "https://example.com",
"checked_at": "2026-02-22T10:00:00Z",
"results": {
"meta_tags": {
"status": "warn",
"score": 70,
"issues": [
{
"severity": "warning",
"message": "Title too long",
"detail": "Keep title under 60 chars"
}
],
"data": {
"title": "My Very Long Page Title That Exceeds...",
"title_length": 82,
"description": "Page meta description",
"og_title": "My Page",
"og_description": "...",
"twitter_card": "summary_large_image"
}
}
},
"summary": {
"total_checks": 1,
"passed": 0,
"warnings": 1,
"failed": 0,
"errors": 0,
"overall_score": 70
}
}
| HTTP | When | Body key |
|---|---|---|
| 401 | Missing or invalid Bearer token | message |
| 422 | Validation error — invalid URL format or unknown check key | errors |
| 429 | Rate limit exceeded (20 checks / minute per token) | message |
| 500 | Unexpected server error | message |
curl -X POST \
https://seonar.io/api/v1/check \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
const res = await fetch(
'https://seonar.io/api/v1/check',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://example.com',
}),
}
);
const data = await res.json();
import requests
resp = requests.post(
"https://seonar.io/api/v1/check",
headers={
"Authorization": f"Bearer {token}",
},
json={
"url": "https://example.com",
},
)
data = resp.json()
Add an SEO health score to your product dashboard without building the crawler yourself.
Automate the technical audit layer of your service. Feed results into your reporting pipeline.
Gate deployments on SEO health. Fail the build if canonical tags break or robots.txt blocks crawlers.
Register, grab your API key, and run your first check. No credit card required for the free plan.
# 1. Get your free API key at seonar.io
# 2. Run your first check
curl -X POST https://seonar.io/api/v1/check \
-H "Authorization: Bearer {your_token}" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-site.com"}'