To create a new social media post, make a POST call to the /social/posts endpoint. A post is published to one or more profiles — a profile is a specific destination such as a Facebook Page, Instagram business account, LinkedIn Company Page, or TikTok account that the user has connected to Constant Contact. The post appears on each chosen profile when it is published. Use Get a Collection of Social Profiles to retrieve the user’s available profiles and their profile_id values, then include each profile_id you want to publish to in the request body.
Set status to DRAFT to save without publishing, or SCHEDULED to schedule for publication. Scheduled posts require a scheduled_time in ISO-8601 format.
Post content and settings can vary per profile. Each entry in profile_posts can specify its own text, images, and network-specific settings (for example, TikTok-specific options like disable_comment).
Request Body
name(string, optional): Campaign name for this post. If not provided, a default name is generated.status(string, required): The status of the post on creation. Valid values:DRAFTorSCHEDULED.scheduled_time(string, optional): The date and time to publish the post in ISO-8601 format. Required whenstatusisSCHEDULED.profile_posts(array, required): The list of per-profile posts that make up this campaign. Each entry specifies the content to post and the profiles to post it to.text(string): The text content of the post.profiles(array): Profiles to post to. Each entry has aprofile_id.images(array, optional): Images to include in the post. Each entry has aurl.settings(object, optional): Network-specific settings (for example, TikTok options).
Example Request
POST https://api.cc.email/v3/social/posts
Endpoint Requirements
User privileges: campaign:write
Authorization scopes: campaign_data
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.cc.email/v3/social/posts',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{
"status": "DRAFT",
"name": "My Social Post",
"profile_posts": [{
"text": "Hello from the V3 Public API!",
"profiles": [{"profile_id": "5ad6d481-0744-4020-8a5d-50cb5434d4f1"}]
}]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Authorization: Bearer {access_token}'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
curl --location --request POST 'https://api.cc.email/v3/social/posts' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {access_token}' \
--data-raw '{
"status": "DRAFT",
"name": "My Social Post",
"profile_posts": [{
"text": "Hello from the V3 Public API!",
"profiles": [{"profile_id": "5ad6d481-0744-4020-8a5d-50cb5434d4f1"}]
}]
}'
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n" +
" \"status\": \"DRAFT\",\n" +
" \"name\": \"My Social Post\",\n" +
" \"profile_posts\": [{\n" +
" \"text\": \"Hello from the V3 Public API!\",\n" +
" \"profiles\": [{\"profile_id\": \"5ad6d481-0744-4020-8a5d-50cb5434d4f1\"}]\n" +
" }]\n" +
"}");
Request request = new Request.Builder()
.url("https://api.cc.email/v3/social/posts")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {access_token}")
.build();
Response response = client.newCall(request).execute();
Scheduling a Post
To schedule a post for future publication, set status to SCHEDULED and include scheduled_time in ISO-8601 format:
{
"status": "SCHEDULED",
"name": "Black Friday announcement",
"scheduled_time": "2026-11-27T14:30:00.000Z",
"profile_posts": [{
"text": "Big sale starts now!",
"profiles": [{"profile_id": "5ad6d481-0744-4020-8a5d-50cb5434d4f1"}]
}]
}
Posting to Multiple Profiles
A single profile_posts entry can publish to multiple profiles, and you can include multiple profile_posts entries to vary content per network:
{
"status": "DRAFT",
"name": "Cross-network announcement",
"profile_posts": [{
"text": "Posted to both Facebook and Instagram",
"profiles": [
{"profile_id": "5ad6d481-0744-4020-8a5d-50cb5434d4f1"},
{"profile_id": "2e85c644-6602-48ce-9d8f-ba632b35867b"}
]
}]
}
Example Response
A successful request returns the created post, including the generated campaign_id and per-profile activity details. Use the campaign_id to reference this post in subsequent operations.
{
"campaign_id": "794eb36b-f3fa-453c-ac91-f1fedb40a8d7",
"name": "My Social Post",
"status": "DRAFT",
"profile_posts": [
{
"post_content_id": "5891d764-b3c0-4878-9585-d8ff86625beb",
"text": "Hello from the V3 Public API!",
"images": [],
"profiles": [
{
"profile_id": "5ad6d481-0744-4020-8a5d-50cb5434d4f1",
"profile_name": "My Business Page",
"network": "facebook",
"campaign_activity_id": "ccd74201-abef-47ad-bac2-0ed89cd27029",
"campaign_activity_status": "DRAFT",
"campaign_activity_status_date": "1777300603000",
"account_username": "Jane Doe",
"image_url": "https://example.com/profile-image.jpg"
}
]
}
]
}
Test the endpoint using our reference tester: Try it!