Skip to main content
GET
Mission Control usage
Your API token must be allowed to use agents (use_agents) and you need API access in the workspace. On top of that, the endpoint applies the Mission Control permissions of your role: mission-control:view to query at all, and the usage scope you were granted (your own usage, your teams, or the whole workspace). The scope is resolved on the server from your role; the request never widens it.
This endpoint answers exactly what the Mission Control panel in Tess shows, from the same hourly data. Mission Control must be enabled for the workspace, and data exists from freshness.data_available_from onwards. A period that starts earlier is refused, never answered with zeros.

Code examples

Consumption by AI model in the current month, compared with the previous period:

Headers

integer
required
Workspace ID. You must be an active member of the workspace and hold mission-control:view on it.

Query parameters

date (YYYY-MM-DD)
required
Start of the period, a local date in timezone (inclusive).
date (YYYY-MM-DD)
required
End of the period (inclusive). The period is at most 93 days and cannot start before freshness.data_available_from.
string
IANA timezone of the local dates and of the buckets (for example America/Sao_Paulo). Default: the platform timezone.
string
Bucket size of series: hour, day (default), week or month.
array of string
Metrics to return. Default: consumption_net, consumption_charged, consumption_refunded. Available: consumption_net, consumption_charged, consumption_refunded, executions, failed_executions, interrupted_executions, uses, success_rate, avg_credits_per_execution, avg_credits_per_person, active_people, active_agents, active_autonomous_agents, active_days, active_business_days.
array of string
Dimensions to group by, at most 3: agent, person, resource, resource_kind, execution_type, modality, activity_category, charge_type, execution_origin, trigger_source, agent_origin. Grouping by person needs mission-control:person-data:view; without it the query is refused (403 person_data_not_allowed).
array of string
me (your own usage), my_team (current members of your teams), my_workspace (everyone in your scope) or person ids. The aliases need no extra permission; person ids need mission-control:person-data:view and must be inside your scope.
array of integer
Team ids. Only the ids listed in scope.teams of a previous answer are accepted.
array of integer
Agent ids. Take them from groups[].dimensions.agent.id of a previous answer grouped by agent.
array of string
Resources as <kind>:<name>, for example model:gpt-5, tool:web_search, connector:googlesheets. Take them from a previous answer grouped by resource.
array of string
model, tool, connector, upload, kb, memory, voice or other. Use ["model"] to restrict a resource grouping to AI models.
array of string
chat, image, video, audio, upload, tools or other.
array of string
agents, tools, connectors or kb.
array of string
standard or cowork (Cowork / Digital Employee agents).
array of string
Who started the execution: human, scheduler, autopilot, automation, api or embed.
array of string
Run outcome: succeeded, failed or interrupted (stopped by the person, still billed).
array of string
Exact execution type values, as returned in a previous grouped answer (for example chat, text, image, tool_execution).
array of string
Exact charge type values (for example execution).
array of string
Exact execution origin values.
string
previous_period (same number of days, right before the period) or previous_calendar_month (the whole previous calendar months, at most 3). Adds comparison to the answer and to every group.
string
Metric id the groups are ordered by. Default: the first requested metric.
string
value (default), delta_abs or delta_pct (change versus the comparison period; both need compare).
string
desc (default) or asc. Null values always come last.
integer
Groups per page. Default 50, maximum 200.
string
Opaque cursor of the next page (page.next_cursor of a previous answer).
boolean
Also return the series of every group.
Array parameters Send repeated keys with brackets, exactly as shown: group_by[]=resource&filters[person][]=me&filters[person][]=my_team. Filters only narrow the data; a value outside your scope is refused, never silently dropped. IDs: never guess them
  • Team ids come only from scope.teams of an answer (scope.teams_total is the uncapped count).
  • Agent, person and resource ids come from groups[].dimensions.<dimension>.id of a previous answer grouped by that dimension.
  • Closed sets (modality, activity_category, agent_origin, trigger_source, resource_kind, status) are listed above; open values (execution_type, charge_type, execution_origin) come from a previous grouped answer.
Resources and non-additive totals Grouping or filtering by resource, resource_kind or charge_type counts the executions that used each resource. A run that used two tools counts once in each group, so across resources the totals of the run metrics (executions, failed_executions, success_rate, avg_credits_per_execution) come back as null and meta.non_additive tells which ones: read the per-group values, never add the groups up. Credits and uses always add up. Model-only scopes (filters[resource_kind][]=model) stay exact.

Response

Response fields

Errors

Query refusals are JSON objects with a stable code. Request validation failures (an unknown granularity, compare, sort_by or order, a malformed date) come back as a 422 in Laravel’s {message, errors} shape instead; access refusals (403/404) carry only message: