Overview
The Analytics API gives Perplexity Enterprise organizations programmatic access to organization usage analytics across Perplexity — credits, query volume, active members, connectors, artifacts, skills, spaces, workflows, and task durations — as bucketed time series you can pull into BI tools or internal reporting. Credit usage and query volume can also be broken down per member. Analytics requests are free and don’t consume API credits.This API is available to Perplexity Enterprise organizations. If you don’t see the Analytics API toggle described below, the feature may not be enabled for your organization yet — contact your Perplexity representative.
Getting Access
Access is managed by your organization’s admins from the Perplexity web app:1
Enable the Analytics API
In the Perplexity web app, open your organization’s Computer settings and find the Analytics section. Turn on Analytics API to provision API access for your organization.
2
Generate your API key
In the row that appears below the toggle, select Generate key.
- Org-scoped, admin-managed — the key belongs to your organization, not to the admin who created it. Any org admin can view the current key and regenerate it.
- One active key — your organization has at most one active analytics key. Regenerating revokes the previous key.
- Analytics-only — the key authenticates analytics endpoints only; it cannot call other Perplexity APIs and has no billing attached.
- Disabling revokes — turning the Analytics API toggle off permanently revokes the key.
Authentication
SetPERPLEXITY_ANALYTICS_API_KEY to your organization’s Analytics API key and pass it as a bearer token. Use this separate variable to avoid replacing the standard PERPLEXITY_API_KEY used for other APIs. The examples below calculate a recent seven-day window; keep its start and end fixed when paginating.
Shell examples require Bash, cURL, and jq. Python examples require the requests package.
Querying Usage
GET /v1/analytics/computer/usage returns one time series per request, for a single dataset.
Parameters
Datasets
Each dataset measures something different. Most accept both bucket widths and a member filter;query_volume and daily_active_users are aggregated daily for the whole organization and accept neither.
Requesting
bucket_width=1h for a daily dataset, or user_email for an organization-only dataset, returns 400 rather than an empty series. For per-member query volume, use the v2 endpoint.
Response
Forcredit_usage, count reports total credit usage and by_categories.Model provides the model breakdown. Read the available breakdown axes from categories. Do not infer zero usage for a breakdown that is not returned.
The following illustrative response shows total credit usage with a model breakdown for one historical day.
categorieslists the available breakdown axes, in canonical render order; see Datasets. Most datasets carry one axis.credit_usageusesModel,query_volumecarries five axes, anddaily_active_userscarries none (categoriesis[]and each bucket’sby_categoriesis{}).datacontains every bucket in the page’s window, in chronological order. Buckets without data carrycount: 0and an empty list under each axis inby_categories.by_categoriesmaps each axis label to its breakdown for the bucket. Categories within an axis are the dataset’s dimension values: connector names forconnectors, artifact types forartifacts, duration bands fortask_durations, model names forcredit_usage’sModel, and the titles your members gave the items forspaces/skills/workflows.- For
query_volume,Featuresplits every query intoSearchorComputer, andModel/Model Familyname the model that answered it (Modelis the exact selection,Model Familythe coarser grouping).ProjectandCometare overlapping subsets, not partitions — a query run in a project is also aSearchorComputerquery — so those axes do not sum tocount. - For
credit_usage,countcan exceed the sum of any single breakdown — usage without a category attribution counts toward the total but not the breakdown.
Time Windows and Buckets
The API serves complete UTC grid buckets only:start_timesnaps down to the start of its bucket, so the first bucket can include usage from before your requested start.end_timeis exclusive and is capped at the current time, then snapped down — the in-progress bucket is never returned. Withbucket_width=1d, today’s bucket is not included; use1hfor intraday data.- A valid window that contains no complete buckets returns
200with emptydata.
Data freshness. The analytics store is synced periodically, not in real time. A
count of 0 in a recent bucket can mean the data hasn’t synced yet rather than zero usage. has_more indicates whether additional complete buckets remain in the requested time window, not whether the data has synced. To retrieve newer usage, request a newer time window.Pagination
When the window spans more buckets thanlimit, the response sets has_more: true and a next_page cursor. Pass it back as page, keeping every other parameter unchanged to continue the same report. Treat the cursor as opaque.
The example below sets limit to 2 so the seven-day window spans multiple pages.
Filtering by Member
Passuser_email to restrict the series to a single member of your organization. Replace member@example.com with a current member’s email:
user_email except query_volume and daily_active_users, which are aggregated per organization and reject it with a 400. For per-member query volume, use the v2 endpoint.
The email must belong to a current member of your organization. Any other value — including emails with no Perplexity account — returns the same generic 400:
Per-Member Usage
GET /v2/analytics/computer/usage breaks a dataset down per member instead of as a single org total. It returns daily buckets, each listing one row per member with usage that day, keyed by email. It uses the same API key, error envelope, organization-level rate limit, and 90-day time-window limit as v1. V2 paginates member rows rather than time buckets, with a default limit of 50 and a maximum of 100.
Two datasets support per-member grouping today, at daily granularity:
credit_usage: the member’s total credits, with aModelbreakdown.query_volume— the member’s queries, withFeature,ProjectandCometbreakdowns.
group_by is a parameter so more groupings can be added later without a breaking change.
Parameters
Response
As in v1, use the response’scategories list to determine which breakdowns are available. Do not infer zero usage for a breakdown that is not returned. The following illustrative response shows a completed page with each member’s total credit usage and model breakdown for one historical day.
- Each
dataentry is one UTC day;resultsholds one row per member with usage that day, in(day, member)order. Days with no usage are omitted rather than returned empty. user_emailidentifies the member.countis the member’s credits or queries for the day, depending ondataset, andby_categoriescarries that dataset’s axes — listed in the response’s top-levelcategories.- Time-window and bucket semantics match v1’s
1dmode — complete UTC days only, and the same freshness caveat applies.
Paginating Members
v2 paginates over member rows, not days: a single page can span several days, and each member’s day counts as one row towardlimit. A day can also span pages, so the example collects daily bucket fragments rather than distinct days. Page until has_more is false, passing next_page back as page with every other parameter unchanged:
Errors
Errors use a consistent envelope:Limits
- Time windows are limited to 90 days per request (paginate within the window for long ranges).
- Requests are rate-limited per organization — all keys minted by your org share one allowance.