Project analytics
GET /organization/{orgId}/project/{projectId}/stats/analytics
Run analytics stats for a project
Authorization
bearer In: header
Path Parameters
Organization ID — must match the project's owning org.
Project ID.
Query Parameters
Comma-separated stat types to compute. Order does not matter. Stats: overdueByAssignee, avgReviewTime, documentVolume, topContributors, assignedDocuments, delaysByConsultantType, reviewTimeByConsultant, changeOrderSummary, documentTrend, overdueTrend, stepResponseTime.
ISO-8601 date or date-time. Lower bound for the stat (which timestamp is bounded depends on the stat — documents.createdAt, documents.dueDate, documentSections.reviewedAt, etc.).
ISO-8601 date or date-time. Upper bound, same column as from.
Comma-separated document types from the document_type_code enum (matches documents.type exactly): Bulletin, CA, CD, Certificate, CO, minute, PC, Quote, report, RFI, SI, Submittal. Case-sensitive.
Comma-separated document_status values (draft, issued, submitted, with-consultants, closed, accepted, approved, returned, etc.).
Filter to one user (Part3 user UID). Currently used by assignedDocuments. For web-app users on assignedDocuments, this is force-overridden to their own UID server-side.
When set, stats that support bucketing (most of them — see the description for the per-stat support matrix) include a buckets array of {date, count} alongside the aggregate.
"daily" | "weekly" | "monthly"Number of buckets when granularity is set. Defaults: 7 (daily), 4 (weekly), 12 (monthly). Pass as a string — query-string-encoded integer.
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://api.part3.io/v1/organization/org_8a1b2c3d4e/project/proj_5f9a3c2e8b/stats/analytics"{
"overdueByAssignee": {
"all": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"overdueCount": 7
},
{
"userId": "user_3b2a1c9d8e",
"name": "Marcus Chen",
"email": "marcus@example.com",
"overdueCount": 4
}
],
"byType": {
"RFI": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"overdueCount": 5
}
],
"Submittal": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"overdueCount": 2
},
{
"userId": "user_3b2a1c9d8e",
"name": "Marcus Chen",
"email": "marcus@example.com",
"overdueCount": 4
}
]
}
},
"documentVolume": {
"all": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"documentCount": 28
}
],
"byType": {
"RFI": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"documentCount": 12
}
],
"Submittal": [
{
"userId": "user_99a8b7c6d5",
"name": "Anika Patel",
"email": "anika@example.com",
"documentCount": 16
}
]
}
},
"documentTrend": {
"buckets": [
{
"date": "2026-04-06",
"count": 11
},
{
"date": "2026-04-13",
"count": 14
},
{
"date": "2026-04-20",
"count": 9
},
{
"date": "2026-04-27",
"count": 17
}
],
"granularity": "weekly"
}
}{
"error": "Insufficient permissions"
}{
"error": "Insufficient permissions"
}{
"error": "Insufficient permissions"
}