API Reference
PerSeo Insights REST API v1.0
Base URL
https://insights.perseodesign.com/api/v1
The PerSeo Insights REST API lets you start SEO scans, read results, export reports and manage access tokens programmatically. Ideal for CI/CD, automated monitoring and third-party tool integrations.
To create your first API key, go to the Dashboard, section API & Token.
Authentication
All endpoints require a Bearer token in the HTTP header:
API Key (permanent)
Long-lived tokens created from the Dashboard. They start with sk_live_. Use them for scripts, automations and server-side integrations.
JWT (session 24h)
Short-lived tokens (24h) issued by POST /auth/login. Use them for interactive clients requiring explicit login.
Available scopes
| Scope | Description |
|---|---|
| read | Read access: profile, history, token list |
| scan | Start new scans (POST /scans) |
| export | Export results (GET /scans/{id}/export/{format}) |
Rate Limits
API limits mirror the website limits. Reset every 24h (sliding window).
| Tier | Single Scan/day | Sitemap Scan/day |
|---|---|---|
| Guest (unauthenticated) | 1 | 1 |
| Free (registered) | 5 | 5 |
| Pro | 50 | 10 |
For more details on plans and features, visit the Pricing page.
Response Format
All responses follow the standard JSON format:
Success
Error
Auth
/api/v1/auth/login
No auth
Authenticate with email/password and receive a JWT access token (24h).
Response 200
/api/v1/auth/verify
JWT Bearer
Verifies the validity of a JWT token.
API Tokens
/api/v1/tokens
scope: read
Lists all API keys for the authenticated user.
/api/v1/tokens
scope: read
Creates a new API key. The token is shown only once.
| Field | Type | Req. | Description |
|---|---|---|---|
| name | string | SI | Token label (max 100 chars) |
| scopes | array | NO | Default ["read"]. Values: read, scan, export |
token field in the response is shown only once. Save it immediately in a secure place.
/api/v1/tokens/{id}
scope: read
Permanently revokes (disables) an API key.
Scans
/api/v1/scans
scope: scan
Starts an asynchronous SEO scan. Returns 202 Accepted and a scan_id to use for polling.
| Field | Type | Req. | Description |
|---|---|---|---|
| url | string | SI | URL to analyze (http or https) |
| mode | string | NO | single (default) or sitemap |
Response 202 Accepted
/api/v1/scans/{scan_id}
scope: read
Retrieves status and results of a scan. Poll every 2-3 seconds until status != "running".
running
Running
complete
Completed
error
Failed
stopped
Stopped
History
/api/v1/history
scope: read
User scan history with pagination.
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | int | 1 | Page number |
| per_page | int | 20 | Results per page (max 50) |
Export
/api/v1/scans/{id}/export/{format}
scope: export
Exports scan results. Supported formats: json, csv, pdf.
User
/api/v1/user/profile
scope: read
Returns the authenticated user's profile.
/api/v1/user/usage
scope: read
Usage statistics: scans today, API requests, plan limits.
Error Codes
| Code | HTTP | Description |
|---|---|---|
MISSING_AUTH |
401 | Authorization header missing or malformed |
INVALID_TOKEN |
401 | Token invalid, expired or revoked |
INSUFFICIENT_SCOPE |
403 | Token does not have the required scope |
INVALID_CREDENTIALS |
401 | Wrong email/password |
ACCOUNT_DISABLED |
403 | Account disabled |
RATE_LIMIT_EXCEEDED |
429 | Scan or request limit exceeded |
INVALID_REQUEST |
400 | Missing or malformed parameters |
INVALID_URL |
400 | Invalid URL |
INVALID_SCOPES |
400 | Unrecognized scopes |
NOT_FOUND |
404 | Resource not found |
FORBIDDEN |
403 | Access denied (resource belongs to another user) |
INTERNAL_ERROR |
500 | Internal server error |