Skip to main content

New AI Tools

GET /clients/{client_id}/analytics/apps/ai/recent

Deprecated — Use App Utilization

This endpoint is superseded by the generic App Utilization with ?category_ids=<ai_id>&filter=discovered. usage_level is now available on that endpoint.

Replacement:

GET /clients/{client_id}/analytics/apps/utilization?category_ids=<ai_id>&filter=discovered

Note: the user count field is named unique_users on the replacement (was user_count here).

Returns a paginated list of AI applications first seen by this client during the reporting period. Each row contains a lightweight app reference alongside the user count, comparison-period change percentage, and a usage level classification.

An app is "first seen" if it has no usage records for this client before start_date.

This endpoint powers the New AI Tools table. For the summary card metric, use New AI Tools Summary.

For what qualifies as an "AI App", see AI Apps Overview. For how usage_level is computed, see Usage Level.

Path Parameters

ParameterTypeDescription
client_idstring (uuid)Unique identifier for the client organization

Query Parameters

ParameterTypeRequiredDefaultDescription
granularitystringYes-Aggregation granularity: daily, weekly, monthly, quarterly
start_datestringYes-Start of period (YYYY-MM-DD)
end_datestringYes-End of period, inclusive (YYYY-MM-DD)
compare_start_datestringNo-Comparison period start (YYYY-MM-DD). Must be provided with compare_end_date.
compare_end_datestringNo-Comparison period end, inclusive (YYYY-MM-DD). Must be provided with compare_start_date.
sort_bystringNouser_countSort field: canonical_name, user_count
sort_orderstringNodescSort direction: asc, desc
page_sizeintegerNo50Items per page. Max: 200
cursorstringNo-Pagination cursor from a previous response

Comparison period

When both compare_start_date and compare_end_date are provided, user_count.change_pct contains the percentage change from the comparison period to the primary period. When omitted, user_count.change_pct is null.

Providing only one of the two comparison parameters returns 400.

Response

FieldTypeDescription
dataAiAppUsageItem[]Array of AI app usage objects
total_countintegerTotal number of newly discovered AI apps matching the current filters
next_cursorstring | nullCursor for the next page. null when on the last page.

This endpoint reuses the same AiAppUsageItem shape as the AI App Users list -- same app reference, user count, change percentage, and usage level.

Example Requests

New tools in February 2026

curl -X GET "https://api.example.com/v2/clients/aa7cf840-9ca9-46a3-9778-9015d6580d50/analytics/apps/ai/recent?start_date=2026-02-01&end_date=2026-02-28" \
-H "Authorization: Bearer YOUR_API_TOKEN"

With comparison period

curl -X GET "https://api.example.com/v2/clients/aa7cf840-9ca9-46a3-9778-9015d6580d50/analytics/apps/ai/recent?start_date=2026-02-01&end_date=2026-02-28&compare_start_date=2026-01-01&compare_end_date=2026-01-31" \
-H "Authorization: Bearer YOUR_API_TOKEN"

Example Responses

With comparison period

{
"data": [
{
"app": {
"id": "a1b2c3d4-0001-4000-8000-000000000001",
"canonical_name": "ChatGPT",
"logo": "https://cdn.example.com/logos/chatgpt.png",
"type": "browser",
"is_favorite": false,
"is_approved": false
},
"user_count": { "value": 2, "change_pct": 100.0, "compare_value": 1 },
"usage_level": "light"
},
{
"app": {
"id": "a1b2c3d4-0002-4000-8000-000000000002",
"canonical_name": "Jasper",
"logo": "https://cdn.example.com/logos/jasper.png",
"type": "browser",
"is_favorite": false,
"is_approved": false
},
"user_count": { "value": 1, "change_pct": null, "compare_value": null },
"usage_level": "light"
}
],
"total_count": 2,
"next_cursor": null
}

Without comparison period

{
"data": [
{
"app": {
"id": "a1b2c3d4-0001-4000-8000-000000000001",
"canonical_name": "ChatGPT",
"logo": "https://cdn.example.com/logos/chatgpt.png",
"type": "browser",
"is_favorite": false,
"is_approved": false
},
"user_count": { "value": 2, "change_pct": null, "compare_value": null },
"usage_level": "light"
}
],
"total_count": 2,
"next_cursor": null
}

Empty Result

{
"data": [],
"total_count": 0,
"next_cursor": null
}

Pagination

This endpoint uses cursor-based pagination.

  1. Omit cursor on the first request
  2. If next_cursor is not null, pass its value as cursor on the next request
  3. Repeat until next_cursor is null

Error Responses

StatusDescription
400Invalid parameters (bad date format, range exceeds 366 days, mismatched comparison params, unknown sort_by value)
401Authentication required
403Insufficient permissions for this client
404Client not found
500Server error

Notes

  • "First seen" is determined by the earliest activity_date for the app+client combination in app_usage_reports. If the app had usage before start_date, it is excluded regardless of the comparison period.
  • The user_count.change_pct for a newly discovered tool compares against the comparison period's newly discovered tools (tools first seen during the comparison period), not against the same app's prior usage.