{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Salary Scraper — Jobs with Salary, Filter by Pay",
    "description": "Scrape public LinkedIn jobs (search or job URLs) and get pay as numbers - min, max, currency, period, yearly. US jobs also get the official wage levels (DOL, from BLS) for the same job and metro, and which level the pay reaches. Pay not stated is marked, never guessed. Empty runs cost $0. No login.",
    "version": "0.1",
    "x-build-id": "s63J1lel2UFlfyDMi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/northbell~linkedin-jobs-salary-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-northbell-linkedin-jobs-salary-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/northbell~linkedin-jobs-salary-scraper/runs": {
      "post": {
        "operationId": "runs-sync-northbell-linkedin-jobs-salary-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/northbell~linkedin-jobs-salary-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-northbell-linkedin-jobs-salary-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": {
          "jobs": {
            "title": "Job URLs (instead of a search)",
            "type": "array",
            "description": "Paste LinkedIn job URLs or job IDs (e.g. https://www.linkedin.com/jobs/view/4419969671). The search is skipped and each job comes back with its salary as numbers (min, max, currency, yearly) when the posting states pay. Leave empty to search instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Search keywords",
            "type": "string",
            "description": "What to search for, exactly as you would type it into LinkedIn's job search.",
            "default": "software engineer"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, region or country as LinkedIn spells it. US postings state pay most often (pay-transparency laws), so a US location gives the highest fill rate.",
            "default": "United States"
          },
          "companies": {
            "title": "Only at these companies",
            "type": "array",
            "description": "LinkedIn company pages (https://www.linkedin.com/company/stripe/), slugs (stripe) or numeric IDs, up to 20. The search keeps to jobs at these companies (LinkedIn's own company filter). Works with or without keywords. Without a location LinkedIn searches the country it sees the request from (the US), so add a location such as Germany for jobs elsewhere.",
            "items": {
              "type": "string"
            }
          },
          "datePosted": {
            "title": "Posted within",
            "enum": [
              "any",
              "past-24-hours",
              "past-week",
              "past-month"
            ],
            "type": "string",
            "description": "Applied at LinkedIn. Every job read is charged (with Only jobs that state pay on, only the jobs returned), so on a schedule pick the shortest window that still covers the time between runs (Past 24 hours for a daily run, Past week for a weekly one): you pay mostly for new jobs instead of the same ones again, and nothing posted between runs is skipped.",
            "default": "any"
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs paying at least this much per year, in the job's own currency (no exchange-rate conversion: 150000 means 150,000 dollars, euros or yen as the job states it). Hourly and monthly pay is normalized to a yearly figure first (hourly × 2080). A job whose stated top pay reaches the threshold is kept. Jobs with no stated pay cannot be checked, so they are dropped when this is set — the summary reports how many."
          },
          "onlyWithSalary": {
            "title": "Only jobs that state pay",
            "type": "boolean",
            "description": "Drop jobs whose posting does not state a salary. Turned on automatically when you set a minimum salary. Leave off to get every job, each tagged with whether pay was found.",
            "default": false
          },
          "maxJobs": {
            "title": "Jobs to examine",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many jobs to open and read for pay — not how many come back. You are charged per job page opened, so this is your cost ceiling. About 6 in 10 US jobs state pay; filtering returns fewer, so raise this to get more matches. 10 jobs per listing request, plus one request per job.",
            "default": 50
          },
          "geoId": {
            "title": "LinkedIn geoId",
            "type": "string",
            "description": "Optional. LinkedIn's internal location id, taken from a job-search URL. More precise than a location name."
          },
          "includeCompany": {
            "title": "Include company details",
            "type": "boolean",
            "description": "Also read each returned job's public LinkedIn company page and add companyDetails at the end of the row: name, industry, headquarters, founded, website, company type, size band, employees on LinkedIn, followers, specialties, tagline. Each company is read once per run, even when several jobs share it, and only for the jobs that are returned. No extra charge. One reading only: for headcount growth over time, paste the company URLs into LinkedIn Company Scraper — Employee Count & Headcount Growth (northbell/linkedin-company-growth-scraper). Off by default, so existing rows stay exactly as they were.",
            "default": false
          },
          "onlyNew": {
            "title": "Only jobs new since my last run",
            "type": "boolean",
            "description": "For a search you run again (same keywords and location), return only the postings that were not in your previous run. Known postings are not opened and not charged. Every row says isNewSinceLastRun either way; the first run of a search returns everything. Not used with Job URLs.",
            "default": false
          },
          "maxRequestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "Kept polite by default. The budget applies to this run.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}