Haijun Platform Docs
ID

Get Activity Summaries

GET /v1/organizations/analytics/summaries

Get organization-wide activity summaries for a date range.

Returns one entry per day from starting_date (inclusive) to ending_date (exclusive). Data is typically available with a 1-day lag and may be revised by a few percent over the following days: when ending_date is omitted it defaults to the most recent available day + 1, so the last entry covers the most recent available day. The series can be scoped to an RBAC group via filter[]=rbac_group_id:{id}. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • starting_date: string

UTC date in YYYY-MM-DD format. Start of the date range (inclusive). Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive). Data is typically available with a 1-day lag, so this can be at most today — which is also the default when omitted, making the last entry cover the most recent available day. Data may be revised by a few percent over the following days. The range may span at most 366 days.

format: date

  • filter: optional array of string

Filters as dimension:value. Only rbac_group_id is supported (e.g. filter[]=rbac_group_id:{id}); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. rbac_group_id accepts the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.

maxItems: 100

Returns

  • BetaActivitySummary object

Response for GET /v1/organizations/analytics/summaries.

  • summaries: array of object
  • assigned_seat_count: number or null

Number of seats currently assigned to members. Null when the response is scoped to an RBAC group — seat assignment is org-wide and has no per-group analogue.

  • cowork_daily_active_user_count: number

Number of users with Cowork activity on the requested day

  • cowork_monthly_active_user_count: number

Number of users with Cowork activity in the 30-day rolling window

  • cowork_weekly_active_user_count: number

Number of users with Cowork activity in the 7-day rolling window

  • daily_active_user_count: number

Number of users with token consumption on the requested day

  • daily_adoption_rate: number or null

Percentage of assigned seats with activity on the requested day (DAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • ending_at: string

End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. 2026-01-16T00:00:00Z).

format: date-time

  • monthly_active_user_count: number

Number of users with token consumption in the 30-day rolling window

  • monthly_adoption_rate: number or null

Percentage of assigned seats with activity in the 30-day rolling window (MAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • pending_invite_count: number or null

Number of pending invitations to join the organization. Null when the response is scoped to an RBAC group.

  • starting_at: string

Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. 2026-01-15T00:00:00Z).

format: date-time

  • weekly_active_user_count: number

Number of users with token consumption in the 7-day rolling window

  • weekly_adoption_rate: number or null

Percentage of assigned seats with activity in the 7-day rolling window (WAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • chat_daily_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • chat_monthly_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • chat_weekly_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_daily_active_user_count: optional number or null

Number of users with Haijun Code activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_monthly_active_user_count: optional number or null

Number of users with Haijun Code activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_weekly_active_user_count: optional number or null

Number of users with Haijun Code activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_daily_active_user_count: optional number or null

Number of users with Haijun Design activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_monthly_active_user_count: optional number or null

Number of users with Haijun Design activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_weekly_active_user_count: optional number or null

Number of users with Haijun Design activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_daily_active_user_count: optional number or null

Number of users with Haijun in Office activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_monthly_active_user_count: optional number or null

Number of users with Haijun in Office activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_weekly_active_user_count: optional number or null

Number of users with Haijun in Office activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_daily_active_user_count: optional number or null

Number of users with Haijun Science activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_entitled_user_count: optional number or null

Number of users with a Haijun Science seat entitlement (per-seat RBAC) at the time of the daily snapshot. The funnel top; independent of the org-level Haijun Science toggle. Null when the response is scoped to an RBAC group — entitlement is org-wide and has no per-group analogue. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_monthly_active_user_count: optional number or null

Number of users with Haijun Science activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_weekly_active_user_count: optional number or null

Number of users with Haijun Science activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/summaries \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"

Response (200)

json
{
  "summaries": [
    {
      "assigned_seat_count": 0,
      "cowork_daily_active_user_count": 0,
      "cowork_monthly_active_user_count": 0,
      "cowork_weekly_active_user_count": 0,
      "daily_active_user_count": 0,
      "daily_adoption_rate": 0,
      "ending_at": "2019-12-27T18:11:19.117Z",
      "monthly_active_user_count": 0,
      "monthly_adoption_rate": 0,
      "pending_invite_count": 0,
      "starting_at": "2019-12-27T18:11:19.117Z",
      "weekly_active_user_count": 0,
      "weekly_adoption_rate": 0,
      "chat_daily_active_user_count": 0,
      "chat_monthly_active_user_count": 0,
      "chat_weekly_active_user_count": 0,
      "haijun_code_daily_active_user_count": 0,
      "haijun_code_monthly_active_user_count": 0,
      "haijun_code_weekly_active_user_count": 0,
      "haijun_design_daily_active_user_count": 0,
      "haijun_design_monthly_active_user_count": 0,
      "haijun_design_weekly_active_user_count": 0,
      "office_agent_daily_active_user_count": 0,
      "office_agent_monthly_active_user_count": 0,
      "office_agent_weekly_active_user_count": 0,
      "science_daily_active_user_count": 0,
      "science_entitled_user_count": 0,
      "science_monthly_active_user_count": 0,
      "science_weekly_active_user_count": 0
    }
  ]
}

Domain types

Beta Activity Summary

  • BetaActivitySummary object

Response for GET /v1/organizations/analytics/summaries.

  • summaries: array of object
  • assigned_seat_count: number or null

Number of seats currently assigned to members. Null when the response is scoped to an RBAC group — seat assignment is org-wide and has no per-group analogue.

  • cowork_daily_active_user_count: number

Number of users with Cowork activity on the requested day

  • cowork_monthly_active_user_count: number

Number of users with Cowork activity in the 30-day rolling window

  • cowork_weekly_active_user_count: number

Number of users with Cowork activity in the 7-day rolling window

  • daily_active_user_count: number

Number of users with token consumption on the requested day

  • daily_adoption_rate: number or null

Percentage of assigned seats with activity on the requested day (DAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • ending_at: string

End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. 2026-01-16T00:00:00Z).

format: date-time

  • monthly_active_user_count: number

Number of users with token consumption in the 30-day rolling window

  • monthly_adoption_rate: number or null

Percentage of assigned seats with activity in the 30-day rolling window (MAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • pending_invite_count: number or null

Number of pending invitations to join the organization. Null when the response is scoped to an RBAC group.

  • starting_at: string

Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. 2026-01-15T00:00:00Z).

format: date-time

  • weekly_active_user_count: number

Number of users with token consumption in the 7-day rolling window

  • weekly_adoption_rate: number or null

Percentage of assigned seats with activity in the 7-day rolling window (WAU / assigned_seat_count * 100). Null when the response is scoped to an RBAC group.

  • chat_daily_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • chat_monthly_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • chat_weekly_active_user_count: optional number or null

Number of users with haijun.ai (chat) activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_daily_active_user_count: optional number or null

Number of users with Haijun Code activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_monthly_active_user_count: optional number or null

Number of users with Haijun Code activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_code_weekly_active_user_count: optional number or null

Number of users with Haijun Code activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_daily_active_user_count: optional number or null

Number of users with Haijun Design activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_monthly_active_user_count: optional number or null

Number of users with Haijun Design activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • haijun_design_weekly_active_user_count: optional number or null

Number of users with Haijun Design activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_daily_active_user_count: optional number or null

Number of users with Haijun in Office activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_monthly_active_user_count: optional number or null

Number of users with Haijun in Office activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • office_agent_weekly_active_user_count: optional number or null

Number of users with Haijun in Office activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_daily_active_user_count: optional number or null

Number of users with Haijun Science activity on the requested day. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_entitled_user_count: optional number or null

Number of users with a Haijun Science seat entitlement (per-seat RBAC) at the time of the daily snapshot. The funnel top; independent of the org-level Haijun Science toggle. Null when the response is scoped to an RBAC group — entitlement is org-wide and has no per-group analogue. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_monthly_active_user_count: optional number or null

Number of users with Haijun Science activity in the 30-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

  • science_weekly_active_user_count: optional number or null

Number of users with Haijun Science activity in the 7-day rolling window. Omitted from the response while the per-product breakdown is not enabled for this organization.

Beta Analytics User

  • BetaAnalyticsUser object

A user in the organization, identified by tagged id and email address.

  • type: "user"

Object type. Always user.

default: user

  • id: string

Tagged user identifier (e.g. user_...)

  • email_address: string

Email address of the user

Beta Analytics User Actor

  • BetaAnalyticsUserActor object
  • type: "user_actor"

Actor type. Always "user_actor".

  • deleted: boolean

True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). email stays populated for removed users and is null when the account has been deleted. name follows the rules described on that field. The user_id is still populated for reconciliation.

  • email: string or null

The user's email address, including for users who are no longer members of the organization or its associated organizations. Null when the account has been deleted (check deleted) and for system-minted service accounts, which have no person's mailbox behind them (check name).

  • name: string or null

The user's full name. Null when the user has not set a name. Returns "Deleted User" when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, "Haijun Security" for usage by Juglow's security-patching service) or null.

  • user_id: string

Tagged user ID.

Beta Connector Office Product Metrics

  • BetaConnectorOfficeProductMetrics object

Office Agent activity metrics for a single connector on a given day within one Office product.

  • distinct_session_connector_used_count: number or null

Number of distinct Office Agent sessions in which the connector was used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

Beta Office Product Metrics

  • BetaOfficeProductMetrics object

Office Agent activity metrics for a single user on a given day within one Office product.

  • connectors_used_count: number

Number of MCP connector invocations

  • distinct_connectors_used_count: number or null

Number of distinct MCP connectors used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_session_count: number or null

Number of distinct Office Agent sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_skills_used_count: number or null

Number of distinct tracks used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent

  • skills_used_count: number

Number of track invocations

Beta Track Office Product Metrics

  • BetaSkillOfficeProductMetrics object

Office Agent activity metrics for a single track on a given day within one Office product.

  • distinct_session_skill_used_count: number or null

Number of distinct Office Agent sessions in which the track was used. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

Beta Tool Action Counts

  • BetaToolActionCounts object

Accepted/rejected counts for a single Haijun Code tool type.

  • accepted_count: number

Number of tool proposals accepted

  • rejected_count: number

Number of tool proposals rejected

Analytics › Usage

Get Token Usage Over Time

GET /v1/organizations/analytics/usage_report

Get token usage over time across a date range.

Returns token usage bucketed by minute, hour, or day, optionally broken down by product, model, context window, inference region, or speed. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • starting_at: string

Start of range, inclusive. RFC 3339 tz-aware. Must be within the last 365 days and no earlier than 2026-01-01T00:00:00Z.

format: date-time

  • bucket_width: optional "1d" or "1h" or "1m"

Time bucket granularity.

default: 1d

  • "1d"
  • "1h"
  • "1m"
  • haijun_tag_categories: optional array of "dm" or "engaged" or "monitoring" or 2 more

Filter to Haijun Tag (Haijun in Slack) usage in specific spend categories. Usage with no category never matches. dm usage is reported under the user's product rather than haijun-tag, so combining this filter with products[]=haijun-tag excludes it. Use group_by[]=haijun_tag_category to break out per-category values.

