Inbound (Received) Connection Requests
li_received_invitationsList the connection requests people sent to this account that are awaiting a decision, each with name, HEADLINE (role + company), mutual connections, profile URL, the inviter's permanent memberId (ACoAA…) and a decision block from the triage memory. Read-only on LinkedIn.
RETURNS A JOB ID AND DOES NOT WAIT (by default). A long tray takes minutes to walk — a 57-invite tray at scrollPasses 40 outlived the client's 180s wait while the job finished fine. Read the result with li_job_result({ jobIds: [jobId], waitMs: 120000 }) — waitMs is honoured with jobIds, not jobId. Pass wait=true only for a small tray.
TRIAGE MEMORY. Every row carries decision: null if this account never judged them, else { decision (accepted | rejected | wrong_lane | failed | deferred), reason, icp, campaignId, routeTo, decidedAt, changedSinceDecision } — and changes (headlineBefore/Now, companyBefore/Now) when their headline or company moved since they were judged (case, whitespace and emoji ignored). People are matched on the member id, so a renamed vanity URL is still recognised. onlyUnreviewed=true returns ONLY the rows that need judging: never judged, a failed accept to retry, or changed since judged — and counts still covers the whole tray: { total, unreviewed, alreadyDecided: { accepted, rejected, wrong_lane, deferred }, failedRetry, changed }, so you can say '56 already checked' without listing them. Record verdicts with li_mark_invitations; li_accept_invitations records accepted/failed by itself. Each read also updates first/last-seen on every person it saw.
CONNECTION REQUESTS ONLY, by default. The same page carries newsletter-subscription and page-follow invitations listed against the inviter's own profile; accepting 'them' subscribes the account to a newsletter. filteredOut counts them; includeNonConnection=true shows them (with decision: null — they are never a connection decision).
🚨 READ pageState.reachedEnd BEFORE CONCLUDING ANYTHING FROM AN ABSENCE. When false, countsAreFloor is true and a reachNote says so: somebody missing may simply be below where the walk stopped. Nothing is ever marked gone from a read. Raise scrollPasses and read again.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Block until the read finishes and return the list directly. Default false (returns a jobId — read it with li_job_result). Only for a small tray. | |
| sessionId | No | Account id from li_list_accounts. Omit (with sessionLabel) to use your default account. | |
| scrollPasses | No | A CEILING on scroll passes, not a fixed number — the walk stops as soon as the card count settles and reports `pageState.reachedEnd`. About ten invitations load per pass. Default 12; raise it for a big backlog. | |
| sessionLabel | No | Account by label, LinkedIn name, profile slug or member id (li_list_accounts). Omit (with sessionId) to use your default account. | |
| onlyUnreviewed | No | Return only people never judged, failed accepts to retry, and people whose headline/company changed since they were judged. Counts still cover the whole tray. Default false. | |
| includeNonConnection | No | Also list newsletter, page-follow and event invitations. Default false — they are not requests to connect. |