Replace the content, targets and media of a scheduled post, with credits reconciled automatically.
PUT /v1/posts/scheduled/{id} replaces content, platforms and mediaItems of a post that is still scheduled.
scheduledFor and timezone are optional and keep their current values when omitted.
curl -s -X PUT https://api.betterpost.dev/v1/posts/scheduled/post_8f3k2m9q1x7v4n6b0c5d2a1z \
-H "x-access-key: $BETTERPOST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Doors open at 9, now with a photo",
"mediaItems": [{ "type": "image", "url": "https://assets.betterpost.dev/proj_123/2026/10/med_abc-door.jpg" }],
"platforms": [
{ "platform": "linkedin", "accountId": "acc_5l1n7k3j9h2g8f4d6s0a1q3w" },
{ "platform": "instagram", "accountId": "acc_7i3g9r1a5m2q8w4e6t0y3u1o" }
]
}'{
"success": true,
"message": "Scheduled post updated.",
"postId": "post_8f3k2m9q1x7v4n6b0c5d2a1z",
"scheduledFor": "2026-11-03T14:00:00.000Z"
}Credits are reconciled in one step: removed targets (X above) are refunded, added targets (Instagram) are charged,
kept targets are not charged again (unless their cost changes, for example an X target gains a link). If the result needs more credits than you have, the API answers 402 and the
post is unchanged. The new body is validated like a new post. A post that is not scheduled returns 409
not_scheduled.
Reference: PUT /v1/posts/scheduled/{id}.