How to schedule LinkedIn carousels when the official API will not
A swipeable LinkedIn carousel that people see in the feed is a document post. The file is usually a PDF. The official way to create that post does not take a future time. You initialize an upload, you send the bytes, and you create the post with lifecycleState set to PUBLISHED. The post goes out as part of that last call.
That is the limitation behind the search. There is no organic "schedule this carousel" field on the Documents API create example. The Posts schema used for creation says PUBLISHED is the only lifecycleState accepted when you create. publishedAt on the response is the time the content was published, in epoch milliseconds. It is not a request to publish on Thursday.
Boykli does not invent a LinkedIn schedule parameter. It stores a carousel it already designed, and at the slot it runs those same three calls as the personal profile you connected. The date lives in Boykli. LinkedIn receives a publish. The product steps for the title, the caption, and the weekday clock are in how to schedule a PDF on LinkedIn. This page is the API wall those steps are walking around.
The Documents API page in Microsoft's October 2026 Learn set (view li-lms-2026-10) is the source for the file ceiling, the file types, the upload handshake, and the create body quoted below. Recheck that page before you treat a header version or a sample URN as permanent. Boykli currently sends LinkedIn-Version: 202502 and X-Restli-Protocol-Version: 2.0.0.
Three objects people call a carousel
| Organic document (the feed carousel) | Sponsored carousel | Multi-image post | |
|---|---|---|---|
| What the Posts API calls it | Document content: content.media with a urn:li:document | content.carousel. The Posts API table lists Carousels as sponsored only, not organic | content.multiImage. Organic only. Minimum 2 images, maximum 20 |
| What the member sees | A paginated file. Page one is the cover. Viewers can download it | An ad unit of cards, each with its own landing page | A gallery of images, not pages of one PDF |
| Create call | POST /rest/posts with lifecycleState: PUBLISHED after the document upload | Same posts endpoint, with ad context. Not a personal-profile document | Same posts endpoint, with image URNs you already uploaded |
| A future time on that create | Not in the sample. Create publishes | Sponsorship is a different product from a Tuesday slot on your profile | Same create rule: PUBLISHED is the accepted lifecycle on create |
| Who can own the file | A person, an organization, or a sponsored account, if the token may act for that owner | An organization, inside Campaign Manager workflows | The author who owns the images |
| What Boykli sends | A PDF it rendered, as urn:li:person for the connected member | Nothing. No ads account, no card carousel | Nothing. A single generated image is a different post. The comparison of gallery versus PDF is multi-image versus carousel |
The Documents API note that a document can be reused in "a single document ad and a carousel ad" is about ads formats sharing one uploaded file. It is not a way to turn an organic PDF into content.carousel. If a client posts content.carousel on a personal profile and expects a swipeable PDF, the content type is the wrong one.
Limits that are on the official pages
These are the constraints that break a homemade scheduler. They are separate from Boykli's own form.
- Size and type. The file cannot exceed 100 MB and 300 pages. Supported types on that page are PPT, PPTX, DOC, DOCX, and PDF. A 301-page export fails in processing. A file that is not one of those types fails the same way. Status comes back as
PROCESSING_FAILEDwhen the client sent something the pipeline rejects, including a file that is too large or a format that is not supported. - The upload is two steps, and the URL dies.
POST /rest/documents?action=initializeUploadwithinitializeUploadRequest.ownerreturnsuploadUrl,uploadUrlExpiresAt(epoch milliseconds), anddocument(the URN). You then PUT the bytes touploadUrl.SYNCHRONOUS_UPLOADis not supported. Initializing on Monday and uploading on Thursday uses an expired URL. The URN from that initialize is not a reservation you can redeem later. Initialize again at send time. - The owner has to match the token. For a person URN, the caller must be that member. For a company URN, the caller needs admin or DSC permission on the Page. A mismatch returns 403: accessing the document resource is forbidden.
w_member_socialis the permission to post as the member.w_organization_socialis the permission to post as the organization. A personal-profile token does not become a Page author because you put an organization URN inowner. - Create publishes. The sample body sets
author,commentary,visibility: PUBLIC,distribution.feedDistribution: MAIN_FEED,content.media.title,content.media.idequal to the document URN, andlifecycleState: PUBLISHED. A successful create is HTTP 201 with the post id inx-restli-id. The schema listsDRAFTandPUBLISH_REQUESTEDas values you can get back.PUBLISH_REQUESTEDmeans LinkedIn accepted the post and is still rendering it. It does not mean you asked for next week. - The title is not the commentary.
content.media.titleis the document name.commentaryis the post text, and LinkedIn's own post limit for that text is 3,000 characters. Putting the caption intotitlenames the file with a paragraph. Putting the title intocommentaryand leaving the name asExample.pdfis how a scheduled deck shows up as a file called Example. - You do not replace the file later. After the post is live, LinkedIn Help lets you edit the description or delete the post. It does not let you swap the document. A bad slide is a new post and a new upload.
A data-portability schema mentions scheduledAt as a time a post is scheduled to be published, empty when it never was. That is a read of something LinkedIn already holds, from the member composer or a Page tool. It is not a field on the Documents API create sample. Writing a future publishedAt into the create body is guessing. The field on the create response is filled when the post is published.
What Boykli changes, and what it leaves alone
The queue is the fix for the missing time field. It is not a second LinkedIn API.
At the slot, for a row whose type is a saved carousel, Boykli loads that carousel, reuses a cached PDF when the HTML and aspect ratio still match, otherwise renders the PDF on the server, then:
POST https://api.linkedin.com/rest/documents?action=initializeUploadwithownerset tourn:li:person:{the connected member id}.PUTthe PDF bytes to the returned upload URL,Content-Type: application/pdf.POST https://api.linkedin.com/rest/postswith that document URN, the document title cut to 120 characters, the commentary, public visibility, main-feed distribution, andlifecycleState: PUBLISHED.
The carousel id is never sent as the commentary. The caption stored for the queue is. If that caption is empty, the caption saved on the carousel is used. Both can be empty, which publishes a document with no text above it.
Boykli does not upload PPT, PPTX, DOC, or DOCX, even though the Documents API lists them. The file it sends is the PDF it rendered: 2 to 8 pages, square 1080 by 1080 or portrait 1080 by 1350. Default slide count is 5. A client PDF handed to the post-now path above the app's upload ceiling, 25 MB unless that setting was changed, is rejected before LinkedIn sees it. The official ceiling remains 100 MB and 300 pages. A deck of eight slides does not approach either number.
Boykli also does not post as an organization. The API allows an organization owner when the token has Page permission. This product's OAuth is the member, and the author URN is that person. A company Page carousel stays in LinkedIn's Page composer. The split between a personal-profile queue and a Page tool is LinkedIn personal profile scheduler. The queue that holds both text posts and these PDFs is LinkedIn scheduling tool.
The seat is paid before any of this runs. Logged-in visitors can browse Radar and Algorithm with no plan. Creating the deck, posting it now, and adding it to the queue need a seat that can still generate. BYOK is $29/month: your OpenRouter key for chat and images, and a Google AI Studio key if you use Voice Agent. Boykli does not add a monthly generation cap on that seat. Managed is $88/month, with platform models inside caps that include 150 carousels in the month. Both seats use the same queue. Prices are the public list as of 26 October 2026. An AppSumo lifetime code redeemed at /redeem is a BYOK seat without a Dodo subscription. One code, one account. An existing paid seat blocks redeem.
Queue the document, publish at the slot
Boykli holds the carousel and runs the official document upload when the slot arrives. Personal profile only. BYOK is $29/month. Managed is $88/month.
boykli.com →The workflow that respects the three calls
Do these in order. Initializing the upload before the PDF exists, or before the minute you intend to publish, is the mistake the expiry field exists to punish.
1. Decide you are posting a document, not a carousel object
If the thing in the feed should be one file people swipe, the content type is a document. If the thing should be two to twenty separate photos, that is multi-image, and Boykli's queue will not assemble it. If the thing should be a sponsored card carousel, that is an ads workflow, and this product does not open Campaign Manager.
2. Make the PDF you are willing to leave unchanged
On the carousel page, the topic box takes up to 2,000 characters. You pick a tone, a slide count from 2 to 8, square or portrait, and a design. Neo-Brutalist is the default. If brand-kit colors are on, the only design available is Normal. Read every slide. There is no per-box editor. A wrong line means you change the topic and create again, which is a new carousel and, on Managed, another count toward 150.
Set the document title, up to 120 characters. That string becomes content.media.title. Set the caption, up to 3,000 characters. That string becomes commentary. They are different fields on purpose. How the slides are produced from a topic, an idea, or a lesson pulled out of a file is LinkedIn carousel generator.
3. Save the clock before you queue anything
Queue Schedule stores the weekdays, one Time of Day, and one timezone. A new queue starts on Monday, Wednesday, and Friday at 10:00, with the device timezone, and nothing is stored until you click Save. You cannot put Tuesday at 08:40 and Thursday at 17:00. Zero days makes the queue inactive. A missing timezone blocks new items, and the publisher skips a queue that never saved one.
This clock is yours. It is not written into LinkedIn as scheduledAt. The reason the product was built as a queue you approve, rather than a bot driving the website, is in building Boykli.
4. Add the saved carousel, not a file from disk
Add to Queue needs a finished, saved carousel and a non-empty document title. It sends the carousel id and the caption. The queue assigns the next open weekday from today forward, at the saved time, in the saved timezone. Drag changes which item gets the earlier slot. The same carousel cannot sit in the queue twice. A second add, while the first is still queued or publishing, conflicts. Remove the row, or create the deck again and queue the new id.
A Canva export or a report on your laptop is not this object. Schedule has no upload box for an arbitrary PDF. Post that file in LinkedIn if you want those exact pages. If the composer clock is missing on that document, the native action left is to post it now. Boykli will not hold a file it did not render.
5. Let the slot run the handshake
The publisher takes the earliest queued item whose time has arrived. One profile sends one due item at a time. For the carousel it initializes the upload then, puts the PDF, and creates the post. It does not initialize at queue time, because uploadUrlExpiresAt would pass before Thursday.
It skips the user when LinkedIn is not usable, when no weekday is selected, when the timezone was never saved, or when the account can no longer generate. A cancellation with current_period_end still in the future still has access. on_hold and an expired cancel do not, and due rows wait.
Editing the title or the caption on that saved carousel before the slot changes what the create call sends, because those fields are read at send time. Editing the HTML and creating a different carousel does not rewrite the queued id. After LinkedIn returns 201, the document in that post stays the file you uploaded.
6. Read the live post, not the queue row
The feed should show the commentary, then a document whose name is the title, opening on the cover. If the name is wrong, that was media.title. If the text above the file is wrong, that was commentary. If the slides are wrong, delete the post or leave it, and publish a new document. LinkedIn will not take a replacement PDF on the same post.
A Thursday document, timed without a schedule field
Queue: Tuesday and Thursday, 09:10, Europe/Berlin. Today is Monday. The queue is empty. You have a 6-slide portrait deck. Document title: The upload we stopped reusing (32 characters, inside Boykli's 120). Caption: about 500 characters, inside 3,000, and it does not repeat the cover line.
You add it Monday evening. The next open slot is Tuesday 09:10. You want Thursday, so you queue a short text post first, or you drag the text post above the PDF. The PDF takes Thursday 09:10. You never send a future publishedAt to LinkedIn. Nothing in the create body names Thursday.
At 09:10 Thursday the app initializes a document owned by your person URN, uploads that PDF, and creates the post as PUBLISHED. The response's publishedAt is Thursday morning, because that is when the create succeeded. If the token was expired at 09:10, the row stays and nothing is live. Reconnect the personal profile. The next pass sends the earliest due item. It does not ask LinkedIn to backdate the document.
A second deck queued on Monday takes the next open slot after the first. Two PDFs do not share 09:10. One slot is one post, document or text.
On Managed, the create of each deck counts toward 150 carousels. Queueing the saved deck does not create another one. Re-rendering a cached PDF at send time is not a new generation. On BYOK, the generation is your provider's bill, and Boykli does not add a cap.
Failures, and the fix that matches the limit
| What broke | Which limit it is | What to do |
|---|---|---|
| Create accepted and the post is already in the feed | lifecycleState: PUBLISHED means now | Hold the PDF in your own queue and run the three calls at the slot. That is what Add to Queue does for a Boykli deck |
| Upload URL returns an error hours later | uploadUrlExpiresAt passed | Initialize again immediately before the PUT. Do not cache the upload URL across days |
| 403 on initialize or on the document | Owner URN is not the member, or the token lacks w_member_social / Page admin | Connect the personal profile that will appear as the author. Boykli will not switch that author to a Page |
| Processing failed | Over 100 MB, over 300 pages, or a type outside PPT, PPTX, DOC, DOCX, and PDF | Shrink the file. Boykli only sends its own short PDF |
| The file is named with the caption, or the feed text is the filename | title and commentary were swapped | Title up to 120 characters in Boykli. Caption up to 3,000. They are stored separately |
content.carousel rejected or showed the wrong unit | Organic Posts API does not take carousel content. Carousels in that table are sponsored | Send a document URN in content.media |
| A grid of photos, not pages | That is multi-image, 2 to 20 images | Build a PDF if you want one document. Boykli's carousel path is the PDF |
| Same deck queued twice | Boykli refuses a second row for the same carousel id while the first is queued or publishing | Leave the row, or remove it. A new create is a new id |
| Slot arrived and nothing went out | Token, weekdays, timezone, or a plan that can no longer generate | Reconnect, open Queue Schedule and Save, or restore a generatable plan. on_hold does not publish |
| Slide four is wrong after 201 | The document cannot be replaced | New post, new upload |
FAQ
Can I pass a future time to the Documents API and have LinkedIn hold the carousel?
Not with the create sample LinkedIn publishes. The body sets lifecycleState to PUBLISHED. The schema says that is the only value accepted on create. publishedAt in the response is when the post went out. A scheduled time you see in the member product is the composer holding the post, which is a different mechanism from POST /rest/posts.
Is a LinkedIn carousel a different endpoint from a PDF?
In the feed, members swipe a document. The endpoint that registers the file is POST /rest/documents?action=initializeUpload, and the endpoint that publishes it is POST /rest/posts with content.media.id set to the document URN. content.carousel is the sponsored card format. content.multiImage is a gallery of images. Using either of those names for a PDF deck sends the wrong object.
Does the upload URL last until my slot?
No. The initialize response includes uploadUrlExpiresAt. Boykli initializes when the slot fires, then uploads, then creates the post. Queueing a carousel on Monday does not call initialize on Monday.
Why is Boykli's title 120 characters if LinkedIn accepts a document name?
The app stores and sends at most 120 characters for media.title. The design prompt aims for about 4 to 10 words. The commentary cap you have to respect for the post text is 3,000 characters. A title that is the whole caption gets cut at 120 before LinkedIn sees it.
Will this post as my company Page?
No. The author is urn:li:person for the account you connect. The Documents API can take an organization owner when the caller has permission to post as that Page. Boykli does not request that path and does not keep a Page queue.
What do I pay to schedule one carousel this way?
The seat is $29 a month on BYOK or $88 a month on Managed. Managed includes 150 carousel generations in the month. BYOK has no Boykli monthly cap, and you pay the provider for the create. Adding the saved deck to the queue does not spend another generation. LinkedIn does not charge for the organic document post. The queue is the same on both seats.
Can I schedule a PPT or a 40-page report through Boykli because the API allows them?
No. The API allows PPT, PPTX, DOC, DOCX, and PDF up to 100 MB and 300 pages. Boykli's queue sends the PDF it rendered from a saved carousel of 2 to 8 slides. A report or a slide file you exported elsewhere is uploaded in LinkedIn, not in this queue.
What if the create returns 201 and the slides are still processing?
PUBLISH_REQUESTED on a later read means LinkedIn has the post and is still rendering it. That is normal for media. It is not a delay you set. When processing fails, the status on the document is PROCESSING_FAILED, and the fix is a smaller or valid file, then a new upload. It is not a retry of an expired upload URL against the same initialize.
Schedule the carousel on your profile
Save the days, one time, and a timezone. Queue a finished deck with a document title. The official upload runs at the slot. BYOK is $29/month. Managed is $88/month.
boykli.com →