Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
d11d317
feat: Add support for Copilot usage metrics reports API
henriklundstrom Dec 29, 2025
76a0b03
Merge branch 'master' into copilot-metrics-reports
henriklundstrom Dec 29, 2025
cc49b28
refactor: use separate structs for single-day and multi-day responses
henriklundstrom Dec 30, 2025
ebf0bee
Merge branch 'master' into copilot-metrics-reports
henriklundstrom Jan 2, 2026
ed3fa22
refactor: rename CopilotMetricsDailyReportResponse to CopilotMetricsD…
henriklundstrom Jan 2, 2026
9a7018b
refactor: rename CopilotMetricsPeriodReportResponse to CopilotMetrics…
henriklundstrom Jan 2, 2026
0afbbea
refactor: rename GetEnterpriseMetricsReport28Day to GetEnterpriseMetr…
henriklundstrom Jan 2, 2026
0a55e0c
refactor: rename GetEnterpriseMetricsReportUsers28Day to GetEnterpris…
henriklundstrom Jan 2, 2026
ec61a54
refactor: rename GetOrganizationMetricsReport28Day to GetOrganization…
henriklundstrom Jan 2, 2026
b0ab2e2
refactor: rename GetOrganizationMetricsReportUsers28Day to GetOrganiz…
henriklundstrom Jan 2, 2026
5c179e9
refactor: rename GetEnterpriseMetricsReport1Day to GetEnterpriseDaily…
henriklundstrom Jan 2, 2026
a936b91
refactor: rename GetEnterpriseMetricsReportUsers1Day to GetEnterprise…
henriklundstrom Jan 2, 2026
e4d51ec
refactor: rename GetOrganizationMetricsReport1Day to GetOrganizationD…
henriklundstrom Jan 2, 2026
beae111
refactor: rename GetOrganizationMetricsReportUsers1Day to GetOrganiza…
henriklundstrom Jan 2, 2026
70c494c
refactor: rename CopilotMetricsDailyReport to CopilotDailyMetricsReport
henriklundstrom Jan 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 210 additions & 0 deletions github/copilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,24 @@ type CopilotMetrics struct {
CopilotDotcomPullRequests *CopilotDotcomPullRequests `json:"copilot_dotcom_pull_requests,omitempty"`
}

// CopilotMetricsReportOptions specifies the optional parameters for single-day metrics report endpoints.
type CopilotMetricsReportOptions struct {
Day string `url:"day"` // Required, format: YYYY-MM-DD
}

// CopilotDailyMetricsReport represents the response from 1-day Copilot metrics report endpoints.
type CopilotDailyMetricsReport struct {
DownloadLinks []string `json:"download_links"`
ReportDay string `json:"report_day"`
}

// CopilotMetricsReport represents the response from 28-day Copilot metrics report endpoints.
type CopilotMetricsReport struct {
DownloadLinks []string `json:"download_links"`
ReportStartDay string `json:"report_start_day"`
ReportEndDay string `json:"report_end_day"`
}

// UnmarshalJSON implements the json.Unmarshaler interface.
func (cp *CopilotSeatDetails) UnmarshalJSON(data []byte) error {
// Using an alias to avoid infinite recursion when calling json.Unmarshal
Expand Down Expand Up @@ -574,3 +592,195 @@ func (s *CopilotService) GetOrganizationTeamMetrics(ctx context.Context, org, te

return metrics, resp, nil
}

// GetEnterpriseDailyMetricsReport gets a report containing Copilot metrics for a single day for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-enterprise-usage-metrics-for-a-specific-day
//
//meta:operation GET /enterprises/{enterprise}/copilot/metrics/reports/enterprise-1-day
func (s *CopilotService) GetEnterpriseDailyMetricsReport(ctx context.Context, enterprise string, opts *CopilotMetricsReportOptions) (*CopilotDailyMetricsReport, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/metrics/reports/enterprise-1-day", enterprise)
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotDailyMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetEnterpriseMetricsReport gets a report containing Copilot metrics for a 28-day rolling window for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-enterprise-usage-metrics
//
//meta:operation GET /enterprises/{enterprise}/copilot/metrics/reports/enterprise-28-day/latest
func (s *CopilotService) GetEnterpriseMetricsReport(ctx context.Context, enterprise string) (*CopilotMetricsReport, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/metrics/reports/enterprise-28-day/latest", enterprise)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetEnterpriseUsersDailyMetricsReport gets a report containing Copilot user metrics for a single day for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-users-usage-metrics-for-a-specific-day
//
//meta:operation GET /enterprises/{enterprise}/copilot/metrics/reports/users-1-day
func (s *CopilotService) GetEnterpriseUsersDailyMetricsReport(ctx context.Context, enterprise string, opts *CopilotMetricsReportOptions) (*CopilotDailyMetricsReport, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/metrics/reports/users-1-day", enterprise)
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotDailyMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetEnterpriseUsersMetricsReport gets a report containing Copilot user metrics for a 28-day rolling window for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-users-usage-metrics
//
//meta:operation GET /enterprises/{enterprise}/copilot/metrics/reports/users-28-day/latest
func (s *CopilotService) GetEnterpriseUsersMetricsReport(ctx context.Context, enterprise string) (*CopilotMetricsReport, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/metrics/reports/users-28-day/latest", enterprise)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetOrganizationDailyMetricsReport gets a report containing Copilot metrics for a single day for an organization.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-organization-usage-metrics-for-a-specific-day
//
//meta:operation GET /orgs/{org}/copilot/metrics/reports/organization-1-day
func (s *CopilotService) GetOrganizationDailyMetricsReport(ctx context.Context, org string, opts *CopilotMetricsReportOptions) (*CopilotDailyMetricsReport, *Response, error) {
u := fmt.Sprintf("orgs/%v/copilot/metrics/reports/organization-1-day", org)
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotDailyMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetOrganizationMetricsReport gets a report containing Copilot metrics for a 28-day rolling window for an organization.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-organization-usage-metrics
//
//meta:operation GET /orgs/{org}/copilot/metrics/reports/organization-28-day/latest
func (s *CopilotService) GetOrganizationMetricsReport(ctx context.Context, org string) (*CopilotMetricsReport, *Response, error) {
u := fmt.Sprintf("orgs/%v/copilot/metrics/reports/organization-28-day/latest", org)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetOrganizationUsersDailyMetricsReport gets a report containing Copilot user metrics for a single day for an organization.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-organization-users-usage-metrics-for-a-specific-day
//
//meta:operation GET /orgs/{org}/copilot/metrics/reports/users-1-day
func (s *CopilotService) GetOrganizationUsersDailyMetricsReport(ctx context.Context, org string, opts *CopilotMetricsReportOptions) (*CopilotDailyMetricsReport, *Response, error) {
u := fmt.Sprintf("orgs/%v/copilot/metrics/reports/users-1-day", org)
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotDailyMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}

// GetOrganizationUsersMetricsReport gets a report containing Copilot user metrics for a 28-day rolling window for an organization.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-usage-metrics#get-copilot-organization-users-usage-metrics
//
//meta:operation GET /orgs/{org}/copilot/metrics/reports/users-28-day/latest
func (s *CopilotService) GetOrganizationUsersMetricsReport(ctx context.Context, org string) (*CopilotMetricsReport, *Response, error) {
u := fmt.Sprintf("orgs/%v/copilot/metrics/reports/users-28-day/latest", org)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var report *CopilotMetricsReport
resp, err := s.client.Do(ctx, req, &report)
if err != nil {
return nil, resp, err
}

return report, resp, nil
}
Loading
Loading