- A re-started run no longer collects past the number of posts you asked for. Apify sometimes moves a run to another server part-way through; the run picks up where it left off. To know how many posts it had already handed you, it was counting the ones it had CHARGED for — and a post can be delivered without being charged, on a run that bills nothing or once your maximum cost per run is reached. So it read its own tally low and kept collecting past your limit. It now counts the rows you actually have. If your run is never moved, nothing changes: this only ever showed up after a restart.
- A run started with a scoped API token now tells you why it charged for posts you already had. The memory that skips what your account already has is a key-value store in your own Apify account, and a token limited under "Restrict what Actors can access" cannot open one — so the check was silently off and every repeat was collected and charged again, while the run looked ordinary. That run now says so on its status line, on one uncharged note row at the top of the dataset, on every row it charged, and in the run summary, and it names the fix: give the token key-value store Read, Write and Create, or set Actor runs to Full access. A run started from the console, or with a full-access token, is unchanged.
- And a token that can READ that memory but not WRITE it now says so too. That one is the one that quietly breaks "a post your account already had is skipped and not charged" while looking like a perfect run: every post you already had was still recognised and skipped, but nothing this run delivered could be written down — so your NEXT run collected and charged all of it again, with nothing anywhere to say why. The run now names it the moment the first write is refused, on the run page, on its own uncharged row in the dataset, in the run summary and in the run log, and tells you the permission to add: key-value store Write (and Create) under Settings → API & Integrations, or Actor runs set to Full access. A run with a full token is unaffected.
- Nothing else moved: no input field, output column, charged event or price changed.
- An aborted or migrated run now leaves its receipt from the first moment of the run, instead of only after start-up finishes. The record that says how a run ended was only put in place once the run had finished starting up — reading your input, opening its stores, working out what a previous attempt had already delivered and charged. A run stopped inside that window ended with nothing written about it at all, which mattered most on a re-started run, where the thing not written about was the earlier attempt's work. It is now in place from the run's first moment. Nothing else moved: no input field, output column, event or price changed, and a run that reaches its work behaves exactly as before.
- A page that stopped part-way through no longer says "nothing was charged" over posts you were already charged for. When LinkedIn stops answering mid-walk, the row that closes what is missing now opens with how many posts had already been delivered and points at their own rows for what each one cost — the re-run is for the rest, and only the rest is uncharged.
- A walk that runs into this actor's own 200-page limit now says that is what happened. It used to arrive as "LinkedIn shows no more public posts on this page", which is the opposite fact: LinkedIn was still serving. The row names the limit as this actor's own, says it is not a verdict about the page, and names what to change so the pages a run reads can fill the ask.
- And the run's own summary now files that ending separately, instead of under LinkedIn having no more posts. The row said the bound was this actor's own while the summary counted it as the page running out — the row and the summary saying opposite things about the same link. It has its own name on both now,
skipped.page_cap, and it is counted as a stop rather than a miss: nothing ran out, nothing failed, and nothing behind the bound was ever collected or charged. no_data from here on means only what it says — the page is real and LinkedIn shows no public posts on it.
Your inputs, your events, your prices and every column on your rows are unchanged, and nothing you have already collected needs re-running.
First public build.
- Posts from any LinkedIn profile or company page: the text, the real publish timestamp LinkedIn stamps on the post, likes, comments, shares, the per-type reaction breakdown, the images, video, document and article links, and the author.
- Company pages, showcase pages and people's profiles go in one list and are sorted out by their own URL path. A bare public identifier works as well as a full link.
- The publish time is the one LinkedIn itself stamped on the post, to the millisecond — not a reading of a "2 weeks ago" label. The label ships beside it as its own column.
- A repost is one row at one price, marked
isRepost, carrying the original post's id, link, author and publish time underneath it. Turn includeReposts off and reposts are dropped before they take a slot.
- Where LinkedIn hides a reaction, comment, repost or view count on a page, that number is
null and countsHidden names which one is hidden. A hidden count never reads as a zero.
- Limits are hard and they are two different limits:
postsPerTarget is per page you named, maxItems is the whole run. Neither is ever exceeded, and a page holding fewer posts than you asked for says so on a row that costs nothing.
- A date window is applied to the post's own publish timestamp, and the walk stops as soon as a page runs past it — so a narrow window costs less, not more.
- One charged unit, one delivered post: $0.0018 on the Apify free plan, $0.0015 Bronze, $0.0012 Silver, $0.0010 Gold and above. No start fee, and no fee for a page that returned nothing.
- Never charged: a page LinkedIn does not list publicly, a page with no public posts, a link that is not a profile or company page, a link to a single post, a read that failed, and posts cut by your own limit or the run clock. Each of them arrives as a row naming what happened, not as a missing line.
- Re-runs skip the posts your account already had — no row, no charge — so a weekly watch on the same pages pays only for what is new.
- A time limit ends the collecting, never the delivering: posts already in hand are always written out, and the last row reconciles what was delivered, what was charged and what stopped the run.