Reference

Limits and scope

The list of things this can't do is longer than the list of things it can. That's deliberate, and every omission has a reason.

The rate limit

150 requests per day, per member. One post is one request. Nothing you do through postiee is pooled with anyone else's — the budget is yours alone.

search and history are local and cost nothing against it. Posting is what spends the budget, and a loop will spend all of it in seconds. When you run out, the failure looks like an unrelated error rather than a limit, so check this first when a script breaks without a clear reason.

Token life

Access tokens last 60 days. Refreshing them automatically is reserved for LinkedIn partners, so you re-run auth login. If you're still signed in, the consent screen is skipped and it takes seconds.

Deleting your own post is not on this list. unpublish deletes it on LinkedIn, using the same self-serve w_member_social scope that posting already needs. Only reading posts back requires the closed r_member_social. See Commands.

What postiee can't do

The three-tier LinkedIn scope gate Tier one, self-serve, granted immediately by the Share on LinkedIn and Sign In with LinkedIn products: posting and identifying yourself. Tier two, Community Management API, requires vetted partner approval: comments, reactions, analytics, reading posts back. Tier three, closed entirely, no public API at any tier: messaging and connection invitations. TIER 1 — SELF-SERVE Granted instantly. No review, no payment. w_member_social create a post openid + profile identify yourself ✓ postiee works here post · history · search TIER 2 — COMMUNITY MANAGEMENT Vetted partner review. Requires a business, legal entity, and an agreement to the Marketing API terms. w_member_social_feed comment · react r_member_postAnalytics impressions · followers ✗ not in postiee would 403 on first use r_member_social — reading your OWN posts — is CLOSED, not gated. Not accepting requests at this time. TIER 3 — CLOSED AT EVERY TIER No product in the developer catalogue. No endpoint in the docs. Explicitly prohibited use. messaging no DM API exists invitations no networking API ✗ never implementable at any access level
Three tiers. postiee operates entirely inside the first.
CapabilityStatus
Comments partner approval Needs the Community Management API.
Reactions and likes partner approval Same.
Analytics — impressions, followers, profile views partner approval Separate member analytics scopes.
Reading your own posts back closed r_member_social isn't accepting requests.
Reading who reacted to a post closed Reaction identities are never returned to a member app.
Messaging and DMs no API exists No endpoint in the docs. Mass messaging is an explicit prohibited use.
Connection invitations no API exists Same.
Looking up another member's profile no API exists Person IDs are app-scoped, so there's no way to resolve someone else's.
Running ads separate product The Marketing API is a different platform with its own approval.
Scheduled posts client-side only No publishAt field exists. Scheduling means a local timer.
Multi-image and video posts partner approval One image works self-serve. post --image takes exactly one, and there is no flag for more.

Why so many omissions

LinkedIn's API is not built for individuals posting to their own feed. It is built for marketing platforms managing thousands of company pages. So the surface that would actually help you — reading your posts, reacting to them, seeing how they performed — is exactly the surface that requires becoming a vetted partner.

A comment command that 403s on first use teaches you nothing and wastes your afternoon. An absent command tells you the truth immediately. So the tool ships only what works, and this page says why the rest is out of reach.

If LinkedIn ever opens one of these, the architecture will take it. The local history already stores what a comments table would need — the post URN is the join key.

What is guaranteed to keep working

These are pinned by tests in the repository, so a change that breaks one fails the build rather than quietly changing behaviour.

PropertyStatus
Porter stemming — authentic finds authenticationpass
Multi-term AND narrows rather than widenspass
An absent term returns nothingpass
Junk input never errors — ", AND, (), NEAR(a b), --pass
Re-recording a post upserts instead of duplicatingpass
Deleting removes the search index entry toopass
Deleting on LinkedIn sends X-RestLi-Method: DELETEpass
Deleting an already-deleted post is accepted, not an errorpass
Post ID read from the response header, not the bodypass
Image upload performs exactly two callspass
URNs in paths are fully percent-encodedpass

Run go test ./... to confirm them yourself.

Partial-word prefix search does not work, and is not going to. SQLite FTS5 indexes whole tokens, so search harn misses harness. It is called out here because a limit you know about is cheaper than one you find at 2am — not because it is queued for support.