Change a social post
https://api.norreach.app/v1/social/posts/{id}Changes a post that isn't on the calendar: its title, labels, notes, status (idea, draft or in_review) and — when variants is sent — its versions, which then REPLACE the stored ones (networks left out are removed; omit variants to keep them). A scheduled post must be unscheduled first; a post going out or published can't be changed (409). A network's copy that already went out can't be rewritten or removed (409). Media in another workspace's files are refused (422).
curl -X PATCH "https://api.norreach.app/v1/social/posts/{id}" \
-H "Authorization: Bearer $NORREACH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Winter staffing — week 46",
"variants": [
{
"network": "linkedin",
"content": "Clinics plan their winter staffing now. We place licensed nurses within 48 hours."
},
{
"network": "instagram",
"content": "Winter is coming — so are our nurses.",
"media_urls": [
"https://media.example.com/social-media/6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d/2f3e4d5c-6b7a-4c8d-9e0f-1a2b3c4d5e6f.jpg"
]
}
]
}'{
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"object": "social_post",
"title": "Winter staffing — week 46",
"status": "draft",
"scheduled_at": null,
"timezone": null,
"labels": [
"winter"
],
"notes": "",
"networks": [
"linkedin",
"instagram"
],
"variants": [
{
"network": "linkedin",
"network_name": "LinkedIn",
"content": "Clinics plan their winter staffing now. We place licensed nurses within 48 hours.",
"media_urls": [],
"status": "pending",
"published_at": null,
"problem": null
},
{
"network": "instagram",
"network_name": "Instagram",
"content": "Winter is coming — so are our nurses.",
"media_urls": [
"https://media.example.com/social-media/6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d/2f3e4d5c-6b7a-4c8d-9e0f-1a2b3c4d5e6f.jpg"
],
"status": "pending",
"published_at": null,
"problem": null
}
],
"created_at": "2026-11-05T09:12:33.120Z",
"updated_at": "2026-11-05T09:20:01.000Z"
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope social:publish. API keys and scopes
Path parameters
An id (UUID).
Headers
Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.
Body
application/json
The post's name in the calendar (never published).
idea, draft (default) or in_review — scheduling has its own operation.
ideadraftin_reviewInternal notes (never published).
REPLACES the post's versions: networks left out are removed, the ones given are written as sent. Omit to keep them.
Show child attributesHide child attributes
linkedin, x, instagram, facebook or tiktok.
linkedinxinstagramfacebooktiktokThe text for this network (each network's own limit is checked when scheduling: X 280, LinkedIn 3000, Instagram 2200, Facebook 5000, TikTok 2200).
Up to 10 pictures or videos. Instagram needs at least one to be scheduled.
Response
200application/json— Change a social post
An id (UUID).
The post's name in the calendar (never published).
idea, draft, in_review, scheduled, publishing, published or failed.
ideadraftin_reviewscheduledpublishingpublishedfailedWhen it goes out (scheduled posts).
The IANA time zone it was scheduled in, for display.
Internal notes (never published).
Show child attributesHide child attributes
linkedin, x, instagram, facebook or tiktok.
linkedinxinstagramfacebooktiktokThe text for this network.
Pictures and videos, in order (public https addresses).
pending (not sent yet), publishing, published or failed.
pendingpublishingpublishedfailedWhen this network's publish failed: a plain sentence (the details are in the app).
RFC 3339 UTC timestamp with milliseconds.
RFC 3339 UTC timestamp with milliseconds.
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 403 | role_forbidden | The key's creator's role can't do this. |
| 404 | not_found | That doesn't exist. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 409 | conflict | That conflicts with the current state. |
| 413 | too_large | The request body is too large. |
| 422 | validation_failed | The request has invalid fields. |
| 422 | idempotency_mismatch | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |