Analytics
Analytics endpoints of the Ellipsis REST API.
The same data as the analytics dashboard. Windowing: pass explicit start/end, or days (default: the last 30 days). account_type in all|user|bot scopes the authors (bot = the apps/agents). Available to all credential types: the responses expose the organization's own GitHub PR/review activity, no secrets.
curl "https://api.ellipsis.dev/analytics/metrics" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"{
"available_authors": [
{
"login": "string",
"prs": 0
}
],
"available_repos": [
{
"prs": 0,
"repo_full_name": "string"
}
],
"contributors": [
{
"additions": 0,
"ai_attributed_prs": 0,
"avatar_url": "string",
"deletions": 0,
"login": "string",
"prs_merged": 0,
"reviews": 0
}
],
"repositories": [
{
"active_contributors": 0,
"additions": 0,
"ai_attributed_prs": 0,
"deletions": 0,
"prs_merged": 0,
"repo_full_name": "string",
"reviews": 0
}
],
"reviewers": [
{
"approved": 0,
"avatar_url": "string",
"changes_requested": 0,
"comments": 0,
"lines_reviewed": 0,
"login": "string",
"reviews": 0
}
],
"series": [
{
"active_contributors": 0,
"additions": 0,
"approved": 0,
"changes_requested": 0,
"commented": 0,
"commits": 0,
"date": "string",
"deletions": 0,
"prs_closed": 0,
"prs_merged": 0,
"prs_opened": 0,
"review_comments": 0,
"reviews": 0,
"time_to_merge_hours": {
"p0": 0,
"p100": 0,
"p25": 0,
"p50": 0,
"p75": 0
}
}
],
"totals": {
"active_contributors": 0,
"additions": 0,
"approved": 0,
"changes_requested": 0,
"commented": 0,
"commits": 0,
"deletions": 0,
"median_time_to_first_review_hours": 0,
"median_time_to_merge_hours": 0,
"open_prs": 0,
"prs_closed": 0,
"prs_merged": 0,
"prs_opened": 0,
"prs_reviewed": 0,
"review_comments": 0,
"reviews": 0
}
}{
"properties": {
"available_authors": {
"items": {
"properties": {
"login": {
"type": "string"
},
"prs": {
"type": "integer"
}
},
"required": [
"login",
"prs"
],
"type": "object"
},
"type": "array"
},
"available_repos": {
"items": {
"properties": {
"prs": {
"type": "integer"
},
"repo_full_name": {
"type": "string"
}
},
"required": [
"repo_full_name",
"prs"
],
"type": "object"
},
"type": "array"
},
"contributors": {
"items": {
"properties": {
"additions": {
"type": "integer"
},
"ai_attributed_prs": {
"type": "integer"
},
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"deletions": {
"type": "integer"
},
"login": {
"type": "string"
},
"prs_merged": {
"type": "integer"
},
"reviews": {
"type": "integer"
}
},
"required": [
"login",
"avatar_url",
"prs_merged",
"reviews",
"additions",
"deletions",
"ai_attributed_prs"
],
"type": "object"
},
"type": "array"
},
"repositories": {
"items": {
"properties": {
"active_contributors": {
"type": "integer"
},
"additions": {
"type": "integer"
},
"ai_attributed_prs": {
"type": "integer"
},
"deletions": {
"type": "integer"
},
"prs_merged": {
"type": "integer"
},
"repo_full_name": {
"type": "string"
},
"reviews": {
"type": "integer"
}
},
"required": [
"repo_full_name",
"prs_merged",
"reviews",
"active_contributors",
"ai_attributed_prs",
"additions",
"deletions"
],
"type": "object"
},
"type": "array"
},
"reviewers": {
"items": {
"properties": {
"approved": {
"type": "integer"
},
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"changes_requested": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"lines_reviewed": {
"type": "integer"
},
"login": {
"type": "string"
},
"reviews": {
"type": "integer"
}
},
"required": [
"login",
"avatar_url",
"reviews",
"approved",
"changes_requested",
"comments",
"lines_reviewed"
],
"type": "object"
},
"type": "array"
},
"series": {
"items": {
"properties": {
"active_contributors": {
"type": "integer"
},
"additions": {
"type": "integer"
},
"approved": {
"type": "integer"
},
"changes_requested": {
"type": "integer"
},
"commented": {
"type": "integer"
},
"commits": {
"type": "integer"
},
"date": {
"type": "string"
},
"deletions": {
"type": "integer"
},
"prs_closed": {
"type": "integer"
},
"prs_merged": {
"type": "integer"
},
"prs_opened": {
"type": "integer"
},
"review_comments": {
"type": "integer"
},
"reviews": {
"type": "integer"
},
"time_to_merge_hours": {
"properties": {
"p0": {
"type": "number"
},
"p100": {
"type": "number"
},
"p25": {
"type": "number"
},
"p50": {
"type": "number"
},
"p75": {
"type": "number"
}
},
"required": [
"p0",
"p25",
"p50",
"p75",
"p100"
],
"type": "object"
}
},
"required": [
"date",
"prs_opened",
"prs_merged",
"prs_closed",
"reviews",
"approved",
"changes_requested",
"commented",
"review_comments",
"additions",
"deletions",
"commits",
"active_contributors",
"time_to_merge_hours"
],
"type": "object"
},
"type": "array"
},
"totals": {
"properties": {
"active_contributors": {
"type": "integer"
},
"additions": {
"type": "integer"
},
"approved": {
"type": "integer"
},
"changes_requested": {
"type": "integer"
},
"commented": {
"type": "integer"
},
"commits": {
"type": "integer"
},
"deletions": {
"type": "integer"
},
"median_time_to_first_review_hours": {
"type": "number"
},
"median_time_to_merge_hours": {
"type": "number"
},
"open_prs": {
"type": "integer"
},
"prs_closed": {
"type": "integer"
},
"prs_merged": {
"type": "integer"
},
"prs_opened": {
"type": "integer"
},
"prs_reviewed": {
"type": "integer"
},
"review_comments": {
"type": "integer"
},
"reviews": {
"type": "integer"
}
},
"required": [
"prs_opened",
"prs_merged",
"prs_closed",
"reviews",
"prs_reviewed",
"approved",
"changes_requested",
"commented",
"review_comments",
"additions",
"deletions",
"commits",
"active_contributors",
"open_prs",
"median_time_to_merge_hours",
"median_time_to_first_review_hours"
],
"type": "object"
}
},
"required": [
"series",
"totals",
"repositories",
"contributors",
"reviewers",
"available_repos",
"available_authors"
],
"type": "object"
}Request
Filter to repositories by "owner/name".
Filter by PR-author login(s).
"all"stringFilter by parent-PR status (open|draft|merged|closed).
Responses
Windowing: pass explicit start/end, or days (default: the last 30 days).
curl "https://api.ellipsis.dev/analytics/pull-requests" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"{
"facets": {
"account_types": [
"string"
],
"authors": [
{
"account_type": "string",
"author_id": 0,
"avatar_url": "string",
"login": "string",
"prs": 0
}
],
"repos": [
{
"prs": 0,
"repository_id": 0,
"repository_name": "string"
}
]
},
"recent": [
{
"additions": 0,
"changed_files": 0,
"commits": 0,
"created_at": "2026-01-01T00:00:00Z",
"deletions": 0,
"head_ref": "string",
"head_sha": "string",
"html_url": "string",
"id": 0,
"merged_at": "2026-01-01T00:00:00Z",
"number": 0,
"repository_name": "string",
"status": "string",
"title": "string",
"user_avatar_url": "string",
"user_login": "string"
}
],
"series": [
{
"authors": 0,
"authors_bot": 0,
"authors_human": 0,
"closed": 0,
"commits": 0,
"commits_bot": 0,
"commits_human": 0,
"date": "string",
"lines": 0,
"lines_bot": 0,
"lines_human": 0,
"merge_time": {
"p0": 0,
"p100": 0,
"p25": 0,
"p50": 0,
"p75": 0
},
"merged": 0,
"prs": 0,
"prs_bot": 0,
"prs_human": 0
}
],
"totals": {
"active_authors": 0,
"commits": 0,
"lines": 0,
"merge_time_p50_hours": 0,
"merged": 0,
"prs": 0
},
"truncated": false
}{
"properties": {
"facets": {
"properties": {
"account_types": {
"items": {
"type": "string"
},
"type": "array"
},
"authors": {
"items": {
"properties": {
"account_type": {
"type": "string"
},
"author_id": {
"type": "integer"
},
"avatar_url": {
"type": "string"
},
"login": {
"type": "string"
},
"prs": {
"type": "integer"
}
},
"required": [
"author_id",
"login",
"avatar_url",
"account_type",
"prs"
],
"type": "object"
},
"type": "array"
},
"repos": {
"items": {
"properties": {
"prs": {
"type": "integer"
},
"repository_id": {
"type": "integer"
},
"repository_name": {
"type": "string"
}
},
"required": [
"repository_id",
"repository_name",
"prs"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"repos",
"authors",
"account_types"
],
"type": "object"
},
"recent": {
"items": {
"properties": {
"additions": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"changed_files": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"commits": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"created_at": {
"format": "date-time",
"type": "string"
},
"deletions": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"head_ref": {
"type": "string"
},
"head_sha": {
"type": "string"
},
"html_url": {
"type": "string"
},
"id": {
"type": "integer"
},
"merged_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
]
},
"number": {
"type": "integer"
},
"repository_name": {
"type": "string"
},
"status": {
"type": "string"
},
"title": {
"type": "string"
},
"user_avatar_url": {
"type": "string"
},
"user_login": {
"type": "string"
}
},
"required": [
"id",
"number",
"title",
"status",
"repository_name",
"head_sha",
"head_ref",
"user_login",
"user_avatar_url",
"additions",
"deletions",
"changed_files",
"commits",
"created_at",
"merged_at",
"html_url"
],
"type": "object"
},
"type": "array"
},
"series": {
"items": {
"properties": {
"authors": {
"type": "integer"
},
"authors_bot": {
"type": "integer"
},
"authors_human": {
"type": "integer"
},
"closed": {
"type": "integer"
},
"commits": {
"type": "integer"
},
"commits_bot": {
"type": "integer"
},
"commits_human": {
"type": "integer"
},
"date": {
"type": "string"
},
"lines": {
"type": "integer"
},
"lines_bot": {
"type": "integer"
},
"lines_human": {
"type": "integer"
},
"merge_time": {
"properties": {
"p0": {
"type": "number"
},
"p100": {
"type": "number"
},
"p25": {
"type": "number"
},
"p50": {
"type": "number"
},
"p75": {
"type": "number"
}
},
"required": [
"p0",
"p25",
"p50",
"p75",
"p100"
],
"type": "object"
},
"merged": {
"type": "integer"
},
"prs": {
"type": "integer"
},
"prs_bot": {
"type": "integer"
},
"prs_human": {
"type": "integer"
}
},
"required": [
"date",
"prs",
"prs_human",
"prs_bot",
"merged",
"closed",
"lines",
"lines_human",
"lines_bot",
"commits",
"commits_human",
"commits_bot",
"authors",
"authors_human",
"authors_bot",
"merge_time"
],
"type": "object"
},
"type": "array"
},
"totals": {
"properties": {
"active_authors": {
"type": "integer"
},
"commits": {
"type": "integer"
},
"lines": {
"type": "integer"
},
"merge_time_p50_hours": {
"type": "number"
},
"merged": {
"type": "integer"
},
"prs": {
"type": "integer"
}
},
"required": [
"prs",
"merged",
"lines",
"commits",
"active_authors",
"merge_time_p50_hours"
],
"type": "object"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"series",
"totals",
"facets",
"recent",
"truncated"
],
"type": "object"
}Request
Responses
account_type scopes reviewers (bot|user|all) — e.g. "what apps review the most PRs?" is the reviewer facets here with account_type=bot. Windowing: pass explicit start/end, or days (default: the last 30 days).
curl "https://api.ellipsis.dev/analytics/reviews" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"{
"facets": {
"authors": [
{
"account_type": "string",
"avatar_url": "string",
"login": "string",
"reviews": 0
}
],
"repos": [
{
"repository_name": "string",
"reviews": 0
}
]
},
"review_comments": [
{
"author": {
"avatar_url": "string",
"id": 0,
"login": "string",
"type": "string"
},
"base_ref": "string",
"body_preview": "string",
"created_at": "2026-01-01T00:00:00Z",
"html_url": "string",
"id": 0,
"path": "string",
"pr_html_url": "string",
"pr_number": 0,
"pr_status": "string",
"pr_title": "string",
"repo_name": "string",
"thumbs_down": 0,
"thumbs_up": 0
}
],
"reviews": [
{
"base_ref": "string",
"comment_count": 0,
"has_body": false,
"html_url": "string",
"id": 0,
"pr_author": {
"avatar_url": "string",
"id": 0,
"login": "string",
"type": "string"
},
"pr_html_url": "string",
"pr_number": 0,
"pr_status": "string",
"pr_title": "string",
"repo_name": "string",
"reviewer": {
"avatar_url": "string",
"id": 0,
"login": "string",
"type": "string"
},
"state": "string",
"submitted_at": "2026-01-01T00:00:00Z"
}
],
"series": [
{
"approved": 0,
"changes_requested": 0,
"commented": 0,
"comments": 0,
"comments_bot": 0,
"comments_human": 0,
"date": "string",
"reviewers_bot": 0,
"reviewers_human": 0,
"reviewers_total": 0,
"reviews": 0
}
],
"totals": {
"comments": 0,
"comments_bot": 0,
"comments_human": 0,
"prs": 0,
"reviewers": 0,
"reviews": 0,
"thumbs_down": 0,
"thumbs_up": 0
}
}{
"properties": {
"facets": {
"properties": {
"authors": {
"items": {
"properties": {
"account_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"login": {
"type": "string"
},
"reviews": {
"type": "integer"
}
},
"required": [
"login",
"avatar_url",
"account_type",
"reviews"
],
"type": "object"
},
"type": "array"
},
"repos": {
"items": {
"properties": {
"repository_name": {
"type": "string"
},
"reviews": {
"type": "integer"
}
},
"required": [
"repository_name",
"reviews"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"repos",
"authors"
],
"type": "object"
},
"review_comments": {
"items": {
"properties": {
"author": {
"properties": {
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"login": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"login",
"type",
"avatar_url"
],
"type": "object"
},
"base_ref": {
"type": "string"
},
"body_preview": {
"type": "string"
},
"created_at": {
"format": "date-time",
"type": "string"
},
"html_url": {
"type": "string"
},
"id": {
"type": "integer"
},
"path": {
"type": "string"
},
"pr_html_url": {
"type": "string"
},
"pr_number": {
"type": "integer"
},
"pr_status": {
"type": "string"
},
"pr_title": {
"type": "string"
},
"repo_name": {
"type": "string"
},
"thumbs_down": {
"type": "integer"
},
"thumbs_up": {
"type": "integer"
}
},
"required": [
"id",
"created_at",
"html_url",
"path",
"body_preview",
"author",
"thumbs_up",
"thumbs_down",
"pr_number",
"pr_title",
"pr_html_url",
"pr_status",
"repo_name",
"base_ref"
],
"type": "object"
},
"type": "array"
},
"reviews": {
"items": {
"properties": {
"base_ref": {
"type": "string"
},
"comment_count": {
"type": "integer"
},
"has_body": {
"type": "boolean"
},
"html_url": {
"type": "string"
},
"id": {
"type": "integer"
},
"pr_author": {
"properties": {
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"login": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"login",
"type",
"avatar_url"
],
"type": "object"
},
"pr_html_url": {
"type": "string"
},
"pr_number": {
"type": "integer"
},
"pr_status": {
"type": "string"
},
"pr_title": {
"type": "string"
},
"repo_name": {
"type": "string"
},
"reviewer": {
"properties": {
"avatar_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"login": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"login",
"type",
"avatar_url"
],
"type": "object"
},
"state": {
"type": "string"
},
"submitted_at": {
"format": "date-time",
"type": "string"
}
},
"required": [
"id",
"state",
"submitted_at",
"html_url",
"has_body",
"comment_count",
"reviewer",
"pr_number",
"pr_title",
"pr_html_url",
"pr_status",
"pr_author",
"repo_name",
"base_ref"
],
"type": "object"
},
"type": "array"
},
"series": {
"items": {
"properties": {
"approved": {
"type": "integer"
},
"changes_requested": {
"type": "integer"
},
"commented": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"comments_bot": {
"type": "integer"
},
"comments_human": {
"type": "integer"
},
"date": {
"type": "string"
},
"reviewers_bot": {
"type": "integer"
},
"reviewers_human": {
"type": "integer"
},
"reviewers_total": {
"type": "integer"
},
"reviews": {
"type": "integer"
}
},
"required": [
"date",
"reviews",
"approved",
"commented",
"changes_requested",
"reviewers_human",
"reviewers_bot",
"reviewers_total",
"comments",
"comments_human",
"comments_bot"
],
"type": "object"
},
"type": "array"
},
"totals": {
"properties": {
"comments": {
"type": "integer"
},
"comments_bot": {
"type": "integer"
},
"comments_human": {
"type": "integer"
},
"prs": {
"type": "integer"
},
"reviewers": {
"type": "integer"
},
"reviews": {
"type": "integer"
},
"thumbs_down": {
"type": "integer"
},
"thumbs_up": {
"type": "integer"
}
},
"required": [
"reviews",
"reviewers",
"prs",
"comments",
"comments_human",
"comments_bot",
"thumbs_up",
"thumbs_down"
],
"type": "object"
}
},
"required": [
"reviews",
"review_comments",
"series",
"totals",
"facets"
],
"type": "object"
}Request
Filter by reviewer login(s).
"all"string