Create Social Post
curl --request POST \
--url https://api.example.com/social/postimport requests
url = "https://api.example.com/social/post"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/social/post', 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.example.com/social/post",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/social/post"
req, _ := http.NewRequest("POST", url, nil)
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.example.com/social/post")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/social/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodySocial
Create Social Post
Publish or schedule a social post.
POST
/
social
/
post
Create Social Post
curl --request POST \
--url https://api.example.com/social/postimport requests
url = "https://api.example.com/social/post"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/social/post', 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.example.com/social/post",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/social/post"
req, _ := http.NewRequest("POST", url, nil)
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.example.com/social/post")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/social/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyPublishes immediately or schedules a social post. The returned
Additional social publishing fields are accepted when supported.
post_id is the ID to use with GET /social/post/{post_id}, GET /social/post/{post_id}/analytics, GET /social/post/{post_id}/comments, PATCH /social/post/{post_id}, and DELETE /social/post/{post_id}. Use GET /social/posts to list posts.
Use destinations with social_connection_id values from GET /social/connections to post to specific accounts, including multiple accounts on the same platform.
Request
curl -X POST "https://api.mosaic.so/social/post" \
-H "Authorization: Bearer mk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"post": "Motion product update",
"destinations": [
{ "social_connection_id": "62c07212-eeb5-40e2-9902-e478027b8628" },
{ "social_connection_id": "8b59f2d7-53fa-4f47-9850-cb4b78b19a8d" }
],
"media_urls": ["https://cdn.yourdomain.com/media/launch.mp4"],
"schedule_date": "2026-03-10T16:00:00Z"
}'
Body Parameters
| Field | Type | Required | Description |
|---|---|---|---|
post | string | No | Post text. Defaults to an empty string. |
platforms | array | Conditional | One or more target platforms (x, linkedin, instagram, facebook, tiktok, youtube). Uses the first active account for each platform. Required when destinations is omitted. |
destinations | array | Conditional | Explicit target accounts. Each item may be a social_connection_id string or an object with social_connection_id. Required when platforms is omitted. |
media_urls | array | No | Public media URLs to attach. |
schedule_date | string | No | ISO timestamp to schedule instead of posting immediately. |
workspace_id | string (uuid) | No | Workspace to associate with the post. Defaults to the organization’s primary workspace. |
Scheduling
Whenschedule_date is in the future, Motion queues the post and returns a post_id you can use right away. The post’s aggregate status is scheduled until the scheduled publish time is reached and publishing completes. Native platform_post_id and post_url values are null while the post is still waiting to publish.
Call GET /social/post/{post_id} to check whether the post is still scheduled or has published.
Scheduled Response
{
"post_id": "2d8ca860-f8e0-4f3f-9f2c-337ead6ed91e",
"status": "scheduled",
"publishing_status": null,
"scheduled_at": "2026-03-10T16:00:00Z",
"platforms": ["x", "linkedin"],
"links": [],
"results": [
{
"platform": "x",
"status": "scheduled",
"platform_post_id": null,
"post_url": null,
"message": null,
"social_connection_id": "62c07212-eeb5-40e2-9902-e478027b8628"
},
{
"platform": "linkedin",
"status": "scheduled",
"platform_post_id": null,
"post_url": null,
"message": null,
"social_connection_id": "8b59f2d7-53fa-4f47-9850-cb4b78b19a8d"
}
],
"destination_results": {
"62c07212-eeb5-40e2-9902-e478027b8628": {
"social_connection_id": "62c07212-eeb5-40e2-9902-e478027b8628",
"platform": "x",
"status": "scheduled",
"platform_post_id": null,
"post_url": null,
"message": null
},
"8b59f2d7-53fa-4f47-9850-cb4b78b19a8d": {
"social_connection_id": "8b59f2d7-53fa-4f47-9850-cb4b78b19a8d",
"platform": "linkedin",
"status": "scheduled",
"platform_post_id": null,
"post_url": null,
"message": null
}
},
"destinations": [
{
"social_connection_id": "62c07212-eeb5-40e2-9902-e478027b8628",
"platform": "x",
"account_name": "Motion",
"account_username": "motion_so"
},
{
"social_connection_id": "8b59f2d7-53fa-4f47-9850-cb4b78b19a8d",
"platform": "linkedin",
"account_name": "Motion",
"account_username": "motion-so"
}
],
"error": null,
"publishing_errors": []
}
Response Details
post_idis the Motion social post ID. Use it for all post status, analytics, update, and delete calls.statusis Motion’s aggregate status for the requested destinations.resultscontains per-destination publishing outcomes when available.destination_resultsis keyed bysocial_connection_idand preserves multiple accounts on the same platform.platform_post_idis the native post ID from the destination platform. It can benullwhile a scheduled post is still waiting to publish.
Was this page helpful?