Mission Control
Mission Control usage
Query the AI consumption of a workspace (credits, executions, adoption) from Mission Control: one period, grouped, filtered and compared with the previous period.
GET
Mission Control usage
Your API token must be allowed to use agents (
Array parameters
Send repeated keys with brackets, exactly as shown:
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.
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.teamsof an answer (scope.teams_totalis the uncapped count). - Agent, person and resource ids come from
groups[].dimensions.<dimension>.idof 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.
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 stablecode. 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:

