{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper — Filters That Actually Work",
    "description": "Scrape public LinkedIn jobs where every filter is actually applied. LinkedIn silently ignores its own experience and workplace filters (\"worktype is not working\"). This Actor applies experience from LinkedIn's real values and offers an honest keyword filter instead of a fake workplace one. No login.",
    "version": "0.1",
    "x-build-id": "UXDW0y9XVlvXD8IYH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/northbell~linkedin-jobs-filter-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-northbell-linkedin-jobs-filter-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-filter-scraper/runs": {
      "post": {
        "operationId": "runs-sync-northbell-linkedin-jobs-filter-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-filter-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-northbell-linkedin-jobs-filter-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": "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 — \"United States\", \"Berlin, Germany\". Applied at LinkedIn and verified against every result.",
            "default": "United States"
          },
          "datePosted": {
            "title": "Posted within",
            "enum": [
              "any",
              "past-24-hours",
              "past-week",
              "past-month"
            ],
            "type": "string",
            "description": "Applied at LinkedIn. Every run checks the returned postings' real dates against this and reports whether it was honored.",
            "default": "any"
          },
          "titleIncludes": {
            "title": "Job title must contain these words",
            "type": "array",
            "description": "Keep only jobs whose TITLE contains one of these words — e.g. \"manager\", \"senior\", \"backend\". Unlike the description filter below, this looks at the job title only, so \"engineer\" won't match jobs that merely mention engineering in the body. The title is on the listing, so this filter is applied without opening the job page — it costs nothing extra.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExcludes": {
            "title": "Job title must NOT contain these words",
            "type": "array",
            "description": "Drop jobs whose title contains one of these words — e.g. \"senior\", \"intern\", \"manager\". Also free (title is on the listing).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleMode": {
            "title": "How to match the title words",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "\"Any\" keeps a job if the title contains at least one word. \"All\" requires every word.",
            "default": "any"
          },
          "seniority": {
            "title": "Experience level — actually applied, not just sent",
            "type": "array",
            "description": "LinkedIn's public search accepts an experience filter and then ignores it. This Actor applies it for real, by reading LinkedIn's own value on each job page. One or more of: Internship, Entry level, Associate, Mid-Senior level, Director, Executive. NOTE: only about 4 in 10 public jobs carry this value; jobs where LinkedIn left it blank are dropped and counted separately, so a narrow filter returns fewer jobs. Raise \"Jobs to examine\" to get more matches.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "employmentType": {
            "title": "Employment type — actually applied",
            "type": "array",
            "description": "Applied for real from LinkedIn's own value on each job page. One or more of: Full-time, Part-time, Contract, Temporary, Volunteer, Internship, Other. Note: most public postings are Full-time, so this rarely narrows much.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mustMention": {
            "title": "Must mention these words (in title or description)",
            "type": "array",
            "description": "Keep only jobs whose title or description contains one of these words — e.g. \"remote\", \"telework\", \"visa\", \"no agencies\". This is an honest TEXT filter, not a claim about the job: a post saying \"not remote\" contains the word \"remote\" and will match. Use it to narrow, then read. Because LinkedIn's public data cannot tell remote from on-site reliably, this word filter is offered instead of a fake workplace filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mentionMode": {
            "title": "How to match the words above",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "\"Any\" keeps a job if it mentions at least one of the words. \"All\" keeps it only if every word appears.",
            "default": "any"
          },
          "mustNotMention": {
            "title": "Exclude jobs mentioning these words",
            "type": "array",
            "description": "Drop any job whose title or description contains one of these words — e.g. \"agency\", \"recruiter\", \"unpaid\", \"clearance\". The honest inverse of the word filter above; the summary reports how many were dropped this way.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude these companies",
            "type": "array",
            "description": "Drop jobs from these companies — match by company name or LinkedIn slug (\"Acme\", \"acme-inc\"). Useful for removing your own company, competitors, or staffing agencies. Applied on the listing, so it costs no extra request.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Open each job page for full fields",
            "type": "boolean",
            "description": "Opening the job page adds seniority, employment type, job function, industries and the full description — one extra request per job. It is turned on automatically whenever you set any filter above (a filter cannot be applied without it). Turn it off only for a cheap listing-only run with no filtering.",
            "default": true
          },
          "maxJobs": {
            "title": "Jobs to examine",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many jobs to EXAMINE — not how many come back. You are charged per job page opened, so this is your cost ceiling. With a filter on, fewer jobs match and come back; raise this to get more matches. 10 jobs per listing request, plus one request per job examined.",
            "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 when you need one exact region."
          },
          "maxRequestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "Kept polite by default. The budget is shared across your runs of this Actor, so parallel runs do not stack up.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}