OpenAPI reference · Analytics
Analytics report across every reachable workspace (JSON)
/analytics/cross-workspace/reportThe full analytics report — executive summary, earned media value,
per-author performance, top posts, daily engagement series,
follower timeline — for every workspace the caller can reach, one
report per workspace under data.workspaces[].report.
Deliberately JSON only: the PDF and CSV renderers behind
GET /v1/analytics/report lay out ONE organisation's report, and
a file that concatenated several of them would be a different
document. Fetch the per-workspace file from
GET /v1/analytics/report with a Scripe-Workspace-Id header
when a document is what you want.
It visits fewer workspaces per call than the overview
(meta.max_workspaces) because it returns a whole document each,
and each report.posts[] holds only the top
meta.posts_per_workspace posts of the period by impressions
while report.postsTotal counts them all — page the rest with
GET /v1/analytics/posts, one workspace at a time.
Reach, skipping, truncation, the API-key refusal and the
projectId rejection are exactly as on
/v1/analytics/cross-workspace/overview.
Required scopes: analytics:read and workspace:read.
Authorization
AuthorizationstringrequiredBearer token in the Authorization header.
Pass
Authorization: Bearer scripe_sk_live_<...>(orscripe_sk_test_<...>for test keys) on every request. Keys are scoped to a single workspace and can be revoked from the Scripe dashboard.The same header also accepts an OAuth 2.1 access token (
scripe_oat_*); both credentials share one scope vocabulary and every operation below documents the scope it requires. An API key can hold every scope named on this surface exceptwebhooks:manage, which is grantable to OAuth tokens only today — the webhook-endpoint operations answer403 scope_missingto every API key. Operations that name no scope accept any valid token of the workspace.
Query parameters
workspaceIdstringOne Clerk organisation id, or a comma-separated list, from
GET /v1/workspaces. Omit (or passall) for every reachable workspace.dateFromstring <date-time>ISO 8601 or
YYYY-MM-DDlower bound (inclusive).dateTostring <date-time>ISO 8601 or
YYYY-MM-DDupper bound (inclusive).currencystringCurrency for the Earned Media Value figure.
Allowed values:
EUR,USD,GBPDefault: "USD"
cpmnumberCost-per-mille rate used to compute Earned Media Value (impressions / 1000 x cpm). Defaults to 35.
Default: 35
Header parameters
Scripe-Api-VersionstringPin the API version. Format
YYYY-MM-DD. Omit to receive the currently rolling default. Unknown versions return400 version_unsupported.
Responses
- 200
One analytics report per reachable workspace.
- 400
Malformed request (bad cursor, bad limit, etc.).
- 401
Missing, malformed, expired, or revoked API key.
- 403
Plan not eligible, scope missing, or workspace mismatch.
- 404
Resource not found in this workspace.
- 429
Sliding-window rate limit exceeded.
Example request
curl --request GET \
--url 'https://api.scripe.io/v1/analytics/cross-workspace/report' \
--header 'Authorization: Bearer <token>'Example response (200)
{
"data": {
"range": {
"from": "2026-08-10T09:00:00Z",
"to": "2026-08-10T09:00:00Z"
},
"currency": "EUR",
"cpm": 0,
"workspaces": [
{
"workspace": {
"id": "org_a1b2c3d4e5f6g7h8",
"name": "string",
"is_default": true,
"reach": "member"
},
"report": {}
}
]
},
"meta": {
"selection": "all_reachable",
"workspaces_reachable": 0,
"workspaces_returned": 0,
"max_workspaces": 0,
"truncated": true,
"skipped": [
{
"workspace_id": "string",
"reason": "no_readable_projects"
}
],
"projects_truncated": [
"string"
],
"posts_per_workspace": 0
}
}