Reelspan posts to LinkedIn with LinkedIn's Posts, Videos, Images and Documents APIs, as the member who connected the account. You send the post once; Reelspan uploads the media, waits for LinkedIn to process it, and creates the post.
What you can post
| Post | How | Notes |
|---|---|---|
| Text post | POST /v1/posts/text |
Up to 3,000 characters |
| Video post | POST /v1/posts/video |
|
| Image post | POST /v1/posts/photos |
One image, or up to 20 in a multi-image post |
| Document | POST /v1/posts/document |
A PDF, PowerPoint or Word file shown as a swipeable carousel |
Reelspan handles for you:
- LinkedIn's text format. LinkedIn treats characters such as
( ) [ ] { } < > @ * _ ~ |as markup; Reelspan escapes them so your text shows as written, and turns#hashtagsinto real LinkedIn hashtags. - Multipart video upload in the parts LinkedIn asks for, then a wait while LinkedIn processes the video (up to 15 minutes) or document (up to 10 minutes).
- Images in parallel, kept in the order you sent them.
Connect the account
LinkedIn connects with a LinkedIn sign-in: in the dashboard go to Accounts → LinkedIn, or send a white-label connect link. Posts go to the personal profile of the member who signed in.
LinkedIn sign-ins last 60 days and LinkedIn gives no way to renew them, so the account has to be reconnected every 60 days. Reelspan marks it as needing a reconnect when it expires.
Company pages
Posting as a LinkedIn company page needs LinkedIn's Community Management API, which Reelspan doesn't have access to yet. Until it does, GET /v1/linkedin/pages returns an empty list and posts go to the member's profile.
curl "https://api.reelspan.com/v1/linkedin/pages?profile=my-brand" \
-H "Authorization: Bearer $REELSPAN_API_KEY"const { pages } = await reelspan.request('GET', '/v1/linkedin/pages', { query: { profile: 'my-brand' } });pages = reelspan.request("GET", "/v1/linkedin/pages", query={"profile": "my-brand"})["pages"]{ "success": true, "pages": [] }Example
A PDF posted as a document carousel, visible to connections only:
curl -X POST https://api.reelspan.com/v1/posts/document \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-F "user=my-brand" \
-F "platform[]=linkedin" \
-F "title=2026 hiring guide" \
-F "description=We put everything we learned about hiring engineers into 12 slides. #hiring #engineering" \
-F "visibility=CONNECTIONS" \
-F "[email protected]"import { Reelspan } from 'reelspan';
import { readFile } from 'node:fs/promises';
const reelspan = new Reelspan();
const post = await reelspan.posts.document({
user: 'my-brand',
platforms: ['linkedin'],
title: '2026 hiring guide',
description: 'We put everything we learned about hiring engineers into 12 slides. #hiring #engineering',
document: { data: await readFile('guide.pdf'), name: 'guide.pdf', type: 'application/pdf' },
extra: { visibility: 'CONNECTIONS' },
});from reelspan import Reelspan
reelspan = Reelspan()
post = reelspan.posts.document(
"my-brand", "guide.pdf", "2026 hiring guide",
description="We put everything we learned about hiring engineers into 12 slides. #hiring #engineering",
extra={"visibility": "CONNECTIONS"},
)Fields
| Field | Type | Values | What it does |
|---|---|---|---|
linkedin_title |
string | up to 3,000 characters | The post text when there is no description. Falls back to title. On a video post it is also the video's title (first 400 characters). |
linkedin_description |
string | up to 3,000 characters | The post text; takes the place of linkedin_title when both are sent. Falls back to description. |
visibility |
string | PUBLIC (default), CONNECTIONS, LOGGED_IN |
Who can see the post. linkedin_visibility works too. |
linkedin_disable_reshare |
boolean | default false |
Stops others from resharing the post. |
document_title |
string | up to 400 characters | Documents: the document's title. Falls back to title, then the file name. |
linkedin_alt_text |
string or list | up to 4,086 characters each | Image alt text: one for every image, or one per image in order. Falls back to alt_text. |
target_linkedin_page_id |
string | an organization id | Posts as a company page. Not usable until company pages are available (see above). |
linkedin_first_comment |
string | up to 1,250 characters | A comment posted under the new post. Falls back to first_comment. |
On a document post, title names the document and the post text comes from description (or linkedin_description). The first two lines of the text show before "see more", so lead with the hook.
Limits
- Post text: 3,000 characters.
- Images: up to 20 per post; more are left out.
- Documents: PDF, PPTX, PPT, DOCX or DOC, up to 100 MB.
- Video size: your plan's upload limit (see Plans and limits).
- Shapes: 1:1 and 16:9 work best.
Good to know
- Result extras:
video_urn,image_urns, ordocument_urnwithcontent_type,file_sizeandfilename. - First comment: posted under the new post as the member.
- Analytics: the member's follower count, when your Reelspan workspace has LinkedIn statistics turned on (an account connected before that has to be reconnected). There are no per-post numbers.
Errors
error_code |
What happened | What to do |
|---|---|---|
reauth_required |
The 60-day sign-in expired or was revoked | Reconnect LinkedIn. |
linkedin_upload_failed |
LinkedIn refused an uploaded part of the video, image or document | Reelspan retries server errors; otherwise post again. |
linkedin_processing_failed |
LinkedIn couldn't process the video or document | Check the file and post again. |
linkedin_processing_timeout |
LinkedIn took more than 15 minutes (10 for documents) | Reelspan retries it. |
linkedin_version_sunset |
LinkedIn stopped accepting the API version Reelspan uses | Contact Reelspan support. |
linkedin_error |
LinkedIn refused the post | Read error for LinkedIn's message. |
media_required |
A video or photo post arrived without media | Send the media, or post with POST /v1/posts/text. |