LinkedIn-Version has no default: pin YYYYMM in your video poster
LinkedIn does not apply the latest API version when the header is missing. Pin a YYYYMM value in config and fail loudly if it is unset.

LinkedIn expects every versioned Marketing API call to carry a Linkedin-Version header in YYYYMM format, and the latest version is not applied by default. For a video poster, store the version string in one setting, send it on every call, and fail the deploy when it is empty.
LinkedIn's versioning page lists September 2026 (202609) as the latest version, and says versions follow a monthly cycle and are supported for at least one year before sunset.
What are the header rules?
The page gives these rules.
| Rule | What LinkedIn says |
|---|---|
| Header name | Linkedin-Version |
| Format | YYYYMM, for example 202601 for January 2026 |
| Base path | https://api.linkedin.com/rest/ |
| Default | No default: the latest version is not applied when the header is missing |
| Support window | Minimum of one year before sunset |
| Migration | Change the YYYYMM value in the header to the newer version's |
How do I keep it in one place?
Build headers in one function so a version bump is a one-line change. The sample refuses to run without a version and also sets the Rest.li protocol header that LinkedIn's own example sends.
import os
def linkedin_headers(token: str) -> dict:
version = os.environ.get("LINKEDIN_VERSION", "")
if len(version) != 6 or not version.isdigit():
raise RuntimeError("Set LINKEDIN_VERSION as YYYYMM, for example 202609")
return {
"Authorization": f"Bearer {token}",
"Linkedin-Version": version,
"X-Restli-Protocol-Version": "2.0.0",
"Content-Type": "application/json",
}
if __name__ == "__main__":
os.environ.setdefault("LINKEDIN_VERSION", "202609")
print(sorted(linkedin_headers("token").keys()))Where does Sume come in?
Sume renders the clip and returns a durable job; the LinkedIn version only matters for the posting step. Submit with an Idempotency-Key, store the job id, and post only after the job is completed, so a LinkedIn-side change never forces a second render (Jobs and results).
Sources
Related posts
More in Developers
- Verify a Sume job webhook in Python, and refuse an empty secret
A Python verifier for Sume job webhooks: HMAC SHA 256 over timestamp.body, a 5-minute window, rotation-safe, and a hard refusal when the secret is empty.
- LiveKit avatar join latency and playback latency: what to measure
LiveKit avatar plugins emit join latency and playback latency. Learn what each means before you pick a live avatar, and what a rendered clip has instead.
- LiveKit avatar providers with Node.js support vs a Sume Node job
LiveKit lists eight avatar providers with Node.js plugins and eight Python-only ones. For a clip rather than a live room, Sume works from Node with fetch.
- Load-test Sume job polling with k6: reads have their own budget
A k6 script that polls one finished Sume job from 5 virtual users, and what 4,800 reads a minute on Free means for any 429 you see.
Written by Sume