maxItems: 100

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_ids: optional array of string

Filter to Haijun Tag (Haijun in Slack) usage attributed to specific Slack users, by Slack user ID (for example U0123ABCDEF), not haijun.ai user ID. Usage that is not Haijun Tag, and Haijun Tag usage not attributed to a single user, never matches. Use group_by[]=haijun_tag_user_id to break out per-user values.

maxItems: 100

  • context_windows: optional array of "0-200k" or "200k-1M"

Filter to specific context-window pricing tiers. Use group_by[]=context_window to break out per-tier values.

maxItems: 100

  • "0-200k"
  • "200k-1M"
  • ending_at: optional string

End of range, exclusive. When omitted, defaults to the earlier of now and starting_at + 31 days. The range may span at most 31 days.

format: date-time

  • group_by: optional array of "haijun_tag_category" or "haijun_tag_user_id" or "context_window" or 6 more

Dimensions to break each time bucket out by. Defaults to no grouping (one total per bucket). Each bucket reports at most its top 100 groups; a group beyond that cap has no row in that bucket (there is no remainder row), so grouped buckets are not exhaustive when a dimension has more than 100 distinct values.

maxItems: 100

  • "haijun_tag_category"
  • "haijun_tag_user_id"
  • "context_window"
  • "inference_geo"
  • "model"
  • "product"
  • "rbac_group_id"
  • "slack_channel_id"
  • "speed"
  • inference_geos: optional array of "global" or "not_available" or "us"

Filter to specific inference regions. not_available matches rows where the region is unset. Use group_by[]=inference_geo to break out per-region values.

maxItems: 100

  • "global"
  • "not_available"
  • "us"
  • limit: optional number

Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).

minimum: 1

  • models: optional array of string

Models to include. Defaults to all models. Use group_by[]=model to break out per-model values.

maxItems: 100

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • products: optional array of "chat" or "haijun-tag" or "haijun_code" or 4 more

Product surfaces to include. Defaults to all products. Use group_by[]=product to break out per-product values.

maxItems: 100

  • "chat"
  • "haijun-tag"
  • "haijun_code"
  • "haijun_design"
  • "haijun_in_chrome"
  • "cowork"
  • "office_agent"
  • rbac_group_ids: optional array of string

Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (rbac_group_...) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.

maxItems: 100

  • slack_channel_ids: optional array of string

Filter to usage originating from specific Slack channels. Use group_by[]=slack_channel_id to break out per-channel values.

maxItems: 100

  • speeds: optional array of "fast" or "standard"

Filter to fast or standard inference mode. Use group_by[]=speed to break out per-mode values.

maxItems: 100

  • "fast"
  • "standard"
  • user_ids: optional array of string

Filter to specific users by tagged user ID.

maxItems: 100

Returns

  • BetaUsageBucket object
  • data: array of object

Time buckets for this page, oldest first: one per bucket_width interval, including intervals with no data (their results list is empty). A page holds at most limit buckets.

  • ending_at: string

End of the time bucket (exclusive) in RFC 3339 format.

format: date-time

  • results: array of object

Rows for this time bucket. Empty when the bucket has no data; otherwise a single combined row when group_by[] is omitted, or one row per group (subject to the per-bucket group cap described on the group_by[] parameter).

  • cache_creation: BetaCacheCreation

The number of input tokens for cache creation.

  • ephemeral_1h_input_tokens: number

The number of input tokens used to create the 1 hour cache entry.

default: 0, minimum: 0

  • ephemeral_5m_input_tokens: number

The number of input tokens used to create the 5 minute cache entry.

default: 0, minimum: 0

  • cache_read_input_tokens: number

The number of input tokens read from the cache.

  • haijun_tag_category: "dm" or "engaged" or "monitoring" or 2 more or null

Haijun Tag (Haijun in Slack) spend category: engaged (a person addressed Haijun in a channel or thread), proactive (Haijun responded without being addressed), scheduled (a scheduled routine ran), monitoring (Haijun watching a channel it was asked to monitor), or dm (direct messages with Haijun). Populated only when haijun_tag_category is in group_by[]; null for usage that is not Haijun Tag. Direct-message usage is billed to the individual user and is reported under that user's product, not under haijun-tag. New categories may be added over time.

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_id: string or null

Slack user ID (for example U0123ABCDEF) of the member the Haijun Tag (Haijun in Slack) usage is attributed to, not a haijun.ai user ID. Populated only when haijun_tag_user_id is in group_by[]; null for usage that is not Haijun Tag and for Haijun Tag usage that is not attributed to a single user (for example monitoring, and proactive usage Haijun initiated), so per-user rows can sum to less than the Haijun Tag total. Cannot be combined with group_by[]=rbac_group_id or the rbac_group_ids[] filter.

  • context_window: "0-200k" or "200k-1M" or null

Context-window pricing tier of the usage or cost. Null unless context_window is in group_by[]; it can also be null on grouped rows with no context-window tier, such as code execution.

  • "0-200k"
  • "200k-1M"
  • inference_geo: "global" or "us" or null

Inference region of the usage or cost. Null unless inference_geo is in group_by[]; it can also be null on grouped rows where the region is not set (the rows that inference_geos[]=not_available matches).

  • "global"
  • "us"
  • model: string or null

Model that produced the usage or cost, as a model name in the form the models[] filter accepts (for example, haijun-opus-5). Null unless model is in group_by[]; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.

  • output_tokens: number

The number of output tokens generated.

  • product: string or null

Product surface that produced the usage or cost. Null unless product is in group_by[]; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include chat, haijun_code, cowork, office_agent, haijun_in_chrome, haijun_design, and haijun-tag. haijun-tag is Haijun Tag, the Haijun product in Slack. Some unattributed usage is reported as "other".

  • rbac_group_id: string or null

RBAC group (team) the usage is attributed to, in the public tagged rbac_group_... spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an rbac_group_ids[] filter value. Populated only when rbac_group_id is in group_by[]. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without group_by[].

  • requests: number or null

Number of API requests in this row's scope. For sandbox / code-execution events, this counts execution spans rather than HTTP requests (these rows surface with product: null).

  • server_tool_use: object

Server-side tool usage metrics.

  • web_search_requests: number

The number of web search requests made.

  • slack_channel_id: string or null

Slack channel the usage originated from. Populated only when slack_channel_id is in group_by[]; null for usage outside Slack (and for rows recorded before channel attribution was enabled).

  • speed: "fast" or "standard" or null

Inference speed mode of the usage or cost: fast or standard. Null unless speed is in group_by[].

  • "fast"
  • "standard"
  • uncached_input_tokens: number

The number of uncached input tokens processed.

  • starting_at: string

Start of the time bucket (inclusive) in RFC 3339 format.

format: date-time

  • data_refreshed_at: string or null

RFC 3339 timestamp of the export this response was served from. Null when no export yet covers any part of the requested range, in which case every bucket's results list is empty. Buckets beyond this watermark are incomplete; for stable results, set ending_at to this value or earlier. Data is typically refreshed every 4 hours but not final until about 30 days after the usage date (late-arriving events, reconciliation adjustments).

format: date-time

  • has_more: boolean

Whether another page is available. When true, pass next_page as the page parameter to fetch it.

  • next_page: string or null

Opaque cursor for the next page, or null when has_more is false. Pass it as the page parameter, keeping the other parameters unchanged. A cursor can expire after the underlying data refreshes; the request then returns HTTP 410 and pagination must restart from the first page.

  • organization_id: string

ID of the Organization.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/usage_report \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "ending_at": "2019-12-27T18:11:19.117Z",
      "results": [
        {
          "cache_creation": {
            "ephemeral_1h_input_tokens": 0,
            "ephemeral_5m_input_tokens": 0
          },
          "cache_read_input_tokens": 0,
          "haijun_tag_category": "dm",
          "haijun_tag_user_id": "U0123ABCDEF",
          "context_window": "0-200k",
          "inference_geo": "global",
          "model": "haijun-opus-5",
          "output_tokens": 0,
          "product": "chat",
          "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
          "requests": 0,
          "server_tool_use": {
            "web_search_requests": 10
          },
          "slack_channel_id": "C0123ABCDEF",
          "speed": "fast",
          "uncached_input_tokens": 0
        }
      ],
      "starting_at": "2019-12-27T18:11:19.117Z"
    }
  ],
  "data_refreshed_at": "2019-12-27T18:11:19.117Z",
  "has_more": true,
  "next_page": "next_page",
  "organization_id": "org_013FP9SaFPBg7Kw7fetjn6cF"
}

Get Per-User Token Usage

GET /v1/organizations/analytics/user_usage_report

Get per-user token usage across a date range.

Returns one row per user, ranked by the chosen token metric. Use this to see which users consume the most tokens. Only usage attributable to a seat user is included; for organization-wide totals including direct API-key and automation traffic, use the bucketed /v1/organizations/analytics/usage_report endpoint. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • starting_at: string

Start of range, inclusive. RFC 3339 tz-aware. Must be within the last 365 days and no earlier than 2026-01-01T00:00:00Z.

format: date-time

  • bucket_width: optional "1d" or "1h" or "1m"

Time-bucket granularity. When set, each row's starting_at and ending_at are populated and one actor may span several rows (one per time bucket with usage). The time bucket counts toward limit, so one page can return multiple rows for the same actor. ending_at is required when bucket_width is set, and with bucket_width="1m" the range may span at most 24 hours. When omitted, each row aggregates the full [starting_at, ending_at) range.

  • "1d"
  • "1h"
  • "1m"
  • haijun_tag_categories: optional array of "dm" or "engaged" or "monitoring" or 2 more

Filter to Haijun Tag (Haijun in Slack) usage in specific spend categories. Usage with no category never matches. dm usage is reported under the user's product rather than haijun-tag, so combining this filter with products[]=haijun-tag excludes it. Use group_by[]=haijun_tag_category to break out per-category values.

maxItems: 100

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_ids: optional array of string

Filter to Haijun Tag (Haijun in Slack) usage attributed to specific Slack users, by Slack user ID (for example U0123ABCDEF), not haijun.ai user ID. Usage that is not Haijun Tag, and Haijun Tag usage not attributed to a single user, never matches. Use group_by[]=haijun_tag_user_id to break out per-user values.

maxItems: 100

  • context_windows: optional array of "0-200k" or "200k-1M"

Filter to specific context-window pricing tiers. Use group_by[]=context_window to break out per-tier values.

maxItems: 100

  • "0-200k"
  • "200k-1M"
  • ending_at: optional string

End of range, exclusive. When omitted, defaults to the earlier of now and starting_at + 31 days. The range may span at most 31 days.

format: date-time

  • exclude_deleted_users: optional boolean

If true, omit rows for users who are deleted (deleted: true). A page may contain fewer than limit rows; use has_more and next_page to paginate as usual.

default: false

  • group_by: optional array of "haijun_tag_category" or "haijun_tag_user_id" or "context_window" or 6 more

Break each actor's row out by the given dimensions. Accepts the same values as the bucketed /usage_report endpoint. limit bounds (actor × time bucket × dimension) rows — with dimensions or bucket_width present, one actor may span several rows.

