curl -X GET 'https://api.snowseo.com/v3/organization/portfolio?organizationId=org_67890&start=2026-06-01&end=2026-06-30' \
-H 'Authorization: Bearer <your_api_key>'
{
"asOf": "2026-06-30T09:12:00.000Z",
"isAgency": true,
"kpis": {
"timeSavedHours": 42.5,
"articlesWritten": 8,
"reports": 3,
"activeBrands": 4
},
"brands": [
{
"teamId": "team_12345",
"name": "Acme Marketing",
"domain": "acme.com",
"logoUrl": "https://assets.snowseo.com/logos/acme-logo.png",
"status": "green",
"aiVisibility": {
"value": 78,
"delta": 5,
"sparkline": [72, 73, 75, 78]
},
"sparklineDates": ["2026-06-27", "2026-06-28", "2026-06-29", "2026-06-30"],
"domainRating": 64,
"todos": { "count": 6, "now": 2 },
"trackedPrompts": { "count": 35, "delta": 4 },
"trackedKeywords": { "count": 150, "delta": 12 },
"search": {
"clicks": 4210,
"delta": 9,
"sparkline": [120, 138, 145, 160]
},
"traffic": {
"visits": 9800,
"delta": -3,
"sparkline": [300, 290, 275, 260]
}
}
]
}
Dashboard
Brands Overview
Get the organization-wide ‘All Brands’ portfolio overview - per-brand health plus org KPIs.
GET
/
v3
/
organization
/
portfolio
curl -X GET 'https://api.snowseo.com/v3/organization/portfolio?organizationId=org_67890&start=2026-06-01&end=2026-06-30' \
-H 'Authorization: Bearer <your_api_key>'
{
"asOf": "2026-06-30T09:12:00.000Z",
"isAgency": true,
"kpis": {
"timeSavedHours": 42.5,
"articlesWritten": 8,
"reports": 3,
"activeBrands": 4
},
"brands": [
{
"teamId": "team_12345",
"name": "Acme Marketing",
"domain": "acme.com",
"logoUrl": "https://assets.snowseo.com/logos/acme-logo.png",
"status": "green",
"aiVisibility": {
"value": 78,
"delta": 5,
"sparkline": [72, 73, 75, 78]
},
"sparklineDates": ["2026-06-27", "2026-06-28", "2026-06-29", "2026-06-30"],
"domainRating": 64,
"todos": { "count": 6, "now": 2 },
"trackedPrompts": { "count": 35, "delta": 4 },
"trackedKeywords": { "count": 150, "delta": 12 },
"search": {
"clicks": 4210,
"delta": 9,
"sparkline": [120, 138, 145, 160]
},
"traffic": {
"visits": 9800,
"delta": -3,
"sparkline": [300, 290, 275, 260]
}
}
]
}
This endpoint covers the whole organization. It works with an organization API key (for the key’s own organization only), a signed-in session, or the MCP server. A brand API key returns
403 with code API_KEY_ROUTE_NOT_ALLOWED.brandDailyStats). When the window ends today and a brand has no snapshot from the last day, up to 8 such brands are computed live during the request (Search Console, analytics, AI visibility), so those calls can be slower. The live results are not stored, and any stale brands past the 8 per request are not recomputed in that response. To force a fresh recompute, call POST /v3/organization/portfolio/refresh (optional body organizationId), which enqueues snapshot jobs and returns { "enqueued": <count> }.
Deltas & sparklines
- Point metrics (AI visibility):
deltais the absolute change of the latest in-window value vs. the prior equal-length window. It is0when there is no prior value. - Count metrics (search clicks, traffic visits):
deltais the percentage change of the window sums, rounded to a whole number. It is0when the prior sum is0or missing. - Sparklines are the daily series across the selected window.
Top-level fields
| Field | Type | Description |
|---|---|---|
asOf | String (nullable) | ISO timestamp of the most recent snapshot row used; null when no snapshot exists yet. |
isAgency | Boolean | Whether the organization is configured as an agency (controls the reports KPI). |
kpis | Object | Organization-level totals for the window (see below). |
brands | Array | Per-brand rows (see below). |
kpis
| Field | Type | Description |
|---|---|---|
timeSavedHours | Number | Estimated hours saved from generated content (~1000 words ≈ 1 hour), to 1 decimal place. |
articlesWritten | Number | Every article created in the window, whatever its source or status - the set the timeSavedHours estimate is derived from. |
reports | Number (nullable) | Report emails delivered in the window (sends logged for client reports); null when the org is not an agency. |
activeBrands | Number | Count of onboarded, non-archived brands in this org that the user is a member of (not every brand in the org). |
brands[]
| Field | Type | Description |
|---|---|---|
teamId | String | The brand/team identifier. |
name | String | Brand display name. |
domain | String | The brand’s stored website, exactly as saved (it may include the scheme or path). Empty string when none. |
logoUrl | String (nullable) | Brand logo URL. |
status | String | Health indicator: green, amber, or red (derived from AI visibility value and delta). |
aiVisibility | Object | { value, delta, sparkline[] } - latest AI visibility score, absolute change, and daily series. |
sparklineDates | String[] | The day (YYYY-MM-DD) of each point in the aiVisibility, search, and traffic sparklines, by index. |
domainRating | Number (nullable) | Ahrefs Domain Rating for the brand’s root domain; null when not yet fetched, when the stored rating is stale, or when no root domain can be derived from the brand’s website. |
todos | Object | { count, now } - open next steps, and how many are priority now. |
trackedPrompts | Object | { count, delta } - enabled tracked prompts, and how many were added in the window. |
trackedKeywords | Object | { count, delta } - active tracked keywords, and how many were added in the window. |
search | Object (nullable) | { clicks, delta, sparkline[] } from Search Console; null when the snapshot has no Search Console clicks in the window (not connected, or no snapshot yet). |
traffic | Object (nullable) | { visits, delta, sparkline[] } from analytics; null when the snapshot has no analytics sessions in the window (not connected, or no snapshot yet). |
Metrics come from the persisted daily snapshot. If a brand has no data yet for the window (no audit, no AI visibility runs, or a disconnected integration), the relevant metric returns
null (search, traffic, domainRating) or 0 (counts), and sparklines return empty or partial series.Omit
organizationId for single-org users. A user in several organizations who omits it gets 400, so resolve the organization from any of your teams first (each team carries its organizationId).curl -X GET 'https://api.snowseo.com/v3/organization/portfolio?organizationId=org_67890&start=2026-06-01&end=2026-06-30' \
-H 'Authorization: Bearer <your_api_key>'
{
"asOf": "2026-06-30T09:12:00.000Z",
"isAgency": true,
"kpis": {
"timeSavedHours": 42.5,
"articlesWritten": 8,
"reports": 3,
"activeBrands": 4
},
"brands": [
{
"teamId": "team_12345",
"name": "Acme Marketing",
"domain": "acme.com",
"logoUrl": "https://assets.snowseo.com/logos/acme-logo.png",
"status": "green",
"aiVisibility": {
"value": 78,
"delta": 5,
"sparkline": [72, 73, 75, 78]
},
"sparklineDates": ["2026-06-27", "2026-06-28", "2026-06-29", "2026-06-30"],
"domainRating": 64,
"todos": { "count": 6, "now": 2 },
"trackedPrompts": { "count": 35, "delta": 4 },
"trackedKeywords": { "count": 150, "delta": 12 },
"search": {
"clicks": 4210,
"delta": 9,
"sparkline": [120, 138, 145, 160]
},
"traffic": {
"visits": 9800,
"delta": -3,
"sparkline": [300, 290, 275, 260]
}
}
]
}
Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Query Parameters
Organization ID (from list_teams). Optional when the user belongs to a single org; required to pick one when they belong to several.
Window start date (YYYY-MM-DD, in the requester's time zone). Defaults to 30 days before end; omit with an end date for All Time (from the first stored data, no prior-period deltas).
Window end date (YYYY-MM-DD, in the requester's time zone). Defaults to today; a future date is clamped to today.
Was this page helpful?

