Portal API Reference
API endpoints for portal integration and automation.
Last updated: January 27, 2026
The Portal API allows you to integrate portal data into your own systems or build custom client-facing experiences.
Portal API endpoints require authentication via portal session token. These are designed for client-facing integrations, not agency automation.
Authentication
Portal users authenticate via email and password. A session token is stored in an HTTP-only cookie and automatically included in requests.
Login
POST /api/v1/portal/auth/login
Request:
{
"email": "user@client.com",
"password": "user-password",
"clientId": "client-uuid"
}
Response:
{
"success": true,
"user": {
"id": "user-uuid",
"email": "user@client.com",
"name": "John Smith"
}
}Session
GET /api/v1/portal/auth/session
Response:
{
"authenticated": true,
"user": {
"id": "user-uuid",
"email": "user@client.com",
"permissions": ["view_scores", "view_recommendations"]
}
}Sites Endpoints
List Sites
GET /api/v1/portal/sites
Response:
{
"sites": [
{
"id": "site-uuid",
"domain": "example.com",
"name": "Example Site",
"latestScore": 75,
"latestScanAt": "2026-01-27T10:00:00Z"
}
]
}Get Site Details
GET /api/v1/portal/sites/[id]
Response:
{
"site": {
"id": "site-uuid",
"domain": "example.com",
"name": "Example Site",
"latestScore": 75,
"latestScanAt": "2026-01-27T10:00:00Z"
},
"latestScan": {
"id": "scan-uuid",
"overallScore": 75,
"scores": { ... },
"recommendations": [ ... ],
"platformReadiness": { ... }
},
"scanHistory": [
{ "id": "...", "overallScore": 75, "completedAt": "..." }
]
}Data Endpoints
Get Recommendations
GET /api/v1/portal/recommendations
Response:
{
"recommendations": [
{
"id": "rec-uuid",
"type": "critical",
"title": "Add Schema Markup",
"description": "...",
"impact": "high",
"effort": "medium",
"siteId": "site-uuid",
"siteName": "Example Site"
}
]
}Get Competitors
GET /api/v1/portal/competitors
Response:
{
"competitors": [
{
"id": "entity-uuid",
"name": "Competitor Inc",
"entityType": "competitor",
"totalMentions": 15,
"avgSentiment": 0.2,
"siteId": "site-uuid"
}
]
}Profile Endpoints
Get Profile
GET /api/v1/portal/profile
Response:
{
"user": {
"id": "user-uuid",
"email": "user@client.com",
"name": "John Smith",
"permissions": ["view_scores", "view_recommendations"],
"lastLoginAt": "2026-01-27T10:00:00Z"
}
}Update Profile
PATCH /api/v1/portal/profile
Request:
{
"name": "John Smith Updated"
}
Response:
{
"user": {
"id": "user-uuid",
"email": "user@client.com",
"name": "John Smith Updated"
}
}Change Password
POST /api/v1/portal/auth/change-password
Request:
{
"currentPassword": "old-password",
"newPassword": "new-password",
"confirmPassword": "new-password"
}
Response:
{
"success": true
}Error Responses
All endpoints return standard error responses:
// 401 Unauthorized
{ "error": "Not authenticated" }
// 403 Forbidden
{ "error": "Permission denied" }
// 404 Not Found
{ "error": "Site not found" }
// 500 Internal Server Error
{ "error": "Failed to get sites" }