Leo Scanner API

Integrate comprehensive website auditing into your applications. Scan for SEO, accessibility, performance, security, and broken links programmatically.

API Version 1.0Rate Limited: 5 requests/hour

Quick Start

Get started with the Leo Scanner API in seconds. No authentication required.

Base URL

https://useleo.app/api/v1

Endpoint

POST /scan

Rate Limiting

⚠️

Rate Limits

The API is rate limited to 5 requests per hour per IP address. Rate limit information is included in response headers.

X-RateLimit-LimitMaximum requests per hour
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the limit resets

Scan Website

POST/api/v1/scan

Request Body

{
  "url": "https://example.com"
}

Parameters

url
requiredstring
The URL to scan. Must be a valid HTTP or HTTPS URL, maximum 2048 characters.

Success Response (200)

{
  "url": "https://example.com",
  "scannedAt": "2026-02-05T17:02:51.000Z",
  "overallScore": 87,
  "categories": [
    {
      "category": "seo",
      "label": "SEO",
      "score": 85,
      "issues": [
        {
          "severity": "warning",
          "title": "Missing meta description",
          "description": "The page is missing a meta description tag",
          "recommendation": "Add a meta description to improve search engine visibility",
          "howToFix": "Add <meta name=\"description\" content=\"Your description here\"> to the <head> section"
        }
      ]
    },
    {
      "category": "accessibility",
      "label": "Accessibility", 
      "score": 92,
      "issues": []
    },
    {
      "category": "performance",
      "label": "Performance",
      "score": 78,
      "issues": []
    },
    {
      "category": "security",
      "label": "Security",
      "score": 95,
      "issues": []
    },
    {
      "category": "links",
      "label": "Links",
      "score": 100,
      "issues": []
    }
  ],
  "meta": {
    "fetchTimeMs": 1250,
    "pageSize": 45632,
    "statusCode": 200
  }
}

Error Response

{
  "error": "Rate limit exceeded",
  "details": "Maximum 5 requests per hour. Please try again later."
}

Response Format

Scan Categories

Each scan analyzes your website across these categories:

🔍
SEO
Meta tags, headings, Open Graph, structured data
Accessibility
Alt text, ARIA labels, color contrast, navigation
Performance
Page size, load time, resource optimization
🔒
Security
HTTPS, security headers, mixed content
🔗
Links
Broken links, redirects, external link analysis

Issue Severity Levels

errorCritical issues that should be fixed immediately
warningImportant issues that should be addressed
infoSuggestions for improvement

Code Examples

JavaScript (fetch)

const response = await fetch('https://useleo.app/api/v1/scan', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    url: 'https://example.com'
  })
});

const result = await response.json();

if (response.ok) {
  console.log('Scan completed:', result.overallScore);
  result.categories.forEach(category => {
    console.log(`${category.label}: ${category.score}/100`);
  });
} else {
  console.error('Scan failed:', result.error);
}

Python (requests)

import requests
import json

url = 'https://useleo.app/api/v1/scan'
payload = {
    'url': 'https://example.com'
}
headers = {
    'Content-Type': 'application/json'
}

response = requests.post(url, data=json.dumps(payload), headers=headers)

if response.status_code == 200:
    result = response.json()
    print(f"Scan completed: {result['overallScore']}")
    
    for category in result['categories']:
        label = category['label']
        score = category['score']
        print(f"{label}: {score}/100")
        
        # Print issues for each category
        for issue in category['issues']:
            print(f"  {issue['severity']}: {issue['title']}")
else:
    error = response.json()
    print(f"Scan failed: {error['error']}")

cURL

curl -X POST https://useleo.app/api/v1/scan \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

HTTP Status Codes

200Scan completed successfully
400Bad request (invalid URL or request body)
429Rate limit exceeded (includes Retry-After header: 3600 seconds)
500Internal server error during scan

CORS Support

The API supports Cross-Origin Resource Sharing (CORS) with the following configuration:

  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Methods: POST, OPTIONS
  • Access-Control-Allow-Headers: Content-Type
  • Access-Control-Max-Age: 86400

This allows the API to be called directly from web browsers without CORS restrictions.

Support & Resources

Need help with the API? Have questions or feature requests?

Get Help

Contact SupportGet help with integration issues
@LeonardoDaPetraFollow for API updates

Resources

Try Leo ScannerTest the scanner manually
Documentation updatesThis page will be updated as the API evolves