Edit changes a post after it went live, where the network allows it. Most networks let you change only the text; a few take more. To change a post that hasn't gone out yet, edit the scheduled post instead.
Edit a post Reelspan published
Name the post by its request_id (and platform when it went to several networks) and send the new text:
curl -X POST https://api.reelspan.com/v1/posts/edit \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"platform": "linkedin",
"text": "We are hiring two engineers in Lisbon. Details and the application form are in the comments."
}'import { Reelspan } from 'reelspan';
const reelspan = new Reelspan();
const edited = await reelspan.request('POST', '/v1/posts/edit', {
json: {
request_id: '9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1',
platform: 'linkedin',
text: 'We are hiring two engineers in Lisbon. Details and the application form are in the comments.',
},
});from reelspan import Reelspan
reelspan = Reelspan()
edited = reelspan.request("POST", "/v1/posts/edit", json_body={
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"platform": "linkedin",
"text": "We are hiring two engineers in Lisbon. Details and the application form are in the comments.",
}){
"success": true,
"platform": "linkedin",
"post_id": "urn:li:share:72…",
"url": "https://www.linkedin.com/feed/update/urn:li:share:72…/"
}message and commentary work as other names for text. For a post made outside Reelspan, name it with platform, user and the network's post_id instead, as on Unpublish.
What you can send
| Field | What it changes |
|---|---|
text |
The post's text: its caption, message or commentary. |
title |
A title, where the post has one: a Facebook video or Reel, a Pin, a WordPress post. |
description |
A Pin's description, a Facebook video's description, or a WordPress post's body. |
fields |
Network settings by their upload field name, as strings, for example {"pinterest_link": "https://example.com/new"}. |
Send only what changes. A request that changes nothing the network can change gets 400 text_required.
Which networks, and what changes
| Network | What can change | Quirks |
|---|---|---|
A post's text. A Reel's or video's description (text or description) and title (title, up to 255 characters). |
||
| The commentary only (up to 3,000 characters). | Media, visibility and the rest stay as they are. | |
| X | The text. | Needs X Premium on the account; X allows edits within an hour of posting, up to five times. The edit is a new post with a new id (see below). |
title (100 characters), description or text (800), and in fields: pinterest_link, pinterest_alt_text (500), pinterest_board_id and pinterest_board_section_id to move the Pin. |
The image or video can't change. | |
| Google Business | The text (up to 1,500 characters), and the button with fields.google_business_cta_url and fields.google_business_cta (gbp_cta_url and gbp_cta_type work too). |
|
| Discord | The text (2,000 characters; longer is cut, with a warning). | Only messages the connected webhook sent. Attachments stay. |
| Telegram | The text of a message, or the caption of a photo, video or album. | Send fields.telegram_parse_mode again if the new text uses formatting. Longer text is cut to Telegram's limits. |
| Mastodon | The text, and fields.mastodon_spoiler_text and fields.mastodon_sensitive. |
Attachments stay. |
| WordPress | title, the body (text or description), and in fields: wordpress_excerpt and wordpress_status (publish, draft, private or pending). |
A new body replaces the text and keeps the images and video already in the post. |
Instagram, TikTok, Threads, YouTube and Bluesky posts can't be edited through Reelspan, and Reddit posts aren't supported either. Asking gets 400 platform_not_supported, with the networks that work in supported_platforms.
X: an edit is a new post
X makes an edited post a new post that replaces the old one, so the id changes. The answer gives the new id as post_id, the old one as previous_post_id, and X's list of every version as edit_history_post_ids:
{
"success": true,
"platform": "x",
"post_id": "1854123456789099999",
"url": "https://x.com/mybrand/status/1854123456789099999",
"previous_post_id": "1854123456789012345",
"edit_history_post_ids": ["1854123456789012345", "1854123456789099999"]
}For a post Reelspan published, the stored post follows the new id, so Post status and analytics use it from then on. Links are removed from the new text, as when posting, unless fields.x_keep_links is "true"; keeping them uses one of your plan's X link posts for the month, and when the allowance is used up they are removed anyway. See Links in X posts.
After an edit
For a post Reelspan published, the network's result in Post status carries edited_at and edits (how many times it was edited), and on X previous_post_ids. warnings in the answer lists anything changed on the way, such as text cut to fit.
Errors
| Status | error_code |
Why |
|---|---|---|
400 |
INVALID_REQUEST |
Neither request_id, nor platform with post_id, was sent. |
400 |
PLATFORM_REQUIRED |
The request went live on several networks; send platform. |
400 |
platform_not_supported |
The network can't edit posts through its API. supported_platforms lists the ones that can. |
400 |
text_required |
Nothing the network can change was sent. |
400 |
invalid_post_id |
The post_id isn't in the network's shape (Google Business checks it). |
404 |
NOT_FOUND, POST_NOT_FOUND |
No such request, no live post on that network, or the network says the post doesn't exist. |
404 |
profile_platform_mapping_invalid |
The profile has no account on that network, or the account that published the post was disconnected. |
409 |
reauth_required |
The account must be reconnected first. |
502 |
the network's code | The network refused, for example an X account without Premium, or an edit window that has closed. message carries the network's reason. |
Editing needs a key with the publish scope.