Update scheduled post

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

Edits the content or the schedule of a post that hasn't published yet. Send only the fields you want to change. An omitted field keeps its current value.

A post can only be edited while its status is proposal or scheduled. To publish elsewhere, create a new post instead. An existing post's platform isn't editable in any state.

Only the fields documented here are accepted, platform included. Don't read a post and send the whole object back. Base44 owns id, app_id, status, workflow_id, and the rest of the response, so a round-trip like that is rejected rather than partly applied. Send only the fields you're changing.

Only image_url and image_prompt can be cleared, by sending null. Any other field rejects an explicit null.

A post generated from a content plan normally stays linked to it. Using Refine a post, Update post content, or Generate a post image on that post also updates the matching row on the calendar. Editing it here breaks that link, so those endpoints no longer touch it afterward.

Editing scheduled_at moves the post's publish time only before it has a workflow_id, the ID of the automation Start scheduling posts creates to publish it. Once that automation exists, it publishes at the time it was given, even if you later send a different scheduled_at. The calendar shows your new value, but the post still goes out at the original time. To actually move a post that's already reached this point, delete it and create it again at the new time.

Content changes work differently. Because the publisher reads a post's current content at publish time, an edit to title, body, or the other content fields always takes effect, even after the post has a workflow_id.

patch/api/apps/{app_id}/social-calendar/posts/{post_id}

Path parameters

post_idstring required

ID of the post, as returned by List scheduled posts.

ID of the post, as returned by List scheduled posts.

app_idstring required

ID of the app whose social calendar you want.

ID of the app whose social calendar you want.

Request body

titlestring nullable

New title for the post. Omit it to keep the current one.

bodystring nullable

New body text. Omit it to keep the current one, or send an empty string to clear it.

scheduled_atstring date-time nullable

New publish time, as an ISO 8601 timestamp between the years 2000 and 2100. Omit it to keep the post's current time. This only moves a post that isn't scheduled yet. Once the post has a workflow_id, it publishes at the time it was handed over with.

scheduled_timezonestring nullable

New IANA timezone for scheduled_local_at. Omit it to keep the current one. It never moves the instant the post publishes.

hookstring nullable

New angle for the post. Omit it to keep the current one, or send an empty string to clear it.

best_time_reasonstring nullable

New reason shown alongside the post's time. Omit it to keep the current one, or send an empty string to clear it.

hashtagsstring[] nullable

Replacement list of up to 30 hashtags, without the leading #. Omit it to keep the current list, or send [] to publish none.

image_urlstring nullable

New HTTPS image URL, or null to remove the image. Removing it from an Instagram post means the post is rejected when it publishes.

image_promptstring nullable

New image prompt, or null to clear it.

Example request

{
  "title": "Ship a CRM in an afternoon",
  "body": "We replaced our lead spreadsheet with an app we built in an afternoon.",
  "scheduled_at": "2026-09-16T09:30:00Z",
  "scheduled_timezone": "Asia/Jerusalem",
  "hook": "social_proof",
  "best_time_reason": "Our audience checks LinkedIn before lunch.",
  "hashtags": [
    "buildinpublic",
    "crm"
  ],
  "image_url": "https://cdn.example.com/posts/crm-launch-v2.png",
  "image_prompt": "A freelancer closing a deal on a laptop, warm morning light"
}

Response

The post after the edit.

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

Changed in 1 of the 18 revisions of this API.1

Of the 18 revisions, 1 has no diff computed.