{"openapi":"3.1.0","info":{"title":"LinkedIn Profile API","description":"\nGive it a LinkedIn profile URL — get structured JSON back.\n\nName, headline, about, location, experience, education, skills, certifications,\nlanguages and profile images.\n\n---\n\n## ▶ Try it right now — no setup, no login\n\n1. Scroll down to **`GET /api/v1/profile`** and click it to expand.\n2. Click the **`Try it out`** button (top-right of that section).\n3. In the **`url`** box, paste: `sahil-patani-2721231b8`\n4. Click the blue **`Execute`** button.\n\nYou will get a complete profile back. **No credentials needed** — that one is\npre-loaded on the server as a demo.\n\n---\n\n## 🔑 To look up *any other* profile\n\nAny profile that is not pre-loaded has to be fetched from LinkedIn live, and\nthat needs a LinkedIn login. **This service does not have one** — it stores no\nLinkedIn credentials at all, on purpose. So you supply your own, and it is used\nfor your request only.\n\n**Step 1 — get your two cookies**\n\nOpen LinkedIn in Chrome while logged in, then:\n\n| | |\n|---|---|\n| Press | `F12` to open DevTools |\n| Go to | the **Application** tab |\n| In the sidebar | Cookies → `https://www.linkedin.com` |\n| Find and copy | **`li_at`** and **`JSESSIONID`** |\n\nTwo things that will otherwise waste your time:\n\n* **`li_at` is ~150 characters.** The cookie *table* truncates it — click the row\n  and copy from the **detail box below the table** instead.\n* **Copy both in one sitting.** They are issued as a pair. A fresh `li_at` beside\n  an older `JSESSIONID` gets rejected in a way that looks like an expired session.\n\n**Step 2 — give them to this page**\n\nClick the green **`Authorize`** button at the top right of this page, paste each\ncookie into the matching box, then click Authorize and Close. They now apply to\nevery request you make here.\n\n**Step 3 — look up anyone**\n\nPut any of these in the `url` box:\n\n```\nhttps://www.linkedin.com/in/someone/\nhttps://in.linkedin.com/in/Someone?trk=nav\nlinkedin.com/in/someone/details/experience/\nsomeone\n```\n\nAll four work — the URL is parsed and normalised for you.\n\n---\n\n## 🔒 About handing over your cookies\n\nA LinkedIn cookie is a live credential: it grants access to your account without\na password. Giving one to *any* third-party API — including this one — is a real\ndecision, so here is exactly what happens to it:\n\n* Used for **your request only**, then discarded.\n* **Never** written to disk, never cached, never logged (the logger redacts these\n  header names by construction).\n* Your usage is rate-limited **separately from everyone else's**, keyed on a hash\n  of your cookie, so nobody else can spend your allowance.\n\nYou have the source code as your assurance, not just this paragraph. If you would\nrather not, the pre-loaded profile above needs no credentials at all.\n\n---\n\n## 📋 Good to know\n\n* **Rate limits:** one profile every ~45 seconds, 50 per day — per LinkedIn\n  session, not globally. Slow is deliberate: it is what keeps accounts safe.\n* **Repeat lookups are cached** for 24 hours and return instantly.\n* **`meta.source`** in every response tells you where the data came from —\n  `voyager-dash` means fetched live, `cache-*` means it was already held.\n* **No API key required.** This endpoint is intentionally open; see the README\n  for why, and what bounds abuse instead.\n","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Liveness check","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}},"/health/session":{"get":{"tags":["health"],"summary":"LinkedIn session state","description":"Service state, and this caller's remaining budget if they identified one.\n\nThe service holds no LinkedIn session, so there is no server-side session to\nreport on. Supplying your cookies here shows your own remaining allowance.","operationId":"session_health_health_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Session Health Health Session Get"}}}}},"security":[{"1. LinkedIn li_at cookie":[]},{"2. LinkedIn JSESSIONID cookie":[]},{"3. LinkedIn lidc cookie (optional)":[]},{"4. LinkedIn bcookie (optional)":[]}]}},"/api/v1/profile":{"get":{"tags":["profile"],"summary":"Look up a LinkedIn profile (start here)","description":"**New here? Try this first.** Click `Try it out`, put `sahil-patani-2721231b8` in the `url` box, and press `Execute`. That profile is pre-loaded, so it needs no login.\n\n**For anyone else**, click the green `Authorize` button at the top of this page and paste in your own two LinkedIn cookies first — the API has no LinkedIn login of its own. Full instructions are at the top of this page.\n\n### What you get back\n* `data` — the profile: name, headline, about, location, experience, education, skills, certifications, languages, images\n* `meta.source` — where it came from. `voyager-dash` means fetched live from LinkedIn just now; anything starting `cache-` means it was already held and no request was made\n* `warnings` — usually empty. If one section failed but the rest worked, you get the rest plus a note here rather than an error\n\nSections a person has nothing in come back as `[]`, never missing, so you never need to check whether a key exists.","operationId":"get_profile_api_v1_profile_get","security":[{"1. LinkedIn li_at cookie":[]},{"2. LinkedIn JSESSIONID cookie":[]},{"3. LinkedIn lidc cookie (optional)":[]},{"4. LinkedIn bcookie (optional)":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"**A LinkedIn profile URL, or just the bit after `/in/`.**\n\nAll of these are the same person and all of them work:\n`https://www.linkedin.com/in/jane-doe/` · `https://in.linkedin.com/in/Jane-Doe?trk=nav` · `linkedin.com/in/jane-doe/details/experience/` · `jane-doe`\n\n_Try `sahil-patani-2721231b8` — it needs no login._","examples":["sahil-patani-2721231b8"],"title":"Url"},"description":"**A LinkedIn profile URL, or just the bit after `/in/`.**\n\nAll of these are the same person and all of them work:\n`https://www.linkedin.com/in/jane-doe/` · `https://in.linkedin.com/in/Jane-Doe?trk=nav` · `linkedin.com/in/jane-doe/details/experience/` · `jane-doe`\n\n_Try `sahil-patani-2721231b8` — it needs no login._"},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Leave this off unless you specifically need fresh data. Turning it on skips the cache and fetches from LinkedIn again, which is slower and spends one of your 50 daily lookups.","default":false,"title":"Refresh"},"description":"Leave this off unless you specifically need fresh data. Turning it on skips the cache and fetches from LinkedIn again, which is slower and spends one of your 50 daily lookups."}],"responses":{"200":{"description":"Profile found.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Profile Api V1 Profile Get"},"example":{"success":true,"requestId":"req_79623f987c1c4a6f","meta":{"source":"voyager-dash","cached":false,"fetchedAt":"2026-08-30T10:20:11Z","durationMs":1186,"schemaVersion":"1.0"},"warnings":[],"data":{"fullName":"Ayush Srivastava","headline":"SDE2 @Amazon | Ex @Juspay","about":"Passionate software developer with...","location":{"countryCode":"IN"},"experience":[{"title":"Software Development Engineer II","company":{"name":"Amazon"},"isCurrent":true,"duration":{"months":3,"text":"3 mos"}}],"education":["..."],"skills":["..."]}}}}},"400":{"description":"The URL is not a LinkedIn *profile*. Company, school, job and post URLs are rejected here, and the message says which."},"401":{"description":"This profile is not pre-loaded, so it needs a LinkedIn login and you have not supplied one. Use the `Authorize` button. You will also see this if a cookie looks malformed - it is checked before anything is sent to LinkedIn."},"404":{"description":"No LinkedIn profile exists at that address."},"429":{"description":"Your own daily limit is spent (50 profiles). Other people are unaffected; cached profiles still work."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"1. LinkedIn li_at cookie":{"type":"apiKey","description":"**Paste your `li_at` cookie value here.**\n\nChrome → `F12` → **Application** tab → Cookies → `https://www.linkedin.com` → click the `li_at` row → copy the value from the **box underneath the table** (the table itself truncates it).\n\nIt should be roughly 150 characters. A short value means it was clipped and will be rejected.\n\n_Used for your request only. Never stored, cached or logged._","in":"header","name":"X-LinkedIn-Li-At"},"2. LinkedIn JSESSIONID cookie":{"type":"apiKey","description":"**Paste your `JSESSIONID` cookie value here — including the quotes.**\n\nIt looks like `\"ajax:1234567890\"`. Same place as `li_at`.\n\n⚠️ **Copy both cookies in one sitting.** They are issued as a pair, and a fresh `li_at` next to an older `JSESSIONID` is rejected by LinkedIn in a way that looks exactly like an expired session.","in":"header","name":"X-LinkedIn-JSessionId"},"3. LinkedIn lidc cookie (optional)":{"type":"apiKey","description":"Optional. From the same cookie jar. Safe to leave blank.","in":"header","name":"X-LinkedIn-Lidc"},"4. LinkedIn bcookie (optional)":{"type":"apiKey","description":"Optional. From the same cookie jar. Safe to leave blank.","in":"header","name":"X-LinkedIn-Bcookie"}}},"tags":[{"name":"profile","description":"The main endpoint. Start here."},{"name":"service","description":"Where to go and what this is."},{"name":"health","description":"Is it up, and how much of your rate limit is left. Useful for checking your cookies were accepted."}]}