maxItems: 100

  • "haijun_tag_category"
  • "haijun_tag_user_id"
  • "context_window"
  • "inference_geo"
  • "model"
  • "product"
  • "rbac_group_id"
  • "slack_channel_id"
  • "speed"
  • inference_geos: optional array of "global" or "not_available" or "us"

Filter to specific inference regions. not_available matches rows where the region is unset. Use group_by[]=inference_geo to break out per-region values.

maxItems: 100

  • "global"
  • "not_available"
  • "us"
  • limit: optional number

Number of rows per page (1-1000, default 20). One row per actor unless group_by[] or bucket_width splits an actor across rows; cost_type/token_type fan-out rows (cost endpoint only) are the exception — they do not count toward this limit, so data can exceed it.

default: 20, minimum: 1, maximum: 1000

  • models: optional array of string

Models to include. Defaults to all models. Use group_by[]=model to break out per-model values.

maxItems: 100

  • order: optional "asc" or "desc"

Sort direction. Defaults to desc.

default: desc

  • "asc"
  • "desc"
  • order_by: optional "output_tokens" or "requests" or "total_tokens" or "uncached_input_tokens"

Metric to rank actors by. Defaults to total_tokens.

default: total_tokens

  • "output_tokens"
  • "requests"
  • "total_tokens"
  • "uncached_input_tokens"
  • page: optional string

Opaque cursor from a previous response's next_page field.

  • products: optional array of "chat" or "haijun-tag" or "haijun_code" or 4 more

Product surfaces to include. Defaults to all products.

maxItems: 100

  • "chat"
  • "haijun-tag"
  • "haijun_code"
  • "haijun_design"
  • "haijun_in_chrome"
  • "cowork"
  • "office_agent"
  • rbac_group_ids: optional array of string

Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (rbac_group_...) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.

maxItems: 100

  • slack_channel_ids: optional array of string

Filter to usage originating from specific Slack channels. Use group_by[]=slack_channel_id to break out per-channel values.

maxItems: 100

  • speeds: optional array of "fast" or "standard"

Filter to fast or standard inference mode. Use group_by[]=speed to break out per-mode values.

maxItems: 100

  • "fast"
  • "standard"
  • user_ids: optional array of string

Filter to specific users by tagged user ID.

maxItems: 100

Returns

  • BetaUserUsage object
  • data: array of object

Rows for this page, ranked by order_by in the order direction. One row per user, or several per user when group_by[] or bucket_width breaks that user's usage or cost out across rows. Rows split out by cost_type or token_type (cost endpoint only) stay adjacent and are ranked as one unit.

  • actor: BetaAnalyticsUserActor

The user this row's usage or cost is attributed to. Always a user_actor.

  • type: "user_actor"

Actor type. Always "user_actor".

  • deleted: boolean

True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). email stays populated for removed users and is null when the account has been deleted. name follows the rules described on that field. The user_id is still populated for reconciliation.

  • email: string or null

The user's email address, including for users who are no longer members of the organization or its associated organizations. Null when the account has been deleted (check deleted) and for system-minted service accounts, which have no person's mailbox behind them (check name).

  • name: string or null

The user's full name. Null when the user has not set a name. Returns "Deleted User" when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, "Haijun Security" for usage by Juglow's security-patching service) or null.

  • user_id: string

Tagged user ID.

  • cache_creation: BetaCacheCreation

The number of input tokens for cache creation.

  • ephemeral_1h_input_tokens: number

The number of input tokens used to create the 1 hour cache entry.

default: 0, minimum: 0

  • ephemeral_5m_input_tokens: number

The number of input tokens used to create the 5 minute cache entry.

default: 0, minimum: 0

  • cache_read_input_tokens: number

The number of input tokens read from the cache.

  • haijun_tag_category: "dm" or "engaged" or "monitoring" or 2 more or null

Haijun Tag (Haijun in Slack) spend category: engaged (a person addressed Haijun in a channel or thread), proactive (Haijun responded without being addressed), scheduled (a scheduled routine ran), monitoring (Haijun watching a channel it was asked to monitor), or dm (direct messages with Haijun). Populated only when haijun_tag_category is in group_by[]; null for usage that is not Haijun Tag. Direct-message usage is billed to the individual user and is reported under that user's product, not under haijun-tag. New categories may be added over time.

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_id: string or null

Slack user ID (for example U0123ABCDEF) of the member the Haijun Tag (Haijun in Slack) usage is attributed to, not a haijun.ai user ID. Populated only when haijun_tag_user_id is in group_by[]; null for usage that is not Haijun Tag and for Haijun Tag usage that is not attributed to a single user (for example monitoring, and proactive usage Haijun initiated), so per-user rows can sum to less than the Haijun Tag total. Cannot be combined with group_by[]=rbac_group_id or the rbac_group_ids[] filter.

  • context_window: "0-200k" or "200k-1M" or null

Context-window pricing tier of the usage or cost. Null unless context_window is in group_by[]; it can also be null on grouped rows with no context-window tier, such as code execution.

  • "0-200k"
  • "200k-1M"
  • ending_at: string or null

End of the row's UTC time bucket (exclusive), as an RFC 3339 timestamp; equal to starting_at plus one bucket_width. Null unless bucket_width is set.

format: date-time

  • inference_geo: "global" or "us" or null

Inference region of the usage or cost. Null unless inference_geo is in group_by[]; it can also be null on grouped rows where the region is not set (the rows that inference_geos[]=not_available matches).

  • "global"
  • "us"
  • model: string or null

Model that produced the usage or cost, as a model name in the form the models[] filter accepts (for example, haijun-opus-5). Null unless model is in group_by[]; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.

  • output_tokens: number

The number of output tokens generated.

  • product: string or null

Product surface that produced the usage or cost. Null unless product is in group_by[]; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include chat, haijun_code, cowork, office_agent, haijun_in_chrome, haijun_design, and haijun-tag. haijun-tag is Haijun Tag, the Haijun product in Slack. Some unattributed usage is reported as "other".

  • rbac_group_id: string or null

RBAC group (team) the usage is attributed to, in the public tagged rbac_group_... spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an rbac_group_ids[] filter value. Populated only when rbac_group_id is in group_by[]. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without group_by[].

  • requests: number or null

Number of API requests in this row's scope. For sandbox / code-execution events, this counts execution spans rather than HTTP requests (these rows surface with product: null).

  • server_tool_use: object

Server-side tool usage metrics.

  • web_search_requests: number

The number of web search requests made.

  • slack_channel_id: string or null

Slack channel the usage originated from. Populated only when slack_channel_id is in group_by[]; null for usage outside Slack (and for rows recorded before channel attribution was enabled).

  • speed: "fast" or "standard" or null

Inference speed mode of the usage or cost: fast or standard. Null unless speed is in group_by[].

  • "fast"
  • "standard"
  • starting_at: string or null

Start of the row's UTC time bucket (inclusive), as an RFC 3339 timestamp. Null unless bucket_width is set; without bucket_width, each row aggregates the full requested range.

format: date-time

  • total_tokens: number

Total token count across all token types. This is the value the default order_by (total_tokens) sorts on.

  • uncached_input_tokens: number

The number of uncached input tokens processed.

  • data_refreshed_at: string or null

RFC 3339 timestamp of the export this response was served from. Null when no export yet covers any part of the requested range, in which case data is empty. Data beyond this watermark is incomplete; for stable results, set ending_at to this value or earlier. Data is typically refreshed every 4 hours but not final until about 30 days after the usage date (late-arriving events, reconciliation adjustments).

format: date-time

  • has_more: boolean

Whether another page is available. When true, pass next_page as the page parameter to fetch it.

  • next_page: string or null

Opaque cursor for the next page, or null when has_more is false. Pass it as the page parameter, keeping the other parameters unchanged. A cursor can expire after the underlying data refreshes; the request then returns HTTP 410 and pagination must restart from the first page.

  • organization_id: string

ID of the Organization.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/user_usage_report \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "actor": {
        "deleted": true,
        "email": "jane@example.com",
        "name": "Jane Smith",
        "type": "user_actor",
        "user_id": "user_01AbCdEfGhIjKlMnOpQrSt"
      },
      "cache_creation": {
        "ephemeral_1h_input_tokens": 0,
        "ephemeral_5m_input_tokens": 0
      },
      "cache_read_input_tokens": 3200000,
      "haijun_tag_category": "dm",
      "haijun_tag_user_id": "U0123ABCDEF",
      "context_window": "0-200k",
      "ending_at": "2019-12-27T18:11:19.117Z",
      "inference_geo": "global",
      "model": "haijun-opus-5",
      "output_tokens": 891000,
      "product": "chat",
      "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
      "requests": 128,
      "server_tool_use": {
        "web_search_requests": 10
      },
      "slack_channel_id": "C0123ABCDEF",
      "speed": "fast",
      "starting_at": "2019-12-27T18:11:19.117Z",
      "total_tokens": 5377000,
      "uncached_input_tokens": 1284500
    }
  ],
  "data_refreshed_at": "2019-12-27T18:11:19.117Z",
  "has_more": true,
  "next_page": "next_page",
  "organization_id": "org_013FP9SaFPBg7Kw7fetjn6cF"
}

Analytics › Cost

Get Cost Over Time

GET /v1/organizations/analytics/cost_report

Get cost in USD over time across a date range.

Returns cost bucketed by minute, hour, or day, optionally broken down by product, model, context window, inference region, speed, cost type, or token type. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • starting_at: string

Start of range, inclusive. RFC 3339 tz-aware. Must be within the last 365 days and no earlier than 2026-01-01T00:00:00Z.

format: date-time

  • bucket_width: optional "1d" or "1h" or "1m"

Time bucket granularity.

default: 1d

  • "1d"
  • "1h"
  • "1m"
  • haijun_tag_categories: optional array of "dm" or "engaged" or "monitoring" or 2 more

Filter to Haijun Tag (Haijun in Slack) usage in specific spend categories. Usage with no category never matches. dm usage is reported under the user's product rather than haijun-tag, so combining this filter with products[]=haijun-tag excludes it. Use group_by[]=haijun_tag_category to break out per-category values.

maxItems: 100

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_ids: optional array of string

Filter to Haijun Tag (Haijun in Slack) usage attributed to specific Slack users, by Slack user ID (for example U0123ABCDEF), not haijun.ai user ID. Usage that is not Haijun Tag, and Haijun Tag usage not attributed to a single user, never matches. Use group_by[]=haijun_tag_user_id to break out per-user values.

maxItems: 100

  • context_windows: optional array of "0-200k" or "200k-1M"

Filter to specific context-window pricing tiers. Use group_by[]=context_window to break out per-tier values.

maxItems: 100

  • "0-200k"
  • "200k-1M"
  • ending_at: optional string

End of range, exclusive. When omitted, defaults to the earlier of now and starting_at + 31 days. The range may span at most 31 days.

format: date-time

  • group_by: optional array of "haijun_tag_category" or "haijun_tag_user_id" or "context_window" or 8 more

