Meet the new Scripe, live on October 7.Register

OpenAPI reference · Analytics

Analytics report across every reachable workspace (JSON)

GET/analytics/cross-workspace/report

The 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

  • Authorizationstringrequired

    Bearer token in the Authorization header.

    Pass Authorization: Bearer scripe_sk_live_<...> (or scripe_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 except webhooks:manage, which is grantable to OAuth tokens only today — the webhook-endpoint operations answer 403 scope_missing to every API key. Operations that name no scope accept any valid token of the workspace.

Query parameters

  • workspaceIdstring

    One Clerk organisation id, or a comma-separated list, from GET /v1/workspaces. Omit (or pass all) for every reachable workspace.

  • dateFromstring <date-time>

    ISO 8601 or YYYY-MM-DD lower bound (inclusive).

  • dateTostring <date-time>

    ISO 8601 or YYYY-MM-DD upper bound (inclusive).

  • currencystring

    Currency for the Earned Media Value figure.

    Allowed values: EUR, USD, GBP

    Default: "USD"

  • cpmnumber

    Cost-per-mille rate used to compute Earned Media Value (impressions / 1000 x cpm). Defaults to 35.

    Default: 35

Header parameters

  • Scripe-Api-Versionstring

    Pin the API version. Format YYYY-MM-DD. Omit to receive the currently rolling default. Unknown versions return 400 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

bash
curl --request GET \
  --url 'https://api.scripe.io/v1/analytics/cross-workspace/report' \
  --header 'Authorization: Bearer <token>'

Example response (200)

json
{
  "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
  }
}