curl --request POST \
--url https://api.runaether.dev/pull-requests/{pullRequestID}/github/review \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_head_sha": "<string>",
"idempotency_key": "<string>",
"body": "<string>",
"comments": [
{
"body": "<string>",
"line": 2,
"path": "<string>"
}
]
}
'import requests
url = "https://api.runaether.dev/pull-requests/{pullRequestID}/github/review"
payload = {
"expected_head_sha": "<string>",
"idempotency_key": "<string>",
"body": "<string>",
"comments": [
{
"body": "<string>",
"line": 2,
"path": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
expected_head_sha: '<string>',
idempotency_key: '<string>',
body: JSON.stringify('<string>'),
comments: [{body: JSON.stringify('<string>'), line: 2, path: '<string>'}]
})
};
fetch('https://api.runaether.dev/pull-requests/{pullRequestID}/github/review', 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/pull-requests/{pullRequestID}/github/review",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'expected_head_sha' => '<string>',
'idempotency_key' => '<string>',
'body' => '<string>',
'comments' => [
[
'body' => '<string>',
'line' => 2,
'path' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/pull-requests/{pullRequestID}/github/review"
payload := strings.NewReader("{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.runaether.dev/pull-requests/{pullRequestID}/github/review")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/pull-requests/{pullRequestID}/github/review")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"html_url": "<string>",
"review_id": 2,
"submitted_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Submit a human pull request review
Posts the verdict through the authenticated caller’s own GitHub identity and pins it to expected_head_sha. No app-identity fallback is used. The idempotency key is actor-scoped and claimed before GitHub is called: completed attempts replay the same review, while failed claims conflict without posting again. Requires membership in the owning organization of a task linked to this pull request — the task that published it or a task that reviewed it — and current GitHub access to the repository. 404 covers an unknown pull request, one linked to no organization the caller belongs to, and one whose GitHub access the caller has lost; the three are deliberately indistinguishable.
curl --request POST \
--url https://api.runaether.dev/pull-requests/{pullRequestID}/github/review \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_head_sha": "<string>",
"idempotency_key": "<string>",
"body": "<string>",
"comments": [
{
"body": "<string>",
"line": 2,
"path": "<string>"
}
]
}
'import requests
url = "https://api.runaether.dev/pull-requests/{pullRequestID}/github/review"
payload = {
"expected_head_sha": "<string>",
"idempotency_key": "<string>",
"body": "<string>",
"comments": [
{
"body": "<string>",
"line": 2,
"path": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
expected_head_sha: '<string>',
idempotency_key: '<string>',
body: JSON.stringify('<string>'),
comments: [{body: JSON.stringify('<string>'), line: 2, path: '<string>'}]
})
};
fetch('https://api.runaether.dev/pull-requests/{pullRequestID}/github/review', 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/pull-requests/{pullRequestID}/github/review",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'expected_head_sha' => '<string>',
'idempotency_key' => '<string>',
'body' => '<string>',
'comments' => [
[
'body' => '<string>',
'line' => 2,
'path' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/pull-requests/{pullRequestID}/github/review"
payload := strings.NewReader("{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.runaether.dev/pull-requests/{pullRequestID}/github/review")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/pull-requests/{pullRequestID}/github/review")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_head_sha\": \"<string>\",\n \"idempotency_key\": \"<string>\",\n \"body\": \"<string>\",\n \"comments\": [\n {\n \"body\": \"<string>\",\n \"line\": 2,\n \"path\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"html_url": "<string>",
"review_id": 2,
"submitted_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.