curl --request PATCH \
--url https://www.postbase.so/api/v1/posts/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduled_at": "2026-10-02T09:00:00+01:00"
}
'import requests
url = "https://www.postbase.so/api/v1/posts/{id}"
payload = { "scheduled_at": "2026-10-02T09:00:00+01:00" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({scheduled_at: '2026-10-02T09:00:00+01:00'})
};
fetch('https://www.postbase.so/api/v1/posts/{id}', 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://www.postbase.so/api/v1/posts/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'scheduled_at' => '2026-10-02T09:00:00+01:00'
]),
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://www.postbase.so/api/v1/posts/{id}"
payload := strings.NewReader("{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://www.postbase.so/api/v1/posts/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.postbase.so/api/v1/posts/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}"
response = http.request(request)
puts response.read_body{
"post": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "draft",
"channels": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "draft",
"platform": "<string>",
"handle": "<string>",
"url": "<string>",
"error": "<string>",
"warning": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"body": "<string>",
"metrics": {}
}
],
"body": "<string>",
"thread": [
"<string>"
],
"scheduled_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"media": [
{
"url": "<string>",
"type": "<string>"
}
],
"summary": {
"published": 123,
"failed": 123,
"pending": 123
},
"warning": "<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>"
}Edit a post
Edit or reschedule a draft or scheduled post. Only the fields you send change; scheduled_at null turns it into a draft.
curl --request PATCH \
--url https://www.postbase.so/api/v1/posts/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduled_at": "2026-10-02T09:00:00+01:00"
}
'import requests
url = "https://www.postbase.so/api/v1/posts/{id}"
payload = { "scheduled_at": "2026-10-02T09:00:00+01:00" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({scheduled_at: '2026-10-02T09:00:00+01:00'})
};
fetch('https://www.postbase.so/api/v1/posts/{id}', 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://www.postbase.so/api/v1/posts/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'scheduled_at' => '2026-10-02T09:00:00+01:00'
]),
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://www.postbase.so/api/v1/posts/{id}"
payload := strings.NewReader("{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://www.postbase.so/api/v1/posts/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.postbase.so/api/v1/posts/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_at\": \"2026-10-02T09:00:00+01:00\"\n}"
response = http.request(request)
puts response.read_body{
"post": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "draft",
"channels": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "draft",
"platform": "<string>",
"handle": "<string>",
"url": "<string>",
"error": "<string>",
"warning": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"body": "<string>",
"metrics": {}
}
],
"body": "<string>",
"thread": [
"<string>"
],
"scheduled_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"media": [
{
"url": "<string>",
"type": "<string>"
}
],
"summary": {
"published": 123,
"failed": 123,
"pending": 123
},
"warning": "<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
A pb_live_ API key
Path Parameters
Body
The post text, for a single post.
Several posts to publish as a thread, in order. Takes precedence over body.
Channels to publish to, from GET /channels.
Text for particular channels instead of body, keyed by channel id. Each is a single post.
Show child attributes
Show child attributes
When to publish: ISO 8601 with Z or an offset (2026-10-01T09:00:00+01:00). Omit or null to save a draft.
Publish this many minutes from now, on the server's clock. Instead of scheduled_at.
Files from GET /media to attach, in order.
Public https links to images or a video, attached after media_ids. Each is downloaded into the media library (up to 10 per request, 200 MB each).
10Show child attributes
Show child attributes
Response
The edited post
Show child attributes
Show child attributes