{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper & Monitor ($0.30/1K)",
    "description": "$0.30 per 1,000 jobs, no login or cookies. Search LinkedIn job postings by keyword and location. Filter by date posted (even past hour), Easy Apply, company, experience level and job type. Optional full descriptions and pay ranges. Monitor mode returns only new jobs, with Discord or Slack alerts.",
    "version": "0.1",
    "x-build-id": "sIgDTNcdcdQZtD5KA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hydedata~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hydedata-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/hydedata~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hydedata-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/hydedata~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hydedata-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": {
          "searchQueries": {
            "title": "Job titles or keywords",
            "type": "array",
            "description": "What to search for, as you'd type it on LinkedIn. Each keyword is a separate search in every location below. LinkedIn's search syntax works: quotes, OR, NOT (e.g. \"data engineer\" OR \"analytics engineer\"). Leave empty to get every job in the locations, e.g. with a company filter.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, states, countries or metro areas, as you'd type them on LinkedIn (e.g. \"Austin, TX\", \"London, United Kingdom\", \"Germany\"). A LinkedIn geoId works too. Leave empty to search worldwide. For remote jobs, add \"remote\" to the keywords instead; \"Remote\" as a location searches worldwide.",
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "LinkedIn job search URLs (advanced)",
            "type": "array",
            "description": "Optional. Run a search on linkedin.com/jobs/search in a private browser window and paste the address. Its keywords, location and filters are kept. Can be used with or instead of keywords.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxJobsPerSearch": {
            "title": "Max jobs per search",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Upper limit of jobs delivered per keyword and location (or per search URL). LinkedIn shows at most 1,000 jobs per search; for more, split it by location or use \"Posted within\".",
            "default": 100
          },
          "postedWithin": {
            "title": "Posted within",
            "enum": [
              "any",
              "hour",
              "day",
              "week",
              "month"
            ],
            "type": "string",
            "description": "Only jobs posted in this window. \"Past hour\" isn't in LinkedIn's menu but works, which makes it the fastest way to catch new postings with a schedule.",
            "default": "any"
          },
          "includeDetails": {
            "title": "Add job details",
            "type": "boolean",
            "description": "For each delivered job, also get the full description (text and HTML), seniority level, employment type, industries, applicant count, Easy Apply or external apply, and the pay range when the posting states one (min, max, currency, per hour or year). Charged per job that gets details. In monitor mode only new jobs are fetched. Recruiter names and profiles are never collected.",
            "default": false
          },
          "easyApplyOnly": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "Only jobs you can apply to on LinkedIn.",
            "default": false
          },
          "under10Applicants": {
            "title": "Under 10 applicants",
            "type": "boolean",
            "description": "Only jobs with fewer than 10 applicants so far.",
            "default": false
          },
          "distanceMiles": {
            "title": "Distance (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Search radius around a city location, e.g. 10, 25, 50 or 100. Leave empty for LinkedIn's default."
          },
          "companyIds": {
            "title": "Company IDs",
            "type": "array",
            "description": "Only jobs at these companies. Use LinkedIn's numeric company ID, found as f_C= in a search URL after picking the company in LinkedIn's Company filter (e.g. 1441 for Google).",
            "items": {
              "type": "string"
            }
          },
          "strictKeywordMatch": {
            "title": "Title must contain the keywords",
            "type": "boolean",
            "description": "Drop jobs whose title doesn't contain every keyword word. LinkedIn fills thin searches with unrelated jobs (a rare keyword in a small city returns dental assistants and arborists), and this keeps only real matches. Leave it off for skill keywords like \"python\" that rarely appear in titles. Dropped jobs aren't charged.",
            "default": false
          },
          "excludeKeywords": {
            "title": "Exclude titles with these words",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words or phrases (e.g. senior, intern, \"sales associate\"). Dropped jobs aren't charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Drop jobs from companies whose name contains any of these (e.g. staffing agencies you don't want). Dropped jobs aren't charged.",
            "items": {
              "type": "string"
            }
          },
          "experienceLevels": {
            "title": "Experience level",
            "type": "array",
            "description": "Only jobs at these seniority levels. LinkedIn's public search ignores this filter, so the Actor checks each job's page; it turns on job details (charged). About 3 in 4 jobs have no level set by the employer, so expect few matches from a general search, or pick \"Not set by employer\" to keep those.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "mid-senior",
                "director",
                "executive",
                "not-applicable"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive",
                "Not set by employer"
              ]
            }
          },
          "jobTypes": {
            "title": "Job type",
            "type": "array",
            "description": "Only jobs of these employment types. LinkedIn's public search ignores this filter, so the Actor checks each job's page; it turns on job details (charged).",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "temporary",
                "internship",
                "volunteer",
                "other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer",
                "Other"
              ]
            }
          },
          "monitorMode": {
            "title": "Monitor mode (new jobs only)",
            "type": "boolean",
            "description": "Remembers what previous runs returned and only outputs jobs you haven't seen. Use with a Schedule. The first run returns everything as the baseline. Jobs seen before are never charged again.",
            "default": false
          },
          "notifyWebhookUrl": {
            "title": "Send new jobs to a webhook (optional)",
            "type": "string",
            "description": "Paste a Discord or Slack incoming webhook URL to get each run's jobs as a message with title, company, location, pay and link. Any other URL gets the jobs as JSON. Only sent when the run delivers something, so quiet monitor runs stay silent."
          },
          "stateStoreName": {
            "title": "Monitor state store name",
            "type": "string",
            "description": "Named key-value store that keeps monitor memory between runs. Use different names to run independent monitors.",
            "default": "linkedin-jobs-monitor-state"
          },
          "stateRetentionDays": {
            "title": "Forget jobs after (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Jobs not seen for this many days are dropped from monitor memory.",
            "default": 30
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify datacenter proxies work for LinkedIn's public job pages. Switch to RESIDENTIAL only if runs keep getting rate-limited.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}