Skip to main content
Perplexity

Search documentation

Type to search this documentation.

Usage Analytics

GET/v1/analytics/computer/usageUsage Analytics

Returns your organization's Perplexity usage analytics as a bucketed time series for a single dataset. Requires an organization analytics API key, generated by an org admin from Settings → Organization → Computer in the Perplexity web app. Only complete UTC grid buckets are returned: start_time snaps down to its bucket, and the in-progress bucket is never included. Datasets differ in what they count: credits for credit_usage, queries for query_volume, distinct active members for daily_active_users, and thread counts for the rest. Buckets of daily_active_users are not additive — a member active on several days is counted once per day, so summing them is not the window's active-member count.

Parameters

datasetstringqueryrequired

The dataset to query. query_volume and daily_active_users are daily organization-level datasets: they reject bucket_width=1h and user_email.

one of "credit_usage", "connectors", "artifacts", "skills", "spaces", "workflows", "task_durations", "query_volume", "daily_active_users"

one of "credit_usage", "connectors", "artifacts", "skills", "spaces", "workflows", "task_durations", "query_volume", "daily_active_users"

start_timeintegerqueryrequired

Window start in unix seconds (UTC), inclusive. Snapped down to the bucket grid, so the first bucket can include usage from before this time.

minimum 0

end_timeintegerquery

Window end in unix seconds (UTC), exclusive. Defaults to now; future values are capped at now. The window may span at most 90 days.

minimum 0

bucket_widthstringquery

Bucket size. Buckets align to the UTC grid. Not accepted as 1h for query_volume or daily_active_users, which are stored at day grain.

one of "1d", "1h"

one of "1d", "1h" · default "1d"

limitintegerquery

Buckets per page. 1d: default 7, max 31. 1h: default 24, max 168.

pagestringquery

Opaque pagination cursor from a previous response's next_page. Valid only with the same query parameters it was issued for.

user_emailstring · emailquery

Restrict results to a single member of your organization. Emails that don't match a current member return a generic 400. Not available for query_volume or daily_active_users, which are aggregated per organization; use the v2 endpoint for per-member query volume.

Responses

200Bucketed usage for the requested window. Buckets without data carry count 0; the analytics store syncs periodically, so a zero in a recent bucket can mean the data hasn't synced yet.application/json
objectComputerUsageResponse
categoriesarray of stringrequired

Category breakdown labels the requested dataset surfaces, in canonical render order. Each label is a key in every bucket's `by_categories`.

Show child attributes
dataarray of objectrequired

Every bucket in the page's window, in chronological order. Buckets without data carry count 0 and an empty breakdown.

Show child attributes
Show array items
by_categoriesobjectrequired

Category breakdowns for this bucket, keyed by the labels declared in the response's top-level `categories` list. An empty list means the bucket has no data for that breakdown.

countintegerrequired

Bucket total. For credit_usage this may exceed the sum of any single breakdown — usage without a category attribution counts toward the total but not the breakdown.

end_timeintegerrequired

Bucket end in unix seconds (UTC), exclusive.

start_timeintegerrequired

Bucket start in unix seconds (UTC), inclusive.

has_morebooleanrequired

Whether more buckets exist beyond this page. False also when the window's remaining buckets are past the current data frontier.

next_pagenull | string

Cursor for the next page; pass as the page parameter with otherwise identical query parameters.

Example response
{
  "categories": [
    "Model",
    "Credit Source"
  ],
  "data": [
    {
      "by_categories": {
        "Credit Source": [
          {
            "category": "paid",
            "count": 250
          },
          {
            "category": "promo",
            "count": 80
          }
        ],
        "Model": [
          {
            "category": "claude-opus-4-8",
            "count": 210
          },
          {
            "category": "claude-sonnet-4-6",
            "count": 120
          }
        ]
      },
      "count": 350,
      "end_time": 1746144000,
      "start_time": 1746057600
    }
  ],
  "has_more": false,
  "next_page": null
}
400Invalid parameters (type: bad_request) or semantically invalid request (type: invalid_request) — e.g. start_time after end_time, a window over 90 days, a misused pagination cursor, or a user_email that doesn't match a member of the organization.application/json
objectAnalyticsErrorResponse
errorobjectrequired
Show child attributes
codeintegerrequired
messagestringrequired
typestringrequired
Example response
{
  "error": {
    "code": 400,
    "message": "start_time must be before end_time.",
    "type": "invalid_request"
  }
}
401Missing or invalid API key (type: unauthorized).application/json
objectAnalyticsErrorResponse
errorobjectrequired
Show child attributes
codeintegerrequired
messagestringrequired
typestringrequired
Example response
{
  "error": {
    "code": 0,
    "message": "string",
    "type": "string"
  }
}
404The Analytics API is not enabled for this organization (type: feature_disabled).application/json
objectAnalyticsErrorResponse
errorobjectrequired
Show child attributes
codeintegerrequired
messagestringrequired
typestringrequired
Example response
{
  "error": {
    "code": 0,
    "message": "string",
    "type": "string"
  }
}
429Rate limit exceeded (type: request_rate_limit_exceeded). Limits apply per organization across all of its keys.application/json
objectAnalyticsErrorResponse
errorobjectrequired
Show child attributes
codeintegerrequired
messagestringrequired
typestringrequired
Example response
{
  "error": {
    "code": 0,
    "message": "string",
    "type": "string"
  }
}
Documentation menu