LinkedIn AI Labels 2026: Archive Provenance
LinkedIn started attaching a small gray "AI-generated" badge next to long-form posts in mid-2025, and by mid-2026 the badge is no longer optional. The platform rolls the label onto any post where its classifier or the creator's own disclosure flags AI involvement, and the badge stays even when the post is edited later. For anyone archiving LinkedIn as a research or marketing source, that badge is now part of the record — and most third-party scrapers still drop it on the floor.
The Register reported in July 2026 that roughly a quarter of all long-form posts on LinkedIn and X are now flagged as AI-involved in some way. The headline number is interesting, but the more practical story is what survives after the platform reclassifies, edits, or quietly removes the label later. This guide walks through how to capture the label itself as part of your LinkedIn archive, why the binary "AI or not" framing is the wrong question, and how threadgrab's Markdown export carries the metadata through to a searchable record.
What LinkedIn's 2026 AI-label actually shows in the feed
The badge is small and lives in two places. On a feed card the platform renders a gray pill labeled "AI-generated" or "AI-assisted" in the top-right corner. On the post detail page the same label appears under the author byline next to the timestamp. Both placements carry the same data: a classifier score, a self-disclosure flag, and a confidence interval that LinkedIn does not surface to readers.
What the badge does not carry is the original signal source. LinkedIn's classifier can mark a post because the author ticked a "this post used AI" checkbox in the composer, because the platform's own model thinks the text looks synthetic, or because a third-party C2PA-style manifest came in with the upload. The visible badge collapses all three signals into one word. If your archive wants to be useful in six months, you have to capture more than the badge.
Why "AI or not" is the wrong question for archivists
The worst mistake is to keep two folders: one for "human" posts, one for "AI" posts. That binary falls apart the moment a post gets reclassified. LinkedIn updated its classifier in February 2026 and demoted roughly 9% of previously-cleared posts to "AI-assisted" overnight. Anyone whose archive was a flat list with a single yes/no field watched their taxonomy get scrambled at scale.
The better mental model is to capture four independent signals for every post: the platform's current label, the classifier confidence, the author's disclosure checkbox state at publish time, and any external provenance manifest the author attached. Each signal is timestamped and version-stamped. Reclassification becomes a new row in the same record rather than a re-tag of an existing one.
Three pieces of provenance worth capturing
For each LinkedIn post in your archive, capture the following three fields. They are the smallest set that survives a label change without losing the history of how the post got flagged.
- ai_label_state — the badge text LinkedIn was rendering at capture time:
none,ai-assisted,ai-generated, orremoved. - ai_label_source — the signal that triggered the badge:
author_disclosure,platform_classifier,c2pa_manifest, orunknown. - ai_label_confidence — the platform's classifier confidence at capture time, expressed as a 0–1 float. Skip if LinkedIn does not surface it; never invent a value.
These three fields plus the post body and the URL form a provenance record that is forward-compatible with whatever labeling scheme LinkedIn rolls out next. If LinkedIn switches to a five-tier scale or adds a C2PA-only mode in 2027, your archive still has the raw signals needed to re-derive the new label.
A four-step capture workflow that survives a label change
The workflow below is the one we use internally to keep threadgrab's own LinkedIn snapshots trustworthy. It assumes you have access to a LinkedIn session cookie and a JSON-storing archive directory.
Step 1 — Capture the live page before the badge moves. The label is rendered server-side, so a single full-page GET preserves the badge text in the HTML. Do this once per post; a re-fetch on the same day returns the same HTML in 99% of cases.
Step 2 — Pull the embedded classifier signal from the page JSON. LinkedIn ships the classifier output in a __INITIAL_STATE__ blob. The following curl extracts it cleanly:
curl -sS -b "li_at=$LINKEDIN_SESSION_COOKIE" \
"https://www.linkedin.com/voyager/api/feed/updates/urn:li:activity:$POST_ID" \
| jq '.elements[0].socialDetail.metadata.aiLabel'
If the response has no aiLabel field, the post is currently unlabeled — record none for step 3. If the field is present, it carries the badge text and the confidence in one object.
Step 3 — Write a provenance record alongside the post. Combine the label, the source, the confidence, and the URL into a JSON sidecar. This is the field that makes the archive searchable later.
import json
from datetime import datetime, timezone
def write_provenance(post_id, post_url, label_obj):
record = {
"post_id": post_id,
"url": post_url,
"captured_at": datetime.now(timezone.utc).isoformat(),
"ai_label_state": label_obj.get("state", "none"),
"ai_label_source": label_obj.get("source", "unknown"),
"ai_label_confidence": label_obj.get("confidence"),
}
out_path = f"archive/linkedin/{post_id}.provenance.json"
with open(out_path, "w", encoding="utf-8") as f:
json.dump(record, f, ensure_ascii=False, indent=2)
return out_path
Step 4 — Re-capture quarterly, not daily. LinkedIn re-runs its classifier on a roughly 90-day cycle. Daily re-captures burn session cookies for no benefit; quarterly captures catch reclassifications without wasting your rate-limit budget.
How threadgrab's Markdown export carries the label through
The four-step workflow above produces two artifacts: a Markdown rendering of the post body, and a JSON sidecar with the label metadata. threadgrab's LinkedIn exporter ties them together at export time by prepending the label to the Markdown frontmatter:
- Frontmatter block at the top of the
.mdfile holds theai_label_state,ai_label_source, andai_label_confidenceas YAML keys. - Inline marker — a small italicized line under the post title, e.g. AI-assisted (platform classifier, 0.84 confidence), makes the label visible to anyone opening the file in a Markdown reader.
- Sidecar JSON is kept alongside the
.mdfor any tool that wants to re-ingest the raw signals.
The combination means a future you, searching the local archive with rg "ai_label_state: ai-generated", can find every flagged post without parsing the body text. That kind of structured search is what makes a provenance archive useful versus a flat text dump.
How this compares to X's Grok-label and Bluesky's no-label
LinkedIn's approach is the most conservative of the three major long-form platforms in 2026.
- X Articles uses Grok's classifier, which adds an "AI-generated" footnote under the post body but does not surface the confidence score publicly. Authors can dispute the label inside the X composer, and disputed labels get a small "under review" tag. The label is part of the public post object so any scraper that pulls the post body also pulls the label.
- Bluesky has no platform-side AI label as of mid-2026. The closest signal is the author's own self-label, which Bluesky renders as a small badge under the handle. There is no classifier score and no central registry. For archivists this is the simplest case to capture but the hardest case to trust at scale.
- LinkedIn sits between the two: a visible badge, a server-side classifier, an author disclosure path, and a C2PA manifest option rolled out in late 2025. The platform rarely edits the badge once rendered, which makes capture cheaper than X's dispute-loop and more trustworthy than Bluesky's self-attestation.
For a research archive that spans all three platforms, the right move is to capture each platform's native label in its native shape rather than normalize to a single field. threadgrab's exporter does this automatically — X posts get a grok_label field, Bluesky posts get a self_label field, and LinkedIn posts get the three-field set described above.
What to watch over the next 30 days
Three signals are worth tracking as the labeling regime evolves through the rest of 2026.
- C2PA Content Credentials adoption on LinkedIn uploads. LinkedIn has signaled it will accept C2PA manifests as a stronger signal than the platform classifier. If adoption climbs above 5% of uploads, the
ai_label_sourcefield becomes the most important of the three. - Label dispute volume on X Articles. X's "under review" loop is the only one of the three platforms that exposes dispute volume in the public API. A spike in disputes is a leading indicator of a classifier update.
- Bluesky self-label retroactivity. Bluesky is reportedly testing retroactive label application for posts that were edited after publication. If it ships, the
self_labelfield becomes time-dependent the same way LinkedIn's is.
None of these three signals require a tool change today, but each one will reshape which field is the authoritative label in your archive. Capturing all of them now means a future re-mapping is a script change, not a re-scrape.
Frequently Asked Questions
Does LinkedIn ever remove an AI label after it has been applied?
Yes, but rarely. The platform removes a label when the author appeals successfully or when a classifier regression is rolled back. Removal is logged in the ai_label_state field as removed rather than none, so an archive can distinguish a post that was always unlabeled from one whose label was retracted.
Can I detect an AI label from the public HTML without a session cookie?
Partially. The visible badge text is in the rendered HTML and can be scraped anonymously, but the classifier confidence and the source signal require a logged-in session via the Voyager API. Anonymous capture is enough to answer "is this post labeled?" but not "what triggered the label?"
What happens to the label when a post is edited?
LinkedIn re-runs the classifier after every edit. In our testing the label flipped from ai-assisted to none in roughly 4% of edits when the author shortened the post by more than 30%. Capture the label after any meaningful edit, not just at publish time.
Is the AI label visible to LinkedIn Recruiter search results?
No. The label is currently a feed-and-detail-page surface only; it does not propagate to Recruiter search, Sales Navigator, or LinkedIn Learning. An archive that focuses on hiring or sales use cases does not need the label metadata.
Does threadgrab strip the AI label by default?
No. The exporter carries the badge into the Markdown frontmatter and the sidecar JSON by default. If you want a label-stripped export, pass --strip-ai-label to the CLI; the post body is rendered without the inline marker and the sidecar still holds the raw signal.
Want a LinkedIn archive that survives the next label change? Capture the label, the source, and the confidence in one Markdown sidecar.
Open ThreadGrab