HTTP 999 from LinkedIn: what the non-standard status means
LinkedIn answers some scripted page requests with status 999, a code outside the HTTP standard. What it signals, what LinkedIn's terms say and what the official API does offer.
HTTP/1.1 999 Short answer
LinkedIn's 999 response is a site-specific status outside the standard HTTP range, and LinkedIn does not document its meaning. Treat it as an undocumented response to the scripted request, while recognizing that the official API uses a separate documented status for rate limiting.
Diagnosis checked 2026-11-12; sources below.Why it happens
999 is not a standard HTTP status: RFC 9110 keeps valid codes within 100 to 599, and LinkedIn does not document it. Its User Agreement bans software, scripts and crawlers that scrape or copy the Services. Source: RFC 9110, section 15.
Do this now
- For public company and profile pages at volume, run a hosted route instead of patching your own requests: LinkedIn Company Pages with Funding & Affiliates. The request below runs it with its published example input through the Apify API (your token, billed at the Store price).
- Compare every route, with fields and prices, on the LinkedIn page.
Python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
# Also set cookie (required, no default).
run_input = {
"companyUrls": [
"https://www.linkedin.com/company/hubspot/"
],
"includeAffiliates": False,
"includeShowcases": False,
"includeFundingDetails": True,
"language": "en"
}
run = client.actor("nimbryxo-studio/linkedin-company-pages-with-funding-and-affiliates").call(run_input=run_input)
if run is None:
raise RuntimeError("The Actor run was not found.")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item) pip install apify-client
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
// Also set cookie (required, no default).
const input = {
"companyUrls": [
"https://www.linkedin.com/company/hubspot/"
],
"includeAffiliates": false,
"includeShowcases": false,
"includeFundingDetails": true,
"language": "en"
};
const run = await client.actor("nimbryxo-studio/linkedin-company-pages-with-funding-and-affiliates").call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items); npm install apify-client
cURL
# Also set cookie (required, no default).
curl -X POST "https://api.apify.com/v2/actors/nimbryxo-studio~linkedin-company-pages-with-funding-and-affiliates/run-sync-get-dataset-items" -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" -d '{"companyUrls":["https://www.linkedin.com/company/hubspot/"],"includeAffiliates":false,"includeShowcases":false,"includeFundingDetails":true,"language":"en"}' Waits for the run and returns the dataset items (runs over 300 seconds return HTTP 408; start an async run instead).
MCP (AI agents)
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=nimbryxo-studio/linkedin-company-pages-with-funding-and-affiliates",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
} Adds this Actor as a tool in an MCP client that takes a remote server URL (Cursor, VS Code, Claude Code) through Apify's hosted MCP server. OAuth sign-in also works without the header. Clients that only start local servers can wrap the URL with npx mcp-remote.
Open LinkedIn Company Pages with Funding & Affiliates in Apify Store
Routes that work for LinkedIn data
The official route first, then the catalogue Actors that fit this problem (public company and profile pages), by their published fields. Store figures are the publisher's public numbers.
| Route | Core fields | Price / 1K | Success, 30 days | Link |
|---|---|---|---|---|
| Partner onlyLinkedIn APIs (partner programs) | not compared | below | Official docs | |
| LinkedIn Company Pages with Funding & Affiliates | 3/8 | $0.99 | no public runs | Open in Apify Store |
| LinkedIn Company Headcount & Team Directory Scraper | 4/8 | $0.99 | 18 runs, too few to rate | Open in Apify Store |
| LinkedIn Guest-View Profile Data Extractor | 6/8 | $0.99 | 100% of 30 runs | Open in Apify Store |
Official price: Partner pricing is not published as a self-serve rate card. Compare all 27 LinkedIn routes.
Routes that work for LinkedIn Jobs data
The official route first, then the catalogue Actors that fit this problem (public company and profile pages), by their published fields. Store figures are the publisher's public numbers.
| Route | Core fields | Price / 1K | Success, 30 days | Link |
|---|---|---|---|---|
| Partner onlyLinkedIn Talent APIs | not compared | below | Official docs | |
| LinkedIn Jobs Scraper with Salary & Company Enrichment | 6/7 | $0.99 | 4 runs, too few to rate | Open in Apify Store |
Official price: Partner arrangements only; pricing is not public. Compare all 9 LinkedIn Jobs routes.
The facts behind the error
| Fact | Value |
|---|---|
| Not a standard code | RFC 9110 says all valid HTTP status codes are within 100 to 599, so 999 is LinkedIn-specific |
| Official documentation | LinkedIn does not document 999; its API returns 429 when a rate limit is hit |
| Terms | LinkedIn's User Agreement (section 8.2) bans software, scripts, robots and crawlers that scrape or copy the Services |
| Account risk | LinkedIn says members using prohibited software risk having accounts restricted or shut down |
| Official API scope | Open permissions cover only the signed-in member's own name, headline, photo and email, plus posting as that member |
Keep the diagnosis limited to what is documented
The HTTP standard does not include 999 as a valid status, and LinkedIn offers no official explanation for it. Record the response without assigning it a specific cause such as a rate limit.
Separate page requests from API rate limits
LinkedIn documents 429 for rate limiting in its API. A scripted page request returning 999 gives no documented API rate-limit diagnosis, so API retry guidance cannot explain that response.
Match the API to the collection job
Open API permissions cover the signed-in member's own name, headline, photo and email, plus posting as that member. Compare that scope with the intended job before replacing a public company or profile collection process with an API integration.
When to stop fighting the error
Repeated request changes cannot resolve the lack of a documented meaning for 999 or change LinkedIn's stated scraping restrictions. Use the official API when the job fits its open permissions; for broader company or profile collection, seek a permitted source or access arrangement that covers the required information.
Website pages
Questions people ask
Is 999 a standard HTTP status?
It falls outside the valid range defined by the HTTP standard. LinkedIn uses it as a site-specific response.
Does the response prove that a rate limit was reached?
LinkedIn does not document what 999 means. Its official API documents 429 for rate-limit responses.
Can open API permissions retrieve arbitrary public profiles?
Open permissions cover the signed-in member's own specified profile information and posting as that member. Choose an integration based on that scope when assessing profile collection needs.
Can prohibited scraping software affect a LinkedIn account?
LinkedIn says members using prohibited software risk account restrictions or closure. Review its User Agreement and prohibited-software guidance before continuing a scripted collection process.
Sources
Every dated claim on this page comes from the public sources below. Check the source before you make a business decision on it.
- RFC 9110, section 15 — checked 2026-11-11
- LinkedIn User Agreement — checked 2026-11-11
- LinkedIn: prohibited software and extensions — checked 2026-11-11
- LinkedIn API rate limiting — checked 2026-11-11
Get LinkedIn data with a catalogue Actor
LinkedIn Company Headcount & Team Directory Scraper returns 4 of 8 core LinkedIn fields at $0.99 per 1,000 results. Compare all 27 LinkedIn routes, or see LinkedIn Jobs.