New AI Tools
GET /clients/{client_id}/analytics/apps/ai/recent
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
| Parameter | Type | Description |
|---|---|---|
client_id | string (uuid) | Unique identifier for the client organization |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
granularity | string | Yes | - | Aggregation granularity: daily, weekly, monthly, quarterly |
start_date | string | Yes | - | Start of period (YYYY-MM-DD) |
end_date | string | Yes | - | End of period, inclusive (YYYY-MM-DD) |
compare_start_date | string | No | - | Comparison period start (YYYY-MM-DD). Must be provided with compare_end_date. |
compare_end_date | string | No | - | Comparison period end, inclusive (YYYY-MM-DD). Must be provided with compare_start_date. |
sort_by | string | No | user_count | Sort field: canonical_name, user_count |
sort_order | string | No | desc | Sort direction: asc, desc |
page_size | integer | No | 50 | Items per page. Max: 200 |
cursor | string | No | - | 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
| Field | Type | Description |
|---|---|---|
data | AiAppUsageItem[] | Array of AI app usage objects |
total_count | integer | Total number of newly discovered AI apps matching the current filters |
next_cursor | string | null | Cursor 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.
- Omit
cursoron the first request - If
next_cursoris notnull, pass its value ascursoron the next request - Repeat until
next_cursorisnull
Error Responses
| Status | Description |
|---|---|
| 400 | Invalid parameters (bad date format, range exceeds 366 days, mismatched comparison params, unknown sort_by value) |
| 401 | Authentication required |
| 403 | Insufficient permissions for this client |
| 404 | Client not found |
| 500 | Server error |
Notes
- "First seen" is determined by the earliest
activity_datefor the app+client combination inapp_usage_reports. If the app had usage beforestart_date, it is excluded regardless of the comparison period. - The
user_count.change_pctfor 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.
Related Endpoints
- New AI Tools Summary -- Summary card metric for new tool count
- AI App Users -- All AI apps ranked by user count
- AI Apps Overview -- Domain overview and usage level formula