Skip to main content
POST
Scrape LinkedIn school search

Authorizations

Authorization
string
header
required

Access token issued by gtm.service.id. Its access_identity claim carries team_sid, actor_sid and actor_type, and that team scope is authoritative.

Team-SID
string
header
required

Team scope for tokens that do not carry one. Ignored when the token already names a team.

Body

application/json

Request body of scrape_linkedin_search_schools.

linkedin_account_sid
string | null

Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity).

Required string length: 18
Pattern: ^ln_ac_
idempotency_key
string | null

Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key.

Maximum string length: 128
url
string | null

EXCLUSIVE with filters: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/schools/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched.

Maximum string length: 2048
Pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/schools\/
filters
object | null

EXCLUSIVE with url: send filters OR url, never both (422) and never neither (422). LinkedIn school-search filters. keywords is the ONLY member the node reads, so any other key is REFUSED rather than ignored. In particular there is NO school-id member: the ids param_id_lookup returns for type=school fit no filter on this engine and reach LinkedIn only inside a pasted people-search URL. Every facet the schools screen offers beyond the keyword box is reachable only by building the search in the LinkedIn UI and pasting that URL into the url field.

page
integer

LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched.

Required range: 1 <= x <= 100

Response

action success envelope.

success
enum<boolean>
required
Available options:
true
operation
enum<string>
required
Available options:
action
action
string
required

kebab-case verb; matches the route segment.

item
any
required
result
object
required
meta
object
required