List reviewed pull requests with their review runs
curl --request GET \
--url https://api.runaether.dev/orgs/{orgID}/pr-reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/orgs/{orgID}/pr-reviews"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/orgs/{orgID}/pr-reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.runaether.dev/orgs/{orgID}/pr-reviews",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/orgs/{orgID}/pr-reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.runaether.dev/orgs/{orgID}/pr-reviews")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/orgs/{orgID}/pr-reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"additions": 1,
"checks_failed": 1,
"checks_passed": 1,
"checks_total": 1,
"comment_count": 1,
"deletions": 1,
"draft": true,
"github_updated_at": "2023-11-07T05:31:56Z",
"html_url": "<string>",
"latest_created_at": "2023-11-07T05:31:56Z",
"needs_attention": true,
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ready_for_merge": true,
"repo_name": "<string>",
"repo_owner": "<string>",
"reviews": [
{
"agent_type": "codex",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"model": "<string>",
"status": "reviewing",
"duration_seconds": 1,
"error": "<string>",
"head_sha": "<string>",
"trigger": "automatic"
}
],
"title": "<string>",
"viewer_standing": "author",
"author_login": "<string>",
"base_branch": "<string>",
"ci_status": "pending",
"guide_outline": [
{
"paths": [
"<string>"
],
"title": "<string>"
}
],
"head_branch": "<string>",
"head_sha": "<string>",
"merged_at": "2023-11-07T05:31:56Z",
"origin_task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_count": 1
},
"pr_state": "open",
"section": "in_review",
"severity_counts": {
"confirmed": 1,
"nit": 1,
"p1": 1,
"p2": 1,
"question": 1
},
"stack_children": [
{
"html_url": "<string>",
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "open",
"title": "<string>"
}
],
"stack_parent": {
"html_url": "<string>",
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "open",
"title": "<string>"
},
"summary_severity": "p1",
"verdict": "APPROVE"
}
],
"next_cursor": "<string>",
"sections": [
{
"count": 2,
"section": "in_review"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Pr Reviews
List reviewed pull requests with their review runs
One group per reviewed pull request, newest activity first: the later of its newest run and its merge. view=queue returns open pull requests only, needs_attention first. Every list pages by cursor: send the previous page's next_cursor as cursor; next_cursor is null on the last page, and a group created after the first page was read never shifts a later page. A malformed cursor, or one minted for a different view, filter set or q, is a 400. include_unreviewed=true adds one group per other pull request of a repository the organization has a non-archived project for, with an empty reviews array, no verdict, a null comment_count, needs_attention false, and latest_created_at the pull request's open time; it is false when omitted, and reviews is never empty without it. A list with include_unreviewed is in GitHub's order, newest opened first, holds open pull requests unless pr_state names others (a pull request whose state the mirror has not recorded is in neither), and view=queue with it is a 400. status=unreviewed matches a group with no runs and every other status leaves it out. Every group of a list with include_unreviewed carries its section: in_review while its newest run is reviewing, approved when that run completed with a standing verdict of APPROVE on the pull request's current head, other for anything else, a merged or closed pull request and one with no runs included. section=<key> keeps one section in the same order, and a cursor from any page of the same list (with or without section) pages inside it. counts=true adds sections, the count of every non-empty section of the whole list (view, viewer, filters and project; not section), in the order in_review, approved, other. section and counts need include_unreviewed, and counts reads a first page: it takes no cursor and no section (each a 400). drafts=exclude leaves draft pull requests out; it narrows the pages and the counts, enters the cursor's scope, and needs include_unreviewed (a 400 without it). q searches the list: it is trimmed and an empty q is no search; all digits, or # and digits, keeps the pull request with that number, and anything else keeps the pull requests whose title holds its whitespace-separated words in order, case-insensitively. q narrows the pages and the counts, enters the cursor's scope, and needs include_unreviewed; without it, over 200 characters, or a number beyond a pull request number's range, it is a 400. Without include_unreviewed no group carries a section. Sections and the review-run status are resolved server-side so the listing can be paginated by group. needs_attention marks an open group requiring user action from its newest run or posted verdict. status and pr_state are comma-joined filters; status matches the group's LATEST run status — the status the list row displays — not any run in the group. viewer=author keeps the pull requests the caller opened, by the GitHub login their connection stores or by one of their tasks publishing it, and viewer=involved adds the ones they review, by that login; every group carries the caller's viewer_standing. author, reviewer, repo_owner and repo_name match GitHub logins and repository coordinates case-insensitively; a reviewer has a user review request or a submitted review and is never the author. opened_after and updated_after (inclusive) and opened_before and updated_before (exclusive) are UTC instants bounding when the pull request was opened and GitHub's last update to it, and an empty window is a 400. A pull request mirrored before Aether kept GitHub's open time is dated by when Aether first saw it.
GET
/
orgs
/
{orgID}
/
pr-reviews
List reviewed pull requests with their review runs
curl --request GET \
--url https://api.runaether.dev/orgs/{orgID}/pr-reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/orgs/{orgID}/pr-reviews"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/orgs/{orgID}/pr-reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.runaether.dev/orgs/{orgID}/pr-reviews",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/orgs/{orgID}/pr-reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.runaether.dev/orgs/{orgID}/pr-reviews")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/orgs/{orgID}/pr-reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"additions": 1,
"checks_failed": 1,
"checks_passed": 1,
"checks_total": 1,
"comment_count": 1,
"deletions": 1,
"draft": true,
"github_updated_at": "2023-11-07T05:31:56Z",
"html_url": "<string>",
"latest_created_at": "2023-11-07T05:31:56Z",
"needs_attention": true,
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ready_for_merge": true,
"repo_name": "<string>",
"repo_owner": "<string>",
"reviews": [
{
"agent_type": "codex",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"model": "<string>",
"status": "reviewing",
"duration_seconds": 1,
"error": "<string>",
"head_sha": "<string>",
"trigger": "automatic"
}
],
"title": "<string>",
"viewer_standing": "author",
"author_login": "<string>",
"base_branch": "<string>",
"ci_status": "pending",
"guide_outline": [
{
"paths": [
"<string>"
],
"title": "<string>"
}
],
"head_branch": "<string>",
"head_sha": "<string>",
"merged_at": "2023-11-07T05:31:56Z",
"origin_task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_count": 1
},
"pr_state": "open",
"section": "in_review",
"severity_counts": {
"confirmed": 1,
"nit": 1,
"p1": 1,
"p2": 1,
"question": 1
},
"stack_children": [
{
"html_url": "<string>",
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "open",
"title": "<string>"
}
],
"stack_parent": {
"html_url": "<string>",
"pr_number": 2,
"pull_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "open",
"title": "<string>"
},
"summary_severity": "p1",
"verdict": "APPROVE"
}
],
"next_cursor": "<string>",
"sections": [
{
"count": 2,
"section": "in_review"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
Required range:
1 <= x <= 100Available options:
queue Pattern:
^(reviewing|completed|failed|cancelled|superseded|archived|unreviewed)(,(reviewing|completed|failed|cancelled|superseded|archived|unreviewed))*$Pattern:
^(open|closed|merged)(,(open|closed|merged))*$Available options:
author, involved Pattern:
^[A-Za-z0-9][A-Za-z0-9_-]*(\[[bB][oO][tT]\])?$Pattern:
^[A-Za-z0-9][A-Za-z0-9_-]*(\[[bB][oO][tT]\])?$Pattern:
^[A-Za-z0-9][A-Za-z0-9_-]*(\[[bB][oO][tT]\])?$Pattern:
^[A-Za-z0-9._-]+$Pattern:
^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,6})?Z$Pattern:
^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,6})?Z$Pattern:
^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,6})?Z$Pattern:
^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,6})?Z$Available options:
in_review, approved, other Available options:
exclude