GET /analytics/metrics
Return PR and review analytics metrics.
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/v1/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
}
}import os
from ellipsis import Ellipsis
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
result = client.analytics.metrics()
print(result){
"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
}
}import { Ellipsis } from '@ellipsis-dev/sdk';
const client = new Ellipsis({
apiKey: process.env.ELLIPSIS_API_TOKEN!,
});
const result = await client.analytics.metrics();
console.log(result);{
"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
}
}No request body.
{
"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
daysinteger
startstring · date-time
endstring · date-time
repoarray<string>
Filter to repositories by "owner/name".
authorarray<string>
Filter by PR-author login(s).
account_typedefault
"all"stringstatusarray<string>
Filter by parent-PR status (open|draft|merged|closed).