Dimensions to break each time bucket out by. Defaults to no grouping (one total per bucket). Each bucket reports at most its top 100 groups; a group beyond that cap has no row in that bucket (there is no remainder row), so grouped buckets are not exhaustive when a dimension has more than 100 distinct values.

maxItems: 100

  • "haijun_tag_category"
  • "haijun_tag_user_id"
  • "context_window"
  • "cost_type"
  • "inference_geo"
  • "model"
  • "product"
  • "rbac_group_id"
  • "slack_channel_id"
  • "speed"
  • "token_type"
  • inference_geos: optional array of "global" or "not_available" or "us"

Filter to specific inference regions. not_available matches rows where the region is unset. Use group_by[]=inference_geo to break out per-region values.

maxItems: 100

  • "global"
  • "not_available"
  • "us"
  • limit: optional number

Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).

minimum: 1

  • models: optional array of string

Models to include. Defaults to all models. Use group_by[]=model to break out per-model values.

maxItems: 100

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • products: optional array of "chat" or "haijun-tag" or "haijun_code" or 4 more

Product surfaces to include. Defaults to all products. Use group_by[]=product to break out per-product values.

maxItems: 100

  • "chat"
  • "haijun-tag"
  • "haijun_code"
  • "haijun_design"
  • "haijun_in_chrome"
  • "cowork"
  • "office_agent"
  • rbac_group_ids: optional array of string

Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (rbac_group_...) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.

maxItems: 100

  • slack_channel_ids: optional array of string

Filter to usage originating from specific Slack channels. Use group_by[]=slack_channel_id to break out per-channel values.

maxItems: 100

  • speeds: optional array of "fast" or "standard"

Filter to fast or standard inference mode. Use group_by[]=speed to break out per-mode values.

maxItems: 100

  • "fast"
  • "standard"
  • user_ids: optional array of string

Filter to specific users by tagged user ID.

maxItems: 100

Returns

  • BetaCostBucket object
  • data: array of object

Time buckets for this page, oldest first: one per bucket_width interval, including intervals with no data (their results list is empty). A page holds at most limit buckets.

  • ending_at: string

End of the time bucket (exclusive) in RFC 3339 format.

format: date-time

  • results: array of object

Rows for this time bucket. Empty when the bucket has no data; otherwise a single combined row when group_by[] is omitted, or one row per group (subject to the per-bucket group cap described on the group_by[] parameter).

  • amount: string

Amount (post-discount, pre-credit) in fractional cents.

  • haijun_tag_category: "dm" or "engaged" or "monitoring" or 2 more or null

Haijun Tag (Haijun in Slack) spend category: engaged (a person addressed Haijun in a channel or thread), proactive (Haijun responded without being addressed), scheduled (a scheduled routine ran), monitoring (Haijun watching a channel it was asked to monitor), or dm (direct messages with Haijun). Populated only when haijun_tag_category is in group_by[]; null for usage that is not Haijun Tag. Direct-message usage is billed to the individual user and is reported under that user's product, not under haijun-tag. New categories may be added over time.

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_id: string or null

Slack user ID (for example U0123ABCDEF) of the member the Haijun Tag (Haijun in Slack) usage is attributed to, not a haijun.ai user ID. Populated only when haijun_tag_user_id is in group_by[]; null for usage that is not Haijun Tag and for Haijun Tag usage that is not attributed to a single user (for example monitoring, and proactive usage Haijun initiated), so per-user rows can sum to less than the Haijun Tag total. Cannot be combined with group_by[]=rbac_group_id or the rbac_group_ids[] filter.

  • context_window: "0-200k" or "200k-1M" or null

Context-window pricing tier of the usage or cost. Null unless context_window is in group_by[]; it can also be null on grouped rows with no context-window tier, such as code execution.

  • "0-200k"
  • "200k-1M"
  • cost_type: "code_execution" or "tokens" or "web_search" or null

Cost component when group_by[]=cost_type; null otherwise (amount is the combined total).

  • "code_execution"
  • "tokens"
  • "web_search"
  • currency: "USD"

Currency code for the cost amount. Currently always "USD".

default: USD

  • inference_geo: "global" or "us" or null

Inference region of the usage or cost. Null unless inference_geo is in group_by[]; it can also be null on grouped rows where the region is not set (the rows that inference_geos[]=not_available matches).

  • "global"
  • "us"
  • list_amount: string

List-price amount (pre-discount) in fractional cents.

  • model: string or null

Model that produced the usage or cost, as a model name in the form the models[] filter accepts (for example, haijun-opus-5). Null unless model is in group_by[]; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.

  • product: string or null

Product surface that produced the usage or cost. Null unless product is in group_by[]; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include chat, haijun_code, cowork, office_agent, haijun_in_chrome, haijun_design, and haijun-tag. haijun-tag is Haijun Tag, the Haijun product in Slack. Some unattributed usage is reported as "other".

  • rbac_group_id: string or null

RBAC group (team) the usage is attributed to, in the public tagged rbac_group_... spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an rbac_group_ids[] filter value. Populated only when rbac_group_id is in group_by[]. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without group_by[].

  • requests: number or null

Number of API requests in this row's scope. Null when group_by includes cost_type or token_type (the count has no per-component attribution; read it from the ungrouped response). For sandbox / code-execution events, this counts execution spans rather than HTTP requests (these rows surface with product: null).

  • slack_channel_id: string or null

Slack channel the usage originated from. Populated only when slack_channel_id is in group_by[]; null for usage outside Slack (and for rows recorded before channel attribution was enabled).

  • speed: "fast" or "standard" or null

Inference speed mode of the usage or cost: fast or standard. Null unless speed is in group_by[].

  • "fast"
  • "standard"
  • token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null

Token type when group_by[]=token_type and cost_type=tokens; null otherwise.

  • "cache_creation.ephemeral_1h_input_tokens"
  • "cache_creation.ephemeral_5m_input_tokens"
  • "cache_read_input_tokens"
  • "output_tokens"
  • "uncached_input_tokens"
  • starting_at: string

Start of the time bucket (inclusive) in RFC 3339 format.

format: date-time

  • data_refreshed_at: string or null

RFC 3339 timestamp of the export this response was served from. Null when no export yet covers any part of the requested range, in which case every bucket's results list is empty. Buckets beyond this watermark are incomplete; for stable results, set ending_at to this value or earlier. Data is typically refreshed every 4 hours but not final until about 30 days after the usage date (late-arriving events, reconciliation adjustments).

format: date-time

  • has_more: boolean

Whether another page is available. When true, pass next_page as the page parameter to fetch it.

  • next_page: string or null

Opaque cursor for the next page, or null when has_more is false. Pass it as the page parameter, keeping the other parameters unchanged. A cursor can expire after the underlying data refreshes; the request then returns HTTP 410 and pagination must restart from the first page.

  • organization_id: string

ID of the Organization.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/cost_report \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "ending_at": "2019-12-27T18:11:19.117Z",
      "results": [
        {
          "amount": "amount",
          "haijun_tag_category": "dm",
          "haijun_tag_user_id": "U0123ABCDEF",
          "context_window": "0-200k",
          "cost_type": "code_execution",
          "currency": "USD",
          "inference_geo": "global",
          "list_amount": "list_amount",
          "model": "haijun-opus-5",
          "product": "chat",
          "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
          "requests": 0,
          "slack_channel_id": "C0123ABCDEF",
          "speed": "fast",
          "token_type": "cache_creation.ephemeral_1h_input_tokens"
        }
      ],
      "starting_at": "2019-12-27T18:11:19.117Z"
    }
  ],
  "data_refreshed_at": "2019-12-27T18:11:19.117Z",
  "has_more": true,
  "next_page": "next_page",
  "organization_id": "org_013FP9SaFPBg7Kw7fetjn6cF"
}

Get Per-User Cost

GET /v1/organizations/analytics/user_cost_report

Get per-user cost in USD across a date range.

Returns one row per user, ranked by spend. Use this to see which users account for the most cost. Only cost attributable to a seat user is included; for organization-wide totals including direct API-key and automation traffic, use the bucketed /v1/organizations/analytics/cost_report endpoint. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • starting_at: string

Start of range, inclusive. RFC 3339 tz-aware. Must be within the last 365 days and no earlier than 2026-01-01T00:00:00Z.

format: date-time

  • bucket_width: optional "1d" or "1h" or "1m"

Time-bucket granularity. When set, each row's starting_at and ending_at are populated and one actor may span several rows (one per time bucket with usage). The time bucket counts toward limit, so one page can return multiple rows for the same actor. ending_at is required when bucket_width is set, and with bucket_width="1m" the range may span at most 24 hours. When omitted, each row aggregates the full [starting_at, ending_at) range.

  • "1d"
  • "1h"
  • "1m"
  • haijun_tag_categories: optional array of "dm" or "engaged" or "monitoring" or 2 more

Filter to Haijun Tag (Haijun in Slack) usage in specific spend categories. Usage with no category never matches. dm usage is reported under the user's product rather than haijun-tag, so combining this filter with products[]=haijun-tag excludes it. Use group_by[]=haijun_tag_category to break out per-category values.

maxItems: 100

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_ids: optional array of string

Filter to Haijun Tag (Haijun in Slack) usage attributed to specific Slack users, by Slack user ID (for example U0123ABCDEF), not haijun.ai user ID. Usage that is not Haijun Tag, and Haijun Tag usage not attributed to a single user, never matches. Use group_by[]=haijun_tag_user_id to break out per-user values.

maxItems: 100

  • context_windows: optional array of "0-200k" or "200k-1M"

Filter to specific context-window pricing tiers. Use group_by[]=context_window to break out per-tier values.

maxItems: 100

  • "0-200k"
  • "200k-1M"
  • ending_at: optional string

End of range, exclusive. When omitted, defaults to the earlier of now and starting_at + 31 days. The range may span at most 31 days.

format: date-time

  • exclude_deleted_users: optional boolean

If true, omit rows for users who are deleted (deleted: true). A page may contain fewer than limit rows; use has_more and next_page to paginate as usual.

default: false

  • group_by: optional array of "haijun_tag_category" or "haijun_tag_user_id" or "context_window" or 8 more

Break each actor's row out by the given dimensions. Accepts the same values as the bucketed /cost_report endpoint. The product, model, context_window, inference_geo, and speed dimensions — and the time bucket, when bucket_width is set — count toward limit. cost_type and token_type do not: cost_type returns one row per cost component (tokens, web search, code execution); token_type returns one row per token type, each with cost_type: "tokens"; combining both returns the per-token-type rows plus the web-search and code-execution rows. A page can therefore contain more rows than limit when cost_type or token_type is requested.

maxItems: 100

  • "haijun_tag_category"
  • "haijun_tag_user_id"
  • "context_window"
  • "cost_type"
  • "inference_geo"
  • "model"
  • "product"
  • "rbac_group_id"
  • "slack_channel_id"
  • "speed"
  • "token_type"
  • inference_geos: optional array of "global" or "not_available" or "us"

Filter to specific inference regions. not_available matches rows where the region is unset. Use group_by[]=inference_geo to break out per-region values.

