API reference
Replace a scheduled post's content, targets and media, optionally with a new time.
https://api.betterpost.dev/v1/posts/scheduled/{id}A full replace of content, platforms and mediaItems; the post stays scheduled. Credits are reconciled in one
step: removed targets refunded, added targets charged, kept targets charged again only if their cost changed. The
new state is validated like a new post.
| Name | Description |
|---|---|
id | The post id. The post must be scheduled. |
| Field | Type | Required | Description |
|---|---|---|---|
content | string | Yes | Shared text. |
platforms | array | Yes | Targets, as in create. |
mediaItems | array | No | Shared media. Default []. |
scheduledFor | string | No | New time. Default: keep the current one. |
timezone | string | No | Default: the post's current time zone. |
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" }
]
}'200 OK
{
"success": true,
"message": "Scheduled post updated.",
"postId": "post_8f3k2m9q1x7v4n6b0c5d2a1z",
"scheduledFor": "2026-11-03T14:00:00.000Z"
}| Status | Code | When |
|---|---|---|
200 | The post was updated. | |
400 | validation_error, unknown_account, scheduled_in_past, ... | Same validation as create. |
401 | unauthorized | Missing or unknown API key. |
402 | insufficient_credits | The new targets need more credits than remain. Nothing changed. |
403 | platform_not_available | A platform BetterPost does not support yet. |
404 | not_found | No such post in this project. |
409 | not_scheduled | The post is not scheduled. |
409 | not_editable | A scheduled retry whose other targets already published. Use reschedule or cancel instead. |
429 | rate_limited | More than 120 requests per minute. |