curl --request POST \
--url https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_head_sha": "<string>",
"expected_pr_number": 2,
"idempotency_key": "<string>",
"delete_branch": true
}
'import requests
url = "https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge"
payload = {
"expected_head_sha": "<string>",
"expected_pr_number": 2,
"idempotency_key": "<string>",
"delete_branch": True
}
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>',
expected_pr_number: 2,
idempotency_key: '<string>',
delete_branch: true
})
};
fetch('https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge', 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/pr/merge",
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>',
'expected_pr_number' => 2,
'idempotency_key' => '<string>',
'delete_branch' => true
]),
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/pr/merge"
payload := strings.NewReader("{\n \"expected_head_sha\": \"<string>\",\n \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\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/pr/merge")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_head_sha\": \"<string>\",\n \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge")
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 \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\n}"
response = http.request(request)
puts response.read_body{
"sha": "<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>"
}
]
}{
"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": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"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": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Merge a pull request
Merges the exact pull request row named by pullRequestID with the chosen method, pinned to the head commit and the number the caller confirmed. A method the repository’s settings disallow is refused with 422 carrying GitHub’s message. delete_branch deletes the head branch once the merge succeeds, and only while it still points at the merged head: a branch a push moved is kept and answered with 409 naming the merge commit. delete_branch is refused with 422 fork_branch_delete_unsupported before merging when the branch lives in a fork (merge_box.head_is_fork). The idempotency key is actor-scoped and claimed before GitHub is called: a completed merge replays its result, while a failed or unfinished one conflicts without merging again. Additionally requires the caller to hold push permission on the repository: a caller who can read the pull request but not push to its repository is refused with 403 github_push_access_required. 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/pr/merge \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_head_sha": "<string>",
"expected_pr_number": 2,
"idempotency_key": "<string>",
"delete_branch": true
}
'import requests
url = "https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge"
payload = {
"expected_head_sha": "<string>",
"expected_pr_number": 2,
"idempotency_key": "<string>",
"delete_branch": True
}
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>',
expected_pr_number: 2,
idempotency_key: '<string>',
delete_branch: true
})
};
fetch('https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge', 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/pr/merge",
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>',
'expected_pr_number' => 2,
'idempotency_key' => '<string>',
'delete_branch' => true
]),
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/pr/merge"
payload := strings.NewReader("{\n \"expected_head_sha\": \"<string>\",\n \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\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/pr/merge")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_head_sha\": \"<string>\",\n \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/pull-requests/{pullRequestID}/github/pr/merge")
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 \"expected_pr_number\": 2,\n \"idempotency_key\": \"<string>\",\n \"delete_branch\": true\n}"
response = http.request(request)
puts response.read_body{
"sha": "<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>"
}
]
}{
"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": "account_deleting",
"error": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"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": "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
Body
the exact 40-character lowercase head commit SHA the user reviewed; GitHub refuses the merge if the PR head has moved past it
40^[0-9a-f]{40}$the number of the pull request the user reviewed; the merge is refused with 409 if the task's primary published pull request is no longer this one
x >= 1client-generated stable key for this merge; a retry with the same key replays the first result without merging again
8GitHub's merge method: squash, rebase, or merge (a merge commit). A method the repository's settings disallow is refused with 422 carrying GitHub's message.
squash, rebase, merge True: delete the head branch once the merge succeeds, and only while it still points at the merged head; a branch a push moved is kept and answered with 409 naming the merge commit. Refused with 422 fork_branch_delete_unsupported before merging when the head branch lives in a fork. False or omitted: the branch stays.
Response
OK
1