maxItems: 100

  • "global"
  • "not_available"
  • "us"
  • limit: optional number

Number of rows per page (1-1000, default 20). One row per actor unless group_by[] or bucket_width splits an actor across rows; cost_type/token_type fan-out rows (cost endpoint only) are the exception — they do not count toward this limit, so data can exceed it.

default: 20, minimum: 1, maximum: 1000

  • models: optional array of string

Models to include. Defaults to all models. Use group_by[]=model to break out per-model values.

maxItems: 100

  • order: optional "asc" or "desc"

Sort direction. Defaults to desc.

default: desc

  • "asc"
  • "desc"
  • order_by: optional "amount" or "list_amount"

Metric to rank actors by. Defaults to amount.

default: amount

  • "amount"
  • "list_amount"
  • page: optional string

Opaque cursor from a previous response's next_page field.

  • products: optional array of "chat" or "haijun-tag" or "haijun_code" or 4 more

Product surfaces to include. Defaults to all products.

maxItems: 100

  • "chat"
  • "haijun-tag"
  • "haijun_code"
  • "haijun_design"
  • "haijun_in_chrome"
  • "cowork"
  • "office_agent"
  • rbac_group_ids: optional array of string

Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (rbac_group_...) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.

maxItems: 100

  • slack_channel_ids: optional array of string

Filter to usage originating from specific Slack channels. Use group_by[]=slack_channel_id to break out per-channel values.

maxItems: 100

  • speeds: optional array of "fast" or "standard"

Filter to fast or standard inference mode. Use group_by[]=speed to break out per-mode values.

maxItems: 100

  • "fast"
  • "standard"
  • user_ids: optional array of string

Filter to specific users by tagged user ID.

maxItems: 100

Returns

  • BetaUserCost object
  • data: array of object

Rows for this page, ranked by order_by in the order direction. One row per user, or several per user when group_by[] or bucket_width breaks that user's usage or cost out across rows. Rows split out by cost_type or token_type (cost endpoint only) stay adjacent and are ranked as one unit.

  • actor: BetaAnalyticsUserActor

The user this row's usage or cost is attributed to. Always a user_actor.

  • type: "user_actor"

Actor type. Always "user_actor".

  • deleted: boolean

True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). email stays populated for removed users and is null when the account has been deleted. name follows the rules described on that field. The user_id is still populated for reconciliation.

  • email: string or null

The user's email address, including for users who are no longer members of the organization or its associated organizations. Null when the account has been deleted (check deleted) and for system-minted service accounts, which have no person's mailbox behind them (check name).

  • name: string or null

The user's full name. Null when the user has not set a name. Returns "Deleted User" when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, "Haijun Security" for usage by Juglow's security-patching service) or null.

  • user_id: string

Tagged user ID.

  • amount: string

Amount (post-discount, pre-credit) in fractional cents (minor units).

  • haijun_tag_category: "dm" or "engaged" or "monitoring" or 2 more or null

Haijun Tag (Haijun in Slack) spend category: engaged (a person addressed Haijun in a channel or thread), proactive (Haijun responded without being addressed), scheduled (a scheduled routine ran), monitoring (Haijun watching a channel it was asked to monitor), or dm (direct messages with Haijun). Populated only when haijun_tag_category is in group_by[]; null for usage that is not Haijun Tag. Direct-message usage is billed to the individual user and is reported under that user's product, not under haijun-tag. New categories may be added over time.

  • "dm"
  • "engaged"
  • "monitoring"
  • "proactive"
  • "scheduled"
  • haijun_tag_user_id: string or null

Slack user ID (for example U0123ABCDEF) of the member the Haijun Tag (Haijun in Slack) usage is attributed to, not a haijun.ai user ID. Populated only when haijun_tag_user_id is in group_by[]; null for usage that is not Haijun Tag and for Haijun Tag usage that is not attributed to a single user (for example monitoring, and proactive usage Haijun initiated), so per-user rows can sum to less than the Haijun Tag total. Cannot be combined with group_by[]=rbac_group_id or the rbac_group_ids[] filter.

  • context_window: "0-200k" or "200k-1M" or null

Context-window pricing tier of the usage or cost. Null unless context_window is in group_by[]; it can also be null on grouped rows with no context-window tier, such as code execution.

  • "0-200k"
  • "200k-1M"
  • cost_type: "code_execution" or "tokens" or "web_search" or null

Cost component breakdown; null when returning the combined total.

  • "code_execution"
  • "tokens"
  • "web_search"
  • currency: "USD"

Currency code for the cost amount. Currently always "USD".

default: USD

  • ending_at: string or null

End of the row's UTC time bucket (exclusive), as an RFC 3339 timestamp; equal to starting_at plus one bucket_width. Null unless bucket_width is set.

format: date-time

  • inference_geo: "global" or "us" or null

Inference region of the usage or cost. Null unless inference_geo is in group_by[]; it can also be null on grouped rows where the region is not set (the rows that inference_geos[]=not_available matches).

  • "global"
  • "us"
  • list_amount: string

List-price amount (pre-discount) in fractional cents.

  • model: string or null

Model that produced the usage or cost, as a model name in the form the models[] filter accepts (for example, haijun-opus-5). Null unless model is in group_by[]; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.

  • product: string or null

Product surface that produced the usage or cost. Null unless product is in group_by[]; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include chat, haijun_code, cowork, office_agent, haijun_in_chrome, haijun_design, and haijun-tag. haijun-tag is Haijun Tag, the Haijun product in Slack. Some unattributed usage is reported as "other".

  • rbac_group_id: string or null

RBAC group (team) the usage is attributed to, in the public tagged rbac_group_... spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an rbac_group_ids[] filter value. Populated only when rbac_group_id is in group_by[]. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without group_by[].

  • requests: number or null

Number of API requests in this row's scope. Null when group_by includes cost_type or token_type (the count has no per-component attribution; read it from the ungrouped response). For sandbox / code-execution events, this counts execution spans rather than HTTP requests (these rows surface with product: null).

  • slack_channel_id: string or null

Slack channel the usage originated from. Populated only when slack_channel_id is in group_by[]; null for usage outside Slack (and for rows recorded before channel attribution was enabled).

  • speed: "fast" or "standard" or null

Inference speed mode of the usage or cost: fast or standard. Null unless speed is in group_by[].

  • "fast"
  • "standard"
  • starting_at: string or null

Start of the row's UTC time bucket (inclusive), as an RFC 3339 timestamp. Null unless bucket_width is set; without bucket_width, each row aggregates the full requested range.

format: date-time

  • token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null

Token type when cost_type is tokens; null otherwise.

  • "cache_creation.ephemeral_1h_input_tokens"
  • "cache_creation.ephemeral_5m_input_tokens"
  • "cache_read_input_tokens"
  • "output_tokens"
  • "uncached_input_tokens"
  • data_refreshed_at: string or null

RFC 3339 timestamp of the export this response was served from. Null when no export yet covers any part of the requested range, in which case data is empty. Data beyond this watermark is incomplete; for stable results, set ending_at to this value or earlier. Data is typically refreshed every 4 hours but not final until about 30 days after the usage date (late-arriving events, reconciliation adjustments).

format: date-time

  • has_more: boolean

Whether another page is available. When true, pass next_page as the page parameter to fetch it.

  • next_page: string or null

Opaque cursor for the next page, or null when has_more is false. Pass it as the page parameter, keeping the other parameters unchanged. A cursor can expire after the underlying data refreshes; the request then returns HTTP 410 and pagination must restart from the first page.

  • organization_id: string

ID of the Organization.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/user_cost_report \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "actor": {
        "deleted": true,
        "email": "jane@example.com",
        "name": "Jane Smith",
        "type": "user_actor",
        "user_id": "user_01AbCdEfGhIjKlMnOpQrSt"
      },
      "amount": "41280.000000",
      "haijun_tag_category": "dm",
      "haijun_tag_user_id": "U0123ABCDEF",
      "context_window": "0-200k",
      "cost_type": "code_execution",
      "currency": "USD",
      "ending_at": "2019-12-27T18:11:19.117Z",
      "inference_geo": "global",
      "list_amount": "51600.000000",
      "model": "haijun-opus-5",
      "product": "chat",
      "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
      "requests": 128,
      "slack_channel_id": "C0123ABCDEF",
      "speed": "fast",
      "starting_at": "2019-12-27T18:11:19.117Z",
      "token_type": "cache_creation.ephemeral_1h_input_tokens"
    }
  ],
  "data_refreshed_at": "2019-12-27T18:11:19.117Z",
  "has_more": true,
  "next_page": "next_page",
  "organization_id": "org_013FP9SaFPBg7Kw7fetjn6cF"
}

Analytics › Users

List User Activity

GET /v1/organizations/analytics/users

Get per-user activity for a given day, with cursor-based pagination.

Returns activity metrics for each user in the organization, sorted by email address. Use group_by[] for per-RBAC-group aggregates, or filter[] to scope results to specific members, groups, or a chat project. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • date: optional string

UTC date in YYYY-MM-DD format. The day to get user activity for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (haijun_proj_...) and scopes each member's row to their haijun.ai chat activity within that project (it cannot be combined with group_by[] or an rbac_group_id filter); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "rbac_group_id"

Dimensions to break results out by (e.g. group_by[]=rbac_group_id). Supported on this endpoint: rbac_group_id. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.

maxItems: 100

  • limit: optional number

Number of results per page (1-1000, default 100).

minimum: 1, maximum: 1000

  • order: optional "asc" or "desc"

Sort direction: asc or desc. Defaults to asc for the endpoint's sort column and to desc when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.

  • "asc"
  • "desc"
  • order_by: optional string

Sort field. Restricted to the endpoint's sort column plus its rankable metrics (metrics default to descending; a few metrics rank in date-range mode only, per the endpoint's documented orderable set).

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • starting_date: optional string

UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

Returns

  • BetaUserActivity object

Response for GET /v1/organizations/analytics/users.

  • data: array of object
  • chat_metrics: object

Haijun.ai activity metrics for a single user on a given day.

  • connectors_used_count: number

Number of MCP connector invocations.

  • distinct_artifacts_created_count: number

Number of distinct artifacts created. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.

  • distinct_connectors_used_count: number or null

Distinct haijun.ai connectors this user used. Excludes calls whose connector could not be identified and all calls from organizations with zero data retention. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_conversation_count: number or null

Number of distinct conversations the user participated in. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_files_uploaded_count: number or null

Number of distinct files uploaded. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_projects_created_count: number

Number of distinct projects created. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.

  • distinct_projects_used_count: number or null

Number of distinct projects used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_shared_artifacts_viewed_count: number or null

Number of distinct shared artifacts the user viewed. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_skills_used_count: number or null

Number of distinct tracks used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent

  • shared_conversations_viewed_count: number

Number of times the user opened a shared conversation in a project

  • thinking_message_count: number

Number of messages that used extended thinking

  • haijun_code_metrics: object

Haijun Code activity metrics for a single user on a given day.

  • core_metrics: object

