curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"scheduled_from": "2026-09-01T00:00:00Z",
"scheduled_until": "2026-10-01T00:00:00Z"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule"
payload = {
"scheduled_from": "2026-09-01T00:00:00Z",
"scheduled_until": "2026-10-01T00:00:00Z"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
scheduled_from: '2026-09-01T00:00:00Z',
scheduled_until: '2026-10-01T00:00:00Z'
})
};
fetch('https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule', 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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule",
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([
'scheduled_from' => '2026-09-01T00:00:00Z',
'scheduled_until' => '2026-10-01T00:00:00Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule"
payload := strings.NewReader("{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "68a1c4f0d21b4e0a3c77e912",
"status": "pending"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Start scheduling posts
Hands the app’s approved posts to the publisher, so each one goes out at its own scheduled time.
The work runs in the background. This endpoint answers 202 with a job_id; poll Get scheduling job to see how it went. A second start for the same app fails with a 409 while the first one is still starting.
Calling it again for the same window normally returns the job already in flight instead of starting a second one, but treat that as best-effort rather than a guarantee: a retry sent in the moment before the job starts running can come back with a new job_id. Nothing is published twice when that happens, because both runs resolve the same automation for a given post.
It takes the posts whose scheduled_at falls in [scheduled_from, scheduled_until) and that aren’t handed over yet, which means the posts you approved plus the ones an earlier run couldn’t place. A post still in proposal isn’t taken at all, so approve it first. A range holding more than 100 such posts fails with a 422; schedule it in smaller ranges.
Placing a post can fail for reasons this endpoint can’t check up front, and each one is counted in the job’s result rather than failing the request:
- The workspace is on the free plan. Publishing scheduled posts needs a paid workspace plan, and those posts are counted in
plan_limited. - The app has no connected account for the post’s platform with publishing permission, or it has more than one. Those posts move to
needs_reconnectand are counted there, and a later run picks them up once you fix the connection. - The post’s platform can’t be published to at all, or its scheduled time has already passed. Those posts move to
failed, which is final.
The social calendar endpoints share two rate limits: 20 requests per minute across creating, editing, deleting and approving posts, and 40 requests per minute across the rest. This endpoint counts against the 40.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"scheduled_from": "2026-09-01T00:00:00Z",
"scheduled_until": "2026-10-01T00:00:00Z"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule"
payload = {
"scheduled_from": "2026-09-01T00:00:00Z",
"scheduled_until": "2026-10-01T00:00:00Z"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
scheduled_from: '2026-09-01T00:00:00Z',
scheduled_until: '2026-10-01T00:00:00Z'
})
};
fetch('https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule', 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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule",
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([
'scheduled_from' => '2026-09-01T00:00:00Z',
'scheduled_until' => '2026-10-01T00:00:00Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule"
payload := strings.NewReader("{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
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://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/social-calendar/posts/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scheduled_from\": \"2026-09-01T00:00:00Z\",\n \"scheduled_until\": \"2026-10-01T00:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "68a1c4f0d21b4e0a3c77e912",
"status": "pending"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal API key.
Path Parameters
ID of the app whose social calendar you want.
Body
Start of the range to schedule, inclusive, as an ISO 8601 timestamp carrying an offset. A timestamp without one fails with a 422.
"2026-09-01T00:00:00Z"
End of the range, exclusive, as an ISO 8601 timestamp carrying an offset. It has to be later than scheduled_from.
"2026-10-01T00:00:00Z"
Response
The scheduling job that is now running, or the one already in flight for this range.
ID of the scheduling job. Pass it as job_id to Get scheduling job.
"68a1c4f0d21b4e0a3c77e912"
State of the job: pending before it starts, running while it hands posts over, then completed or failed. A range holding nothing to schedule comes back completed straight away.
"pending"
Was this page helpful?