curl --request POST \
--url https://api.usenotra.com/v1/posts/{postId}/pull-request \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"integrationId": "integration_1",
"github": {
"owner": "usenotra",
"repo": "notra"
}
}
'import requests
url = "https://api.usenotra.com/v1/posts/{postId}/pull-request"
payload = {
"integrationId": "integration_1",
"github": {
"owner": "usenotra",
"repo": "notra"
}
}
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({integrationId: 'integration_1', github: {owner: 'usenotra', repo: 'notra'}})
};
fetch('https://api.usenotra.com/v1/posts/{postId}/pull-request', 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.usenotra.com/v1/posts/{postId}/pull-request",
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([
'integrationId' => 'integration_1',
'github' => [
'owner' => 'usenotra',
'repo' => 'notra'
]
]),
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.usenotra.com/v1/posts/{postId}/pull-request"
payload := strings.NewReader("{\n \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\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.usenotra.com/v1/posts/{postId}/pull-request")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/v1/posts/{postId}/pull-request")
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 \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\n }\n}"
response = http.request(request)
puts response.read_body{
"organization": {
"id": "<string>",
"slug": "<string>",
"name": "<string>",
"logo": "<string>"
},
"pullRequest": {
"number": 123,
"url": "<string>",
"branchName": "<string>",
"path": "<string>",
"operation": "created"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"limit": 2,
"remaining": 1,
"reset": 123
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}Open a draft pull request for a post
Exports a saved blog post or changelog to a draft GitHub pull request, using the repository’s configured content path, site metadata and image handling, the same as the dashboard. Always opens a pull request, even for repositories set to publish directly, and never merges it. Calling it again for the same post and repository updates its open pull request instead of opening another.
curl --request POST \
--url https://api.usenotra.com/v1/posts/{postId}/pull-request \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"integrationId": "integration_1",
"github": {
"owner": "usenotra",
"repo": "notra"
}
}
'import requests
url = "https://api.usenotra.com/v1/posts/{postId}/pull-request"
payload = {
"integrationId": "integration_1",
"github": {
"owner": "usenotra",
"repo": "notra"
}
}
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({integrationId: 'integration_1', github: {owner: 'usenotra', repo: 'notra'}})
};
fetch('https://api.usenotra.com/v1/posts/{postId}/pull-request', 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.usenotra.com/v1/posts/{postId}/pull-request",
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([
'integrationId' => 'integration_1',
'github' => [
'owner' => 'usenotra',
'repo' => 'notra'
]
]),
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.usenotra.com/v1/posts/{postId}/pull-request"
payload := strings.NewReader("{\n \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\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.usenotra.com/v1/posts/{postId}/pull-request")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/v1/posts/{postId}/pull-request")
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 \"integrationId\": \"integration_1\",\n \"github\": {\n \"owner\": \"usenotra\",\n \"repo\": \"notra\"\n }\n}"
response = http.request(request)
puts response.read_body{
"organization": {
"id": "<string>",
"slug": "<string>",
"name": "<string>",
"logo": "<string>"
},
"pullRequest": {
"number": 123,
"url": "<string>",
"branchName": "<string>",
"path": "<string>",
"operation": "created"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"limit": 2,
"remaining": 1,
"reset": 123
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}Authorizations
Send your API key in the Authorization header as Bearer API_KEY. Account API keys work in every workspace you belong to: send X-Notra-Organization-Id with the workspace id or slug to choose one. Workspace endpoints require it when you belong to more than one workspace; GET /v1/me/workspaces works without it. Organization keys only accept their own workspace there.
Path Parameters
1^[A-Za-z0-9_-]{1,100}$"post_123"
Body
Where to open the pull request. Omit both fields when the organization has exactly one connected GitHub repository.
Was this page helpful?