Core Haijun Code activity metrics for a single user on a given day.

  • artifacts_created_count: number

Number of artifacts created in Haijun Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.

  • commit_count: number

Number of commits made via Haijun Code

  • distinct_session_count: number or null

Number of distinct Haijun Code sessions. On aggregated rows and in date-range mode: summed per-day distinct counts. A session essentially never spans a UTC day, so the sum is in practice the true distinct count.

  • lines_of_code: object

Lines of code added and removed via Haijun Code.

  • added_count: number

Lines of code added

  • removed_count: number

Lines of code removed

  • pull_request_count: number

Number of pull requests created via Haijun Code

  • tool_actions: object

Per-tool accepted/rejected counts for Haijun Code file modification tools.

  • edit_tool: BetaToolActionCounts

Accepted/rejected counts for a single Haijun Code tool type.

  • accepted_count: number

Number of tool proposals accepted

  • rejected_count: number

Number of tool proposals rejected

  • multi_edit_tool: BetaToolActionCounts

Accepted/rejected counts for a single Haijun Code tool type.

  • notebook_edit_tool: BetaToolActionCounts

Accepted/rejected counts for a single Haijun Code tool type.

  • write_tool: BetaToolActionCounts

Accepted/rejected counts for a single Haijun Code tool type.

  • cowork_metrics: object

Cowork activity metrics for a single user on a given day.

  • action_count: number

Number of tool actions completed in Cowork sessions

  • artifacts_created_count: number

Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.

  • connectors_used_count: number

Total number of connector invocations in Cowork sessions

  • dispatch_turn_count: number

Number of Dispatch (background agent) turns completed

  • distinct_connectors_used_count: number or null

Number of distinct connectors used in Cowork sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_session_count: number or null

Number of distinct Cowork sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_skills_used_count: number or null

Number of distinct tracks used in Cowork sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent in Cowork sessions

  • skills_used_count: number

Total number of track invocations in Cowork sessions

  • distinct_plugins_used_count: optional number or null

Number of distinct plugins used in Cowork sessions. Null while Cowork plugin-use metrics are not enabled for this organization. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • edit_tool_count: optional number or null

Number of successful Edit tool calls in Cowork sessions. Null while the file-edit metrics are not enabled for this organization.

  • file_edit_count: optional number or null

Number of successful file-edit tool calls (Edit, MultiEdit, Write, NotebookEdit) in Cowork sessions. Null, never 0, while the file-edit metrics are not enabled for this organization.

  • multi_edit_tool_count: optional number or null

Number of successful MultiEdit tool calls in Cowork sessions. Null while the file-edit metrics are not enabled for this organization.

  • notebook_edit_tool_count: optional number or null

Number of successful NotebookEdit tool calls in Cowork sessions. Null while the file-edit metrics are not enabled for this organization.

  • plugins_used_count: optional number or null

Total number of plugin invocations in Cowork sessions. Null while Cowork plugin-use metrics are not enabled for this organization.

  • sessions_with_file_edits_count: optional number or null

Number of distinct Cowork sessions with at least one successful file-edit tool call. Null while the file-edit metrics are not enabled for this organization. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • write_tool_count: optional number or null

Number of successful Write tool calls in Cowork sessions. Null while the file-edit metrics are not enabled for this organization.

  • design_metrics: object

Haijun Design activity metrics for a single user on a given day.

  • distinct_projects_created_count: number

Number of distinct Haijun Design projects created. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.

  • distinct_projects_used_count: number or null

Number of distinct Haijun Design projects the user worked in. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_session_count: number or null

Number of distinct Haijun Design sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent in Haijun Design sessions

  • office_metrics: object

Office Agent activity metrics for a single user on a given day, broken out by Office product.

  • excel: BetaOfficeProductMetrics

Office Agent activity metrics for a single user on a given day within one Office product.

  • connectors_used_count: number

Number of MCP connector invocations

  • distinct_connectors_used_count: number or null

Number of distinct MCP connectors used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_session_count: number or null

Number of distinct Office Agent sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_skills_used_count: number or null

Number of distinct tracks used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent

  • skills_used_count: number

Number of track invocations

  • outlook: BetaOfficeProductMetrics

Office Agent activity metrics for a single user on a given day within one Office product.

  • powerpoint: BetaOfficeProductMetrics

Office Agent activity metrics for a single user on a given day within one Office product.

  • word: BetaOfficeProductMetrics

Office Agent activity metrics for a single user on a given day within one Office product.

  • science_metrics: object

Haijun Science activity metrics for a single user on a given day.

  • delegation_count: number

Number of delegations (handoffs to a specialized agent) in Haijun Science sessions

  • distinct_session_count: number or null

Number of distinct Haijun Science sessions. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • message_count: number

Number of messages sent in Haijun Science sessions

  • remote_compute_job_count: number

Number of remote compute jobs launched from Haijun Science sessions

  • skills_used_count: number

Total number of track invocations in Haijun Science sessions

  • web_search_count: number

Number of web searches performed

  • distinct_user_count: optional number or null

Number of distinct active users represented by this row. Only set for grouped rollups (group_by[]); null for per-user rows. In date-range mode, recomputed as an exact distinct count of the group's active members over the requested window, never a sum of per-day values.

  • last_activity_date: optional string or null

Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day from starting_date (inclusive) to ending_date (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (filter[]) only days matching the filter count: with filter[]=rbac_group_id:{id} it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (group_by[]) rows it is the latest day any member of the group was active (the requested date in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.

format: date

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • user: optional BetaAnalyticsUser or null

The user this row describes. Null on rows aggregated across users.

  • type: "user"

Object type. Always user.

default: user

  • id: string

Tagged user identifier (e.g. user_...)

  • email_address: string

Email address of the user

  • next_page: string or null

Opaque cursor for the next page, or null if no more results

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/users \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "chat_metrics": {
        "connectors_used_count": 0,
        "distinct_artifacts_created_count": 0,
        "distinct_connectors_used_count": 0,
        "distinct_conversation_count": 0,
        "distinct_files_uploaded_count": 0,
        "distinct_projects_created_count": 0,
        "distinct_projects_used_count": 0,
        "distinct_shared_artifacts_viewed_count": 0,
        "distinct_skills_used_count": 0,
        "message_count": 0,
        "shared_conversations_viewed_count": 0,
        "thinking_message_count": 0
      },
      "haijun_code_metrics": {
        "core_metrics": {
          "artifacts_created_count": 0,
          "commit_count": 0,
          "distinct_session_count": 0,
          "lines_of_code": {
            "added_count": 0,
            "removed_count": 0
          },
          "pull_request_count": 0
        },
        "tool_actions": {
          "edit_tool": {
            "accepted_count": 0,
            "rejected_count": 0
          },
          "multi_edit_tool": {
            "accepted_count": 0,
            "rejected_count": 0
          },
          "notebook_edit_tool": {
            "accepted_count": 0,
            "rejected_count": 0
          },
          "write_tool": {
            "accepted_count": 0,
            "rejected_count": 0
          }
        }
      },
      "cowork_metrics": {
        "action_count": 0,
        "artifacts_created_count": 0,
        "connectors_used_count": 0,
        "dispatch_turn_count": 0,
        "distinct_connectors_used_count": 0,
        "distinct_session_count": 0,
        "distinct_skills_used_count": 0,
        "message_count": 0,
        "skills_used_count": 0,
        "distinct_plugins_used_count": 0,
        "edit_tool_count": 0,
        "file_edit_count": 0,
        "multi_edit_tool_count": 0,
        "notebook_edit_tool_count": 0,
        "plugins_used_count": 0,
        "sessions_with_file_edits_count": 0,
        "write_tool_count": 0
      },
      "design_metrics": {
        "distinct_projects_created_count": 0,
        "distinct_projects_used_count": 0,
        "distinct_session_count": 0,
        "message_count": 0
      },
      "office_metrics": {
        "excel": {
          "connectors_used_count": 0,
          "distinct_connectors_used_count": 0,
          "distinct_session_count": 0,
          "distinct_skills_used_count": 0,
          "message_count": 0,
          "skills_used_count": 0
        },
        "outlook": {
          "connectors_used_count": 0,
          "distinct_connectors_used_count": 0,
          "distinct_session_count": 0,
          "distinct_skills_used_count": 0,
          "message_count": 0,
          "skills_used_count": 0
        },
        "powerpoint": {
          "connectors_used_count": 0,
          "distinct_connectors_used_count": 0,
          "distinct_session_count": 0,
          "distinct_skills_used_count": 0,
          "message_count": 0,
          "skills_used_count": 0
        },
        "word": {
          "connectors_used_count": 0,
          "distinct_connectors_used_count": 0,
          "distinct_session_count": 0,
          "distinct_skills_used_count": 0,
          "message_count": 0,
          "skills_used_count": 0
        }
      },
      "science_metrics": {
        "delegation_count": 0,
        "distinct_session_count": 0,
        "message_count": 0,
        "remote_compute_job_count": 0,
        "skills_used_count": 0
      },
      "web_search_count": 0,
      "distinct_user_count": 0,
      "last_activity_date": "2019-12-27",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "user": {
        "id": "id",
        "email_address": "email_address",
        "type": "user"
      }
    }
  ],
  "next_page": "next_page"
}

Analytics › Tracks

Get Track Usage

GET /v1/organizations/analytics/tracks

Get per-track usage for a given day, with cursor-based pagination.

Returns track usage metrics for the organization, sorted by track name. Use group_by[] to break usage out per member, per RBAC group, or per product surface, and filter[] to scope results; the parameter descriptions list the supported dimensions. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • date: optional string

UTC date in YYYY-MM-DD format. The day to get track usage for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: product, rbac_group_id, share_status, skill_name, user_id. Value forms: product is one of chat, haijun_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); share_status is one of organization, private, or public; skill_name matches case-insensitively; user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "product" or "rbac_group_id" or "user_id"

Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.

maxItems: 100

  • "product"
  • "rbac_group_id"
  • "user_id"
  • limit: optional number

Number of results per page (1-1000, default 100).

minimum: 1, maximum: 1000

  • order: optional "asc" or "desc"

Sort direction: asc or desc. Defaults to asc for the endpoint's sort column and to desc when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.

  • "asc"
  • "desc"
  • order_by: optional string

Sort field. Restricted to the endpoint's sort column plus its rankable metrics (metrics default to descending; a few metrics rank in date-range mode only, per the endpoint's documented orderable set).

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • starting_date: optional string

UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

Returns

  • BetaSkillUsage object

Response for GET /v1/organizations/analytics/tracks.

  • data: array of object
  • chat_metrics: object

Haijun.ai activity metrics for a single track on a given day.

  • distinct_conversation_skill_used_count: number or null

Number of distinct conversations in which the track was used. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • haijun_code_metrics: object

Haijun Code activity metrics for a single track on a given day.

  • distinct_session_skill_used_count: number or null

Number of distinct Haijun Code sessions in which the track was used. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • cowork_metrics: object

Cowork activity metrics for a single track on a given day.

  • distinct_session_skill_used_count: number or null

Number of distinct Cowork sessions in which the track was used. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_user_count: number

