Create scheduled post

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Adds a post to the app's social calendar, starting as a proposal. Approve it with Approve scheduled posts, then run Start scheduling posts to hand it to the publisher.

Base44 can publish to Instagram, LinkedIn, and Facebook, so those are the only platforms this endpoint accepts. The app needs a connected account for that platform with publishing permission by the time you schedule the post, not when you create it.

Set scheduled_at to when you want the post to publish.

The scheduled_timezone you send only decides the local time reported back in scheduled_local_at. It doesn't affect when the post goes out.

<Note>Only the fields documented here are accepted. Base44 owns the post's id, lifecycle status, plan lineage, workflow binding and publish results, and any other field in the body is rejected.</Note>

post/api/apps/{app_id}/social-calendar/posts

Path parameters

app_idstring required

ID of the app whose social calendar you want.

ID of the app whose social calendar you want.

Request body

platform'x' | 'instagram' | 'tiktok' | 'linkedin' | 'reddit' | 'facebook' required
titlestring required

Title of the post, which labels it on the calendar. It isn't published as text, except on LinkedIn, where a post with an image sends it as the image's title.

bodystring required

Body text of the post. Base44 publishes this followed by hashtags, so leave the tags out of it.

scheduled_atstring date-time required

When the post should publish, as an ISO 8601 timestamp between the years 2000 and 2100. Send an offset, or a naive timestamp that Base44 reads as UTC. This endpoint doesn't check whether it's still in the future. Start scheduling posts does, and fails a post whose time has already passed by then, marking it failed for good.

scheduled_timezonestring

IANA timezone name used to render scheduled_local_at in the response. It never moves the instant the post publishes. Defaults to UTC.

hookstring

The angle the post leads with, for your own reference on the calendar. Empty by default.

best_time_reasonstring

Why you picked this time, shown alongside the post on the calendar. Empty by default.

hashtagsstring[]

Up to 30 hashtags, published after body. Send them without the leading #. One you include is stripped before publishing.

image_urlstring nullable

HTTPS URL of the image to publish with the post. Required for an Instagram post, which is rejected at publish time without one, and optional on LinkedIn and Facebook, which both publish text-only posts.

image_promptstring nullable

Prompt the image came from, kept for reference. This endpoint doesn't generate an image from it.

Example request

{
  "title": "Ship a CRM in an afternoon",
  "body": "We replaced our lead spreadsheet with an app we built in an afternoon. Here's what changed.",
  "scheduled_at": "2026-09-15T14:00:00Z",
  "scheduled_timezone": "Asia/Jerusalem",
  "hook": "pain_point",
  "best_time_reason": "Weekday afternoons get the most engagement for this audience.",
  "hashtags": [
    "buildinpublic",
    "crm"
  ],
  "image_url": "https://cdn.example.com/posts/crm-launch.png",
  "image_prompt": "A freelancer closing a deal on a laptop, warm morning light"
}

Response

The created post.

idstring required

ID of the post. Pass it as post_id to the other social calendar endpoints.

app_idstring required

ID of the app the post belongs to.

plan_idstring nullable required

ID of the content plan the post was generated from, or null for a post created through Create scheduled post.

source_post_idstring nullable required

ID this post has inside the content plan it came from, or null for a post created through the API.

platformstring required

Account the post publishes to. Base44 publishes to instagram, linkedin and facebook. A post generated from a content plan can also name x, tiktok or reddit, which Base44 plans for but can't publish, and scheduling such a post fails it.

titlestring required

Title of the post. It labels the post on the calendar and isn't published as text, except on LinkedIn, where a post with an image sends it as the image's title.

bodystring required

Body text of the post. Base44 publishes this followed by hashtags, so leave the tags out of it.

hookstring required

The angle the post leads with. A plan-generated post carries the angle the planner picked, either pain_point, feature_demo, social_proof, trending_hook, user_story, or before_after. A post you create carries whatever you sent, or an empty string.

cover_indexinteger required

Zero-based position of the post in the series its content plan generated, which is how the calendar picks its cover image. Always 0 for a post created through the API.

scheduled_atstring date-time required

When the post publishes, always in UTC. A post read back from the calendar carries no offset (2026-09-15T14:00:00), while the one Create scheduled post returns carries +00:00. Read both as UTC.

scheduled_local_atstring required

The same instant as scheduled_at, rendered in scheduled_timezone as an ISO 8601 timestamp. Display only.

scheduled_timezonestring required

IANA timezone scheduled_local_at is rendered in. Display only.

best_time_reasonstring required

Why this time was picked, written by the planner for a plan-generated post. Empty unless something set it.

hashtagsstring[] required

Hashtags published after body, without the leading #. A leading # you send is stripped before publishing.

image_urlstring nullable required

HTTPS URL of the image published with the post, or null if it has none. An Instagram post needs one to publish.

image_promptstring nullable required

Prompt the post's image was generated from, or null if there is none. Kept for reference. This endpoint doesn't generate images from it.

statusstring required

Where the post is in its lifecycle. Either proposal, scheduled, publishing, posted, failed, publish_outcome_unknown, needs_reconnect, or not_materialized_plan_limit. See Scheduled posts for what each one means.

workflow_idstring nullable required

ID of the automation that publishes this post, set once Start scheduling posts hands it over, and null before that. Its presence is what tells you the publish time is fixed.

Example response

{
  "id": "6886b8d390dc7e2f4a2c91b3",
  "app_id": "6820f3a4e7b91d003c45a1f2",
  "plan_id": "8c1f9a2e-3b7d-4c5e-9f01-2a3b4c5d6e7f",
  "source_post_id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
  "platform": "linkedin",
  "title": "Ship a CRM in an afternoon",
  "body": "We replaced our lead spreadsheet with an app we built in an afternoon. Here's what changed.",
  "hook": "pain_point",
  "scheduled_at": "2026-09-15T14:00:00",
  "scheduled_local_at": "2026-09-15T17:00:00+03:00",
  "scheduled_timezone": "Asia/Jerusalem",
  "best_time_reason": "Weekday afternoons get the most engagement for this audience.",
  "hashtags": [
    "buildinpublic",
    "crm"
  ],
  "image_url": "https://cdn.example.com/posts/crm-launch.png",
  "image_prompt": "A freelancer closing a deal on a laptop, warm morning light",
  "status": "scheduled",
  "workflow_id": "68a1c4f0d21b4e0a3c77e912"
}

Changes

No recorded changes to this endpoint across all 14 revisions of this API.