/v1/posts/{id}Update a post
Edits content, targets, or schedule. Published and in-flight posts cannot be edited.
Required permission: `posts:write`
Accepts `profileId` to target a specific profile. Omit it to use the key’s home profile.
- Base URL
- https://api.cutedyno.com
- Permission
posts:write- Idempotency
- Not applicable. This request has no side effects worth deduplicating.
- MCP tool
- update_post
Request
curl -X PUT "https://api.cutedyno.com/v1/posts/POST_ID" \
-H "Authorization: Bearer $CUTEDYNO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileId": "profile_a1b2c3d4",
"content": "Shipping today.",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/media/launch.jpg"
}
],
"accountIds": [
"string"
],
"scheduledAt": "string",
"publishNow": false,
"platforms": {
"facebook": {
"privacy": {
"value": "PUBLIC"
},
"place": "string",
"alt_text_custom": "string",
"no_story": false
},
"instagram": {
"location_id": "location_id_a1b2c3d4",
"thumbnail_url": "https://cdn.example.com/media/launch.jpg",
"collaborators": [
"string"
]
},
"tiktok": {
"title": "string",
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_comment": false,
"disable_duet": false,
"disable_stitch": false,
"video_cover_timestamp_ms": 0,
"brand_content_toggle": false,
"brand_organic_toggle": false,
"is_aigc": false,
"auto_add_music": false,
"upload_as_draft": false
},
"linkedin": {
"title": "string",
"visibility": "PUBLIC"
},
"youtube": {
"title": "string",
"description": "string",
"privacyStatus": "public",
"tags": [
"string"
]
}
},
"approvers": [
"string"
]
}'Path parameters
idstringrequiredPost id.
Body
profileIdstringoptionalProfile to act on. Defaults to the profile the API key was created in.
contentstringoptionalPost text. Used as the caption for image and video posts. Required unless the post is a draft with media.
Images or a single video. Get URLs from POST /v1/media/upload. Content type is inferred: a video wins, otherwise images, otherwise text.
accountIdsstring[]optional`id` values from GET /v1/accounts; `platformAccountId` also works. Required to schedule or publish, omit to save an unassigned draft.
scheduledAtstringoptionalISO 8601 datetime, for example 2026-08-01T12:00:00Z.
publishNowbooleanoptionalQueue for immediate publishing. Cannot be combined with scheduledAt.
Per-platform options, applied only to accounts on that platform. Everything here is optional; sensible defaults apply.
approversstring[]optionalEmails to send approval requests to, used only when the profile or key requires approval. Defaults to the key owner.
Response
Returns 200 with the following body.
Example
{
"post": {
"id": "a1b2c3d4-0000-4000-8000-000000000000",
"status": "draft",
"content": "Shipping today.",
"contentType": "text",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/media/launch.jpg"
}
],
"platforms": {},
"scheduledAt": "string",
"createdAt": "string",
"updatedAt": "string",
"completedAt": "string",
"accounts": [
{
"id": "a1b2c3d4-0000-4000-8000-000000000000",
"platformAccountId": "platformAccount_a1b2c3d4",
"platform": "string",
"name": "Acme Corp"
}
],
"results": [
{
"targetId": "target_a1b2c3d4",
"platform": "facebook",
"pageName": "Acme Corp",
"status": "success",
"result": null,
"error": "string"
}
],
"completedTargets": 0,
"failedTargets": 0,
"totalTargets": 0
}
}Errors
Failures use the standard error envelope. Branch on code, never on the message.
| Status | Code | When it happens |
|---|---|---|
| 400 | invalid_request | The request body or query string failed validation. The message names the offending field. |
| 400 | invalid_scheduled_at | scheduledAt could not be parsed as an ISO 8601 datetime, or it is in the past. |
| 400 | invalid_state_transition | The post is in a state that does not allow this operation, for example editing a post that already published. |
| 401 | invalid_api_key | The key does not exist, was revoked, or is malformed. Keys start with cdyn_live_. |
| 403 | account_not_allowed | The key is restricted to specific connected accounts and one of the supplied accountIds is not among them. |
| 403 | platform_not_allowed | The profile policy restricts which platforms may be posted to, and one of the target accounts is on a platform outside that list. |
| 404 | not_found | The resource does not exist inside the resolved profile. |
| 429 | rate_limit_exceeded | Too many requests for this key. Honour the Retry-After header before retrying. |
| 500 | internal_error | Something failed on our side. Retry with the same Idempotency-Key; report the requestId if it persists. |