Number of distinct users who used the track on the requested day, or, in date-range mode, over the requested window — recomputed as an exact distinct count over the window's per-member daily rows, never a sum of per-day values. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted.

  • office_metrics: object

Office Agent activity metrics for a single track on a given day, broken out by Office product.

  • excel: BetaSkillOfficeProductMetrics

Office Agent activity metrics for a single track on a given day within one Office product.

  • distinct_session_skill_used_count: number or null

Number of distinct Office Agent sessions in which the track was used. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • outlook: BetaSkillOfficeProductMetrics

Office Agent activity metrics for a single track on a given day within one Office product.

  • powerpoint: BetaSkillOfficeProductMetrics

Office Agent activity metrics for a single track on a given day within one Office product.

  • word: BetaSkillOfficeProductMetrics

Office Agent activity metrics for a single track on a given day within one Office product.

  • skill_name: string

Name of the track

  • attributed_list_price: optional string or null

List-price (rate-card) value of the member requests attributed to this track, as a decimal string in the minor unit of currency (cents for USD), from Haijun Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the track, not the track's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. haijun.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Haijun Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this track. Addable across days: date-range rollup mode returns the window's sum. On group_by[] and filter[] shapes both amounts can total below the ungrouped value for the same track over the same date or range: spend attributed to a member–track pair with no counted usage on that day is excluded from those cuts.

  • currency: optional "USD" or null

Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.

  • enable_count: optional number or null

Distinct accounts that enabled this track on the requested day (haijun.ai only — the track analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to user_id / rbac_group_id / product via group_by[] or filter[] (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the track on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).

  • estimated_overage_spend: optional string or null

Estimated overage spend attributed to this track, as a decimal string in the minor unit of currency (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-track figures are directly comparable; spend with no track attribution — including any member-day without track invocations — is not represented, so track rows sum to at most those totals) across the tracks the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Haijun Code, Cowork, and Office Agent spend use request-level track attribution; haijun.ai chat spend is approximated proportionally to track-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the track, not the track's incremental cost (the same request would still have cost something without the track active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With group_by[]=user_id each row carries the user's own attributed spend. On group_by[] and filter[] shapes both amounts can total below the ungrouped value for the same track over the same date or range: spend attributed to a member–track pair with no counted usage on that day is excluded from those cuts.

  • invocation_count: optional number or null

Total number of times this track was invoked on the requested day (the track analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A track counts as used only when it is explicitly activated — the model (or the user, via the track's slash command) invokes it, reading its instructions into context as part of that activation. Tracks that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.

  • product: optional string or null

Product that produced this row's activity: one of chat, haijun_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and haijun_code occur (the only surfaces with plugin attribution); on /artifacts only chat, haijun_code, and cowork occur (the surfaces that create artifacts); /apps/chat/projects does not support the product dimension (a product entry in group_by[] or filter[] there is rejected). Present only when the request grouped by product.

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • share_status: optional "organization" or "private" or "public" or null

Track share status (haijun.ai only): one of private, organization, or public. Null for tracks used only in Haijun Code or Office (no per-track share-status concept) and when share-status reporting is not yet available for the organization. Filterable via filter[]=share_status:{value}.

  • "organization"
  • "private"
  • "public"
  • skill_display_name: optional string or null

Human-readable display name for rows whose skill_name is an opaque track id (user/organization track types and plugin-delivered tracks — user-defined names are withheld from the analytics pipeline). Organization-shared tracks and tracks delivered by the organization's own plugins (its plugin marketplaces and its library) resolve; plugin track names are shown without their 'plugin:' prefix. The literal 'unknown' bucket row gets a fixed 'Unknown track' label. Null for private (user-defined) tracks and members' personal-plugin tracks — those names are not disclosed to analytics-key holders — and for Juglow-provided plugin tracks (not resolved), and null when skill_name is already a display name, when the track or plugin was deleted, or when display-name resolution is not enabled for this organization.

  • user_id: optional string or null

Tagged user identifier (e.g. user_...). Present only when the request grouped by user_id.

  • next_page: string or null

Opaque cursor for the next page, or null if no more results

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/tracks \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "chat_metrics": {
        "distinct_conversation_skill_used_count": 0
      },
      "haijun_code_metrics": {
        "distinct_session_skill_used_count": 0
      },
      "cowork_metrics": {
        "distinct_session_skill_used_count": 0
      },
      "distinct_user_count": 0,
      "office_metrics": {
        "excel": {
          "distinct_session_skill_used_count": 0
        },
        "outlook": {
          "distinct_session_skill_used_count": 0
        },
        "powerpoint": {
          "distinct_session_skill_used_count": 0
        },
        "word": {
          "distinct_session_skill_used_count": 0
        }
      },
      "skill_name": "skill_name",
      "attributed_list_price": "attributed_list_price",
      "currency": "USD",
      "enable_count": 0,
      "estimated_overage_spend": "estimated_overage_spend",
      "invocation_count": 0,
      "product": "product",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "share_status": "organization",
      "skill_display_name": "skill_display_name",
      "user_id": "user_id"
    }
  ],
  "next_page": "next_page"
}

Analytics › Connectors

Get Connector Usage

GET /v1/organizations/analytics/connectors

Get per-connector usage for a given day, with cursor-based pagination.

Returns connector usage metrics for the organization, sorted by connector name. Connector names are normalized from their various sources — for example, "Atlassian MCP server" and "mcp-atlassian" both appear as "atlassian". Use group_by[] to break usage out per member, per RBAC group, or per product surface, and filter[] to scope results; the parameter descriptions list the supported dimensions. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • date: optional string

UTC date in YYYY-MM-DD format. The day to get connector usage for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: connector_name, product, rbac_group_id, user_id. Value forms: connector_name matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose connector_name is an opaque connector id the connector's display name (connector_display_name) also matches; product is one of chat, haijun_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "product" or "rbac_group_id" or "user_id"

Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.

maxItems: 100

  • "product"
  • "rbac_group_id"
  • "user_id"
  • limit: optional number

Number of results per page (1-1000, default 100).

minimum: 1, maximum: 1000

  • order: optional "asc" or "desc"

Sort direction: asc or desc. Defaults to asc for the endpoint's sort column and to desc when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.

  • "asc"
  • "desc"
  • order_by: optional string

Sort field. Restricted to the endpoint's sort column plus its rankable metrics (metrics default to descending; a few metrics rank in date-range mode only, per the endpoint's documented orderable set).

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • starting_date: optional string

UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

Returns

  • BetaConnectorUsage object

Response for GET /v1/organizations/analytics/connectors.

  • data: array of object
  • chat_metrics: object

Haijun.ai activity metrics for a single connector on a given day.

  • distinct_conversation_connector_used_count: number or null

Number of distinct conversations in which the connector was used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • haijun_code_metrics: object

Haijun Code activity metrics for a single connector on a given day.

  • distinct_session_connector_used_count: number or null

Number of distinct Haijun Code sessions in which the connector was used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • connector_name: string

Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.

  • cowork_metrics: object

Cowork activity metrics for a single connector on a given day.

  • distinct_session_connector_used_count: number or null

Number of distinct Cowork sessions in which the connector was used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_user_count: number

Number of distinct users who used the connector on the requested day, or, in date-range mode, over the requested window — recomputed as an exact distinct count over the window's per-member daily rows, never a sum of per-day values.

  • office_metrics: object

Office Agent activity metrics for a single connector on a given day, broken out by Office product.

  • excel: BetaConnectorOfficeProductMetrics

Office Agent activity metrics for a single connector on a given day within one Office product.

  • distinct_session_connector_used_count: number or null

Number of distinct Office Agent sessions in which the connector was used. Approximate (HLL, typical error <2%) in date-range mode. Null on aggregated rows where a distinct count cannot be computed.

  • outlook: BetaConnectorOfficeProductMetrics

Office Agent activity metrics for a single connector on a given day within one Office product.

  • powerpoint: BetaConnectorOfficeProductMetrics

Office Agent activity metrics for a single connector on a given day within one Office product.

  • word: BetaConnectorOfficeProductMetrics

Office Agent activity metrics for a single connector on a given day within one Office product.

  • connector_display_name: optional string or null

Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:{value} also matches these rows by display name. Display names are not unique, and the same connector's haijun.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.

  • individual_auth_distinct_user_count: optional number or null

Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.

  • managed_auth_distinct_user_count: optional number or null

Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.

  • product: optional string or null

Product that produced this row's activity: one of chat, haijun_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and haijun_code occur (the only surfaces with plugin attribution); on /artifacts only chat, haijun_code, and cowork occur (the surfaces that create artifacts); /apps/chat/projects does not support the product dimension (a product entry in group_by[] or filter[] there is rejected). Present only when the request grouped by product.

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • read_call_count: optional number or null

Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: haijun.ai from 2026-06-01, Haijun Code from 2026-05-30, Haijun in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.

  • unclassified_call_count: optional number or null

Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.

  • user_id: optional string or null

Tagged user identifier (e.g. user_...). Present only when the request grouped by user_id.

  • write_call_count: optional number or null

Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.

  • next_page: string or null

Opaque cursor for the next page, or null if no more results

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/connectors \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "chat_metrics": {
        "distinct_conversation_connector_used_count": 0
      },
      "haijun_code_metrics": {
        "distinct_session_connector_used_count": 0
      },
      "connector_name": "connector_name",
      "cowork_metrics": {
        "distinct_session_connector_used_count": 0
      },
      "distinct_user_count": 0,
      "office_metrics": {
        "excel": {
          "distinct_session_connector_used_count": 0
        },
        "outlook": {
          "distinct_session_connector_used_count": 0
        },
        "powerpoint": {
          "distinct_session_connector_used_count": 0
        },
        "word": {
          "distinct_session_connector_used_count": 0
        }
      },
      "connector_display_name": "connector_display_name",
      "individual_auth_distinct_user_count": 0,
      "managed_auth_distinct_user_count": 0,
      "product": "product",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "read_call_count": 0,
      "unclassified_call_count": 0,
      "user_id": "user_id",
      "write_call_count": 0
    }
  ],
  "next_page": "next_page"
}

Analytics › Chat Projects

Get Chat Project Usage

GET /v1/organizations/analytics/apps/chat/projects

Get per-project activity for a given day, with cursor-based pagination.

Returns activity metrics for each project in the organization, sorted by project ID. Use group_by[] to break projects out per member or per RBAC group, and filter[] to scope results; the parameter descriptions list the supported dimensions. Available to organizations on a Haijun Enterprise plan. Requires an API key with the read:analytics scope.

Query parameters

  • date: optional string

UTC date in YYYY-MM-DD format. The day to get project activity for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (haijun_proj_...); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "rbac_group_id" or "user_id"

Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.

maxItems: 100

  • "rbac_group_id"
  • "user_id"
  • limit: optional number

Number of results per page (1-1000, default 100).

minimum: 1, maximum: 1000

  • order: optional "asc" or "desc"

Sort direction: asc or desc. Defaults to asc for the endpoint's sort column and to desc when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.

  • "asc"
  • "desc"
  • order_by: optional string

