Get Linkedin Posts
get_linkedin_postsRECENCY WINDOW: only posts from the last posted_within_days days (default 7)
are returned — this tool answers "what has this person posted lately", not
"show me their post history". A profile with nothing in that window comes back
with profiles[<key>]['status'] == 'no_recent_posts' and no posts for that
profile — that is normal and does not mean the lookup failed. In that case,
personalize off the prospect's role, company, or headline instead of forcing a
stale post reference; do not widen posted_within_days just to find something
to quote unless the user asked for older posts specifically.
Only the profile's own original posts count as "recent activity" — reshares and quote-posts are excluded.
ALWAYS BATCH: pass every profile URL in ONE call — batching is both cheaper and
faster than one call per profile. Up to 1000 profiles per call; split a larger
list across calls. Each returned post carries a profile_input field identifying
which profile it came from (the matched input identifier).
COST: 0.02 credits per unique scrapeable profile searched, PLUS 0.5 credits for
each profile that actually has a post in the window. If the user has fewer
credits than profiles, only the affordable first profiles are looked up and the
rest are reported in skipped_profiles_due_to_credits.
LARGE-BATCH COST GATE: because each profile can cost up to 0.52 credits, a call
that would search more than 100 profiles is refused with a ModelRetry that
states the exact credit cost, UNLESS large_batch_approved=True is passed. Set
large_batch_approved=True ONLY after the user has seen the credit
cost and agreed to it — in interactive chat, that means you told them the number
and they said yes; in stored trigger code, ONLY if the user explicitly approved
this recurring spend when the trigger was set up. Do not set it reflexively to
silence the retry.
A dict with the following keys.
posts: list of {url, text, author, posted_at, days_ago, profile_input, reactions, comments} — newest-first per profile.
reactions/commentsare engagement COUNTS, not the people who engaged — usefetch_post_engagersfor the actual list of people.total: number of posts returned.
profiles: dict keyed by the normalized profile identifier (the same value as each of that profile's post's
profile_input), each{'status': 'ok'|'no_recent_posts'|'not_found', 'posts': int}— covers every attempted or cached profile.not_foundmeans the actor could not resolve the target (renamed/private/deleted);no_recent_postsmeans it resolved but nothing fell in the window. (Distinct from the top-levelunresolvable_profileslist below, which is inputs rejected at URL classification and never sent to the actor.)posted_within_days, profiles_lookup_count, credits_charged, and optionally skipped_profiles_due_to_credits / warning / unresolvable_profiles.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max posts per profile (default 3, max 5) | |
| linkedin_urls | Yes | List of PUBLIC profile URLs (linkedin.com/in/<slug>) or bare usernames, e.g. ["https://linkedin.com/in/johndoe", "janedoe"]. Sales Navigator URLs (linkedin.com/sales/lead/...) and company URLs are NOT scrapeable — they are skipped and reported in `unresolvable_profiles`, and are NOT charged. If you only have a Sales Navigator URL, resolve a public /in/ URL first (e.g. via Apollo) before calling this. | |
| posted_within_days | No | Only return posts published in the last N days (default 7). | |
| large_batch_approved | No | Confirm a lookup above the cost-gate threshold. Only set True once the user has seen and approved the credit cost (see the LARGE-BATCH COST GATE note above). |