REST API v1
Standard HTTPS JSON endpoints for portfolio health, per-site metrics, keywords, campaigns, and alerts.
Base URL
https://letoseo.com/api/v1
Authentication
Every request (except GET /api/v1/health) requires a Bearer token in the Authorization header. Generate API keys from your account settings, then see the Authentication reference for the full error catalogue, rate limits, and CORS details.
CORS
The API supports cross-origin requests. The following methods are allowed in CORS preflight responses:
GETPOSTPATCHDELETEOPTIONSEndpoints
| Route | Methods | Summary | Ref |
|---|---|---|---|
/api/v1/health | GET | Service health check | View |
/api/v1/portfolio | GET | Portfolio health summary | View |
/api/v1/alerts | GET | Active alerts across the portfolio | View |
/api/v1/sites | GET | List all sites | View |
/api/v1/sites/:siteId | GET | Site overview | View |
/api/v1/sites/:siteId/metrics | GET | Raw metric snapshots | View |
/api/v1/sites/:siteId/cwv | GET | Core Web Vitals status | View |
/api/v1/sites/:siteId/keywords | GETPOSTDELETE | Keyword trends and tracked targets | View |
/api/v1/sites/:siteId/pages | GET | Top pages | View |
/api/v1/sites/:siteId/campaigns | GETPOST | List campaigns | View |
/api/v1/sites/:siteId/campaigns/:campaignId | GETPATCHDELETE | Campaign detail | View |
16 method/path pairs across 11 routes. All endpoints except /api/v1/health require authentication.
Response envelope
All successful responses wrap the payload in a data field alongside a _meta object. Paginated responses nest the items inside a data.items array with a data.next_cursor field.
// Standard response
{
"data": { ... },
"_meta": {
"generated_at": "2025-01-15T10:30:00.000Z",
"response_format": "concise"
}
}
// Paginated response
{
"data": {
"items": [ ... ],
"next_cursor": "eyJpZCI6Ij...",
"total_count": 42
},
"_meta": { ... }
}