Sort field. Restricted to the endpoint's sort column plus its rankable metrics (metrics default to descending; a few metrics rank in date-range mode only, per the endpoint's documented orderable set).

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • starting_date: optional string

UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

Returns

  • BetaChatProjectUsage object

Response for GET /v1/organizations/analytics/apps/chat/projects.

  • data: array of object
  • distinct_user_count: number

Number of distinct users who used the project on the requested day, or, in date-range mode, over the requested window — recomputed as an exact distinct count over the window's per-member daily rows, never a sum of per-day values.

  • message_count: number

Number of messages sent in the project on the requested day

  • project_id: string

Tagged project identifier (e.g. haijun_proj_...)

  • project_name: string

Name of the project

  • created_at: optional string or null

Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.

format: date-time

  • created_by: optional BetaAnalyticsUser or null

User who created the project. Null if the project was deleted before attribution was recorded, or if the creator's account no longer exists.

  • type: "user"

Object type. Always user.

default: user

  • id: string

Tagged user identifier (e.g. user_...)

  • email_address: string

Email address of the user

  • distinct_conversation_count: optional number or null

Number of distinct conversations in the project. Null on aggregated rows where a distinct count cannot be computed.

  • product: optional string or null

Product that produced this row's activity: one of chat, haijun_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and haijun_code occur (the only surfaces with plugin attribution); on /artifacts only chat, haijun_code, and cowork occur (the surfaces that create artifacts); /apps/chat/projects does not support the product dimension (a product entry in group_by[] or filter[] there is rejected). Present only when the request grouped by product.

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • user_id: optional string or null

Tagged user identifier (e.g. user_...). Present only when the request grouped by user_id.

  • next_page: string or null

Opaque cursor for the next page, or null if no more results

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/apps/chat/projects \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "distinct_user_count": 0,
      "message_count": 0,
      "project_id": "project_id",
      "project_name": "project_name",
      "created_at": "2019-12-27T18:11:19.117Z",
      "created_by": {
        "id": "id",
        "email_address": "email_address",
        "type": "user"
      },
      "distinct_conversation_count": 0,
      "product": "product",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "user_id": "user_id"
    }
  ],
  "next_page": "next_page"
}

Analytics › Plugins

Get Plugin Usage

GET /v1/organizations/analytics/plugins

Get per-plugin install + invocation usage for a given day, with pagination.

Returns plugin usage metrics for the organization across Cowork and Haijun Code, sorted by plugin name. The plugin_name value third-party is an aggregate bucket, not a plugin: it collects plugin activity, from either surface, for which the reporting client did not provide a plugin name — so an organization's own plugins can contribute both to their own named rows and to this bucket. Use group_by[] to break usage out per member, per RBAC group, or per product surface (Cowork / Haijun Code), and filter[] to scope results; the parameter descriptions list the supported dimensions. Requires an API key with the read:analytics scope. starting_date / ending_date select range-rollup mode like /tracks.

Query parameters

  • date: optional string

UTC date in YYYY-MM-DD format. The day to get plugin usage for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • ending_date: optional string

UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: plugin_name, product, rbac_group_id, user_id. Value forms: plugin_name matches case-insensitively; product is haijun_code or cowork (the only surfaces with plugin attribution); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "product" or "rbac_group_id" or "user_id"

Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. On this endpoint product takes the values haijun_code or cowork only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.

maxItems: 100

  • "product"
  • "rbac_group_id"
  • "user_id"
  • limit: optional number

Number of results per page (1-1000, default 100).

minimum: 1, maximum: 1000

  • order: optional "asc" or "desc"

Sort direction: asc or desc. Defaults to asc for the endpoint's sort column and to desc when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.

  • "asc"
  • "desc"
  • order_by: optional string

Sort field. Restricted to the endpoint's sort column plus its rankable metrics (metrics default to descending; a few metrics rank in date-range mode only, per the endpoint's documented orderable set).

  • page: optional string

Opaque cursor from a previous response's next_page field.

  • starting_date: optional string

UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

Returns

  • BetaPluginUsage object

Response for GET /v1/organizations/analytics/plugins.

  • data: array of object
  • haijun_code_metrics: object

Haijun Code activity metrics for a single plugin on a given day.

  • distinct_session_plugin_used_count: number or null

Number of distinct Haijun Code sessions in which the plugin was invoked. Null on aggregated rows where a distinct count cannot be computed.

  • cowork_metrics: object

Cowork activity metrics for a single plugin on a given day.

  • distinct_session_plugin_used_count: number or null

Number of distinct Cowork sessions in which the plugin was invoked. Null on aggregated rows where a distinct count cannot be computed.

  • distinct_user_count: number

Number of distinct users with recorded install or invocation activity for the plugin on the requested day (install-only users count), or, in date-range mode, over the requested window — recomputed as an exact distinct count over the window's per-member daily rows, never a sum of per-day values.

  • install_count: number or null

Number of distinct users who installed the plugin on the requested day, or, in date-range mode, over the requested window — recomputed as an exact distinct count over the window's per-member daily rows, never a sum of per-day values.

  • invocation_count: number

Number of plugin invocations on the requested day

  • plugin_name: string

Name of the plugin

  • plugin_id: optional string or null

Stable plugin identifier when available (e.g. serena@haijun-plugins-official). Null for third-party Haijun Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.

  • product: optional string or null

Product that produced this row's activity: one of chat, haijun_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and haijun_code occur (the only surfaces with plugin attribution); on /artifacts only chat, haijun_code, and cowork occur (the surfaces that create artifacts); /apps/chat/projects does not support the product dimension (a product entry in group_by[] or filter[] there is rejected). Present only when the request grouped by product.

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • user_id: optional string or null

Tagged user identifier (e.g. user_...). Present only when the request grouped by user_id.

  • next_page: string or null

Opaque cursor for the next page, or null if no more results

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/plugins \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "haijun_code_metrics": {
        "distinct_session_plugin_used_count": 0
      },
      "cowork_metrics": {
        "distinct_session_plugin_used_count": 0
      },
      "distinct_user_count": 0,
      "install_count": 0,
      "invocation_count": 0,
      "plugin_name": "plugin_name",
      "plugin_id": "plugin_id",
      "product": "product",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "user_id": "user_id"
    }
  ],
  "next_page": "next_page"
}

Analytics › Artifacts

Get Artifact Activity

GET /v1/organizations/analytics/artifacts

Get artifact-creation activity for a given day, broken out by MIME type.

Returns the full (artifact_type, is_shared) cube for the organization; next_page is null except for grouped queries, which paginate. The cube can be broken out per product, per member, or per RBAC group via group_by[], and scoped via filter[]. Requires an API key with the read:analytics scope.

Query parameters

  • date: string

UTC date in YYYY-MM-DD format. The day to get artifact activity for. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.

format: date

  • filter: optional array of string

Filters as dimension:value, e.g. filter[]=rbac_group_id:{id}. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: artifact_type, is_shared, product, rbac_group_id, user_id. Value forms: artifact_type is a canonical artifact MIME type (e.g. text/markdown) or other; is_shared is true or false; product is chat, haijun_code, or cowork (the surfaces that create artifacts); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.

maxItems: 100

  • group_by: optional array of "product" or "rbac_group_id" or "user_id"

Dimensions to break results out by: product, user_id and/or rbac_group_id. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via next_page. product takes the values chat, haijun_code, or cowork (the surfaces that create artifacts). rbac_group_id attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.

maxItems: 100

  • "product"
  • "rbac_group_id"
  • "user_id"
  • limit: optional number

Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; limit is the page size only when group_by[] multiplies the cube.

minimum: 1, maximum: 1000

  • page: optional string

Opaque cursor from a previous response's next_page field. Only valid with group_by[] — the ungrouped cube is never paginated.

Returns

  • BetaArtifactUsage object

Response for GET /v1/organizations/analytics/artifacts.

next_page is null on ungrouped queries — the artifact-type cube is finite and returned in full. Grouped queries (group_by[] on product / user_id / rbac_group_id) multiply the cube and paginate like the other analytics list endpoints.

  • data: array of object
  • artifact_type: string

Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or other. Haijun Code and Cowork artifacts report as text/html.

  • artifacts_created_count: number

Number of artifacts created in this bucket on the requested day

  • distinct_user_count: number

Number of distinct users who created artifacts in this bucket on the requested day

  • is_shared: boolean

Whether the artifacts in this bucket have ever been shared (a Haijun Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).

  • published_artifacts_created_count: number

Number of those artifacts that have been published (for Haijun Code / Cowork artifacts: open to anyone with the link); never exceeds artifacts_created_count

  • product: optional string or null

Product that produced this row's activity: one of chat, haijun_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and haijun_code occur (the only surfaces with plugin attribution); on /artifacts only chat, haijun_code, and cowork occur (the surfaces that create artifacts); /apps/chat/projects does not support the product dimension (a product entry in group_by[] or filter[] there is rejected). Present only when the request grouped by product.

  • rbac_group_id: optional string or null

Tagged RBAC group identifier (rbac_group_...), matching the spend-limits API spelling. Present only when the request grouped by rbac_group_id.

  • rbac_group_name: optional string or null

Resolved RBAC group display name, alongside rbac_group_id when name resolution is available. Null if the group has been deleted or its name could not be resolved; rbac_group_id remains the stable key.

  • user_id: optional string or null

Tagged user identifier (e.g. user_...). Present only when the request grouped by user_id.

  • next_page: string or null

Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.

Example

bash
curl https://haijun.my.id/v1/organizations/analytics/artifacts \
    -H 'juglow-version: 2023-06-01' \
    -H "X-Api-Key: $JUGLOW_API_KEY"
Response (200)
json
{
  "data": [
    {
      "artifact_type": "artifact_type",
      "artifacts_created_count": 0,
      "distinct_user_count": 0,
      "is_shared": true,
      "published_artifacts_created_count": 0,
      "product": "product",
      "rbac_group_id": "rbac_group_id",
      "rbac_group_name": "rbac_group_name",
      "user_id": "user_id"
    }
  ],
  "next_page": "next_page"
}
On this page
Get Activity SummariesQuery parametersReturnsExampleResponse (200)Domain typesBeta Activity SummaryBeta Analytics UserBeta Analytics User ActorBeta Connector Office Product MetricsBeta Office Product MetricsBeta Track Office Product MetricsBeta Tool Action CountsAnalytics › UsageGet Token Usage Over TimeQuery parametersReturnsExampleGet Per-User Token UsageQuery parametersReturnsExampleAnalytics › CostGet Cost Over TimeQuery parametersReturnsExampleGet Per-User CostQuery parametersReturnsExampleAnalytics › UsersList User ActivityQuery parametersReturnsExampleAnalytics › TracksGet Track UsageQuery parametersReturnsExampleAnalytics › ConnectorsGet Connector UsageQuery parametersReturnsExampleAnalytics › Chat ProjectsGet Chat Project UsageQuery parametersReturnsExampleAnalytics › PluginsGet Plugin UsageQuery parametersReturnsExampleAnalytics › ArtifactsGet Artifact ActivityQuery parametersReturnsExample