REST

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:

GETPOSTPATCHDELETEOPTIONS

Endpoints

RouteMethodsSummaryRef
/api/v1/health
GET
Service health checkView
/api/v1/portfolio
GET
Portfolio health summaryView
/api/v1/alerts
GET
Active alerts across the portfolioView
/api/v1/sites
GET
List all sitesView
/api/v1/sites/:siteId
GET
Site overviewView
/api/v1/sites/:siteId/metrics
GET
Raw metric snapshotsView
/api/v1/sites/:siteId/cwv
GET
Core Web Vitals statusView
/api/v1/sites/:siteId/keywords
GETPOSTDELETE
Keyword trends and tracked targetsView
/api/v1/sites/:siteId/pages
GET
Top pagesView
/api/v1/sites/:siteId/campaigns
GETPOST
List campaignsView
/api/v1/sites/:siteId/campaigns/:campaignId
GETPATCHDELETE
Campaign detailView

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": { ... }
}