Docs
Social

Change a social post

PATCHhttps://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).

⚠ social:publishRole must allow: social.publishOperation id: update_social_post
PATCH/social/posts/{id}
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"
      ]
    }
  ]
}'
Change a social post
{
  "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

Authorizationstringheaderrequired

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

idstring (uuid)pathrequired

An id (UUID).

Headers

Idempotency-Keystringheader

Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.

Body

application/json

titlestring

The post's name in the calendar (never published).

statusenum

idea, draft (default) or in_review — scheduling has its own operation.

One of:ideadraftin_review
labelsstring[]
notesstring

Internal notes (never published).

variantsobject[]

REPLACES the post's versions: networks left out are removed, the ones given are written as sent. Omit to keep them.

Show child attributes
variants[].networkenumrequired

linkedin, x, instagram, facebook or tiktok.

One of:linkedinxinstagramfacebooktiktok
variants[].contentstring

The text for this network (each network's own limit is checked when scheduling: X 280, LinkedIn 3000, Instagram 2200, Facebook 5000, TikTok 2200).

variants[].media_urlsstring[]

Up to 10 pictures or videos. Instagram needs at least one to be scheduled.

Response

200application/json— Change a social post

idstring (uuid)required

An id (UUID).

object"social_post"required
titlestringrequired

The post's name in the calendar (never published).

statusenumrequired

idea, draft, in_review, scheduled, publishing, published or failed.

One of:ideadraftin_reviewscheduledpublishingpublishedfailed
scheduled_atstring | nullrequired

When it goes out (scheduled posts).

timezonestring | nullrequired

The IANA time zone it was scheduled in, for display.

labelsstring[]required
notesstringrequired

Internal notes (never published).

networksenum[]required
variantsobject[]required
Show child attributes
variants[].networkenumrequired

linkedin, x, instagram, facebook or tiktok.

One of:linkedinxinstagramfacebooktiktok
variants[].network_namestringrequired
variants[].contentstringrequired

The text for this network.

variants[].media_urlsstring[]required

Pictures and videos, in order (public https addresses).

variants[].statusenumrequired

pending (not sent yet), publishing, published or failed.

One of:pendingpublishingpublishedfailed
variants[].published_atstring | nullrequired
variants[].problemstring | nullrequired

When this network's publish failed: a plain sentence (the details are in the app).

created_atstringrequired

RFC 3339 UTC timestamp with milliseconds.

updated_atstringrequired

RFC 3339 UTC timestamp with milliseconds.

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
403role_forbiddenThe key's creator's role can't do this.
404not_foundThat doesn't exist.
409idempotency_in_progressA request with this Idempotency-Key is still running.
409conflictThat conflicts with the current state.
413too_largeThe request body is too large.
422validation_failedThe request has invalid fields.
422idempotency_mismatchThis Idempotency-Key was used with a different request.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.