{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper - Salary, Recruiter & Company ($0.5/1k)",
    "description": "Scrape LinkedIn jobs by keyword, location & filters, or any LinkedIn search URL - no login or cookies. Get salary, seniority, applicant count, recruiter contact, and full descriptions in text, Markdown & HTML. Optional company details; beat the ~1,000 cap. Pay per result. MCP & AI-agent ready.",
    "version": "0.0",
    "x-build-id": "NnE7iJFlWwtzNqJte"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/harshmaur~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-harshmaur-linkedin-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/harshmaur~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-harshmaur-linkedin-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/harshmaur~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-harshmaur-linkedin-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "keywords": {
            "title": "Job title / keywords",
            "type": "string",
            "description": "What to search for, e.g. \"software engineer\", \"product manager\", \"registered nurse\". Leave empty if you are only using Search URLs below."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, state, country, or region — e.g. \"New York, NY\", \"United States\", \"London\", \"Remote\". Leave empty to search worldwide."
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "",
              "1",
              "7",
              "30"
            ],
            "type": "string",
            "description": "Only return jobs posted within this window.",
            "default": ""
          },
          "workplaceType": {
            "title": "Workplace type",
            "enum": [
              "",
              "on-site",
              "remote",
              "hybrid"
            ],
            "type": "string",
            "description": "On-site, remote, or hybrid roles.",
            "default": ""
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "",
              "full-time",
              "part-time",
              "contract",
              "temporary",
              "internship"
            ],
            "type": "string",
            "description": "Employment type.",
            "default": ""
          },
          "experienceLevel": {
            "title": "Experience level",
            "enum": [
              "",
              "internship",
              "entry",
              "associate",
              "mid-senior",
              "director",
              "executive"
            ],
            "type": "string",
            "description": "Seniority of the role.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "",
              "recent"
            ],
            "type": "string",
            "description": "Order results by relevance (LinkedIn default) or most recent.",
            "default": ""
          },
          "startUrls": {
            "title": "Search URLs",
            "type": "array",
            "description": "Paste one or more LinkedIn job search URLs to scrape directly (e.g. a filtered search you built on linkedin.com/jobs). The fields above do NOT apply to these — they are scraped as-is, then paginated.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxItems": {
            "title": "Max jobs",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of job listings to scrape across all searches and URLs. LinkedIn caps a single search at ~1000 results. Set 0 for no limit (stops when LinkedIn runs out of results).",
            "default": 50
          },
          "scrapeDetails": {
            "title": "Scrape full job details",
            "type": "boolean",
            "description": "Open each job's page to fetch the full description, seniority, employment type, job function, industries, applicant count, salary, and the job poster (recruiter) contact. Disable for a faster, cheaper run that returns just the search-card fields (title, company, location, posted date, logo, URL).",
            "default": true
          },
          "scrapeCompany": {
            "title": "Scrape company details",
            "type": "boolean",
            "description": "Also fetch each company's LinkedIn page for its description, website, employee count, and headquarters. Adds one request per unique company (results are cached, so shared employers are fetched once). Off by default.",
            "default": false
          },
          "splitByLocation": {
            "title": "Split by location (get more than ~1,000)",
            "type": "boolean",
            "description": "LinkedIn caps any single search at ~1,000 results. Enable this to fan the keyword search out across the chosen country's major metro areas (this replaces the Location field above), collecting far more than 1,000 jobs. Results are de-duplicated across cities.",
            "default": false
          },
          "splitCountry": {
            "title": "Split country",
            "enum": [
              "us",
              "uk",
              "ca",
              "au",
              "in",
              "de",
              "fr",
              "nl",
              "es",
              "ie",
              "ae",
              "sg",
              "br"
            ],
            "type": "string",
            "description": "When 'Split by location' is on, the country whose major metro areas the search is fanned out across.",
            "default": "us"
          },
          "mcpConnector": {
            "title": "Send results to an app (MCP connector)",
            "type": "string",
            "description": "Pick an authorized MCP connector (Slack, Notion, Airtable, Google Sheets, …) to receive the scraped jobs. This is the recommended, secure path — your credentials stay in Apify and are never exposed to this actor (Apify's proxy injects them). Leave empty to scrape only. Tip: schedule this actor with a recent 'Date posted' filter to get pinged whenever a matching job is posted."
          },
          "mcpMode": {
            "title": "Delivery mode",
            "enum": [
              "perPost",
              "summary"
            ],
            "type": "string",
            "description": "perPost: send one message/record per scraped job. summary: send a single digest of the whole run.",
            "default": "perPost"
          },
          "mcpTarget": {
            "title": "Target page / database / channel",
            "type": "string",
            "description": "Where to write — the destination ID the tool needs: a Notion database/page ID, a Google Sheet ID, or a Slack channel. Leave blank for connectors that post to a default location. Advanced shapes go in Arguments JSON below."
          },
          "mcpMessage": {
            "title": "Message template",
            "type": "string",
            "description": "Template for each message. Use {{field}} placeholders from ANY job field — common ones: {{title}}, {{company}}, {{location}}, {{url}}, {{postedAt}}, {{salary}}, {{employmentType}}, {{seniorityLevel}}, {{applyUrl}}. (Full field list in the README.) Missing fields render empty.",
            "default": "*{{title}}* — {{company}}\n{{location}}\n{{url}}"
          },
          "mcpTool": {
            "title": "Tool override (advanced)",
            "type": "string",
            "description": "Force a specific tool name on the connector (e.g. send_message, create_page, append_row). Leave empty to auto-detect the connector's write/notify tool."
          },
          "mcpArguments": {
            "title": "Tool arguments override (advanced)",
            "type": "object",
            "description": "Extra/override arguments merged into each tool call as JSON — e.g. {\"channel\": \"#jobs\"} for Slack. {{field}} placeholders work inside string values too, so you can nest live data into any shape the tool needs — e.g. Notion: {\"properties\": {\"Title\": {\"title\": [{\"text\": {\"content\": \"{{title}}\"}}]}, \"Link\": {\"url\": \"{{url}}\"}}}. Use it to satisfy required fields or fully control the payload."
          },
          "mcpMaxItems": {
            "title": "Max jobs to send",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Safety cap on how many jobs are piped to the connector per run (perPost mode). Protects against flooding the destination.",
            "default": 50
          },
          "mcpServerUrl": {
            "title": "MCP server URL (dev / diagnostic)",
            "type": "string",
            "description": "Advanced/testing only. Connect directly to a raw MCP server URL, bypassing the MCP Connector above. For real use prefer a connector — with a connector your credentials stay in Apify and are never seen by this actor. When set, this overrides the connector."
          },
          "mcpServerToken": {
            "title": "MCP server token (dev / diagnostic)",
            "type": "string",
            "description": "Bearer token for the dev MCP server URL above. Note: a token entered here IS visible to the actor at runtime — for production use an MCP Connector instead, so credentials never leave Apify. Ignored unless the URL is set."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}