{
  "openapi": "3.0.1",
  "info": {
    "title": "Web Developer Jobs Scraper — LinkedIn, HN, RemoteOK + 7 More",
    "description": "Scrape developer jobs from 10 boards in one ~90s run: LinkedIn, RemoteOK, Remotive, WeWorkRemotely, Built In, JustJoin.it, NoFluffJobs, Hacker News, Y Combinator, WTTJ, InfoJobs, Tecnoempleo. URL-deduped, with structured salary, remote, seniority and skills. One bill, no child-actor fees.",
    "version": "0.1",
    "x-build-id": "JvkKX5dPqfQb8tlEL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nomad-agent~web-dev-bundle/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nomad-agent-web-dev-bundle",
        "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/nomad-agent~web-dev-bundle/runs": {
      "post": {
        "operationId": "runs-sync-nomad-agent-web-dev-bundle",
        "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/nomad-agent~web-dev-bundle/run-sync": {
      "post": {
        "operationId": "run-sync-nomad-agent-web-dev-bundle",
        "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": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which boards to include. Leave empty to run the full default set. All sources are scraped inside this Actor's own run and billed only at this bundle's pricing — no separate child-actor fees. Fewer sources means a faster, cheaper run.",
            "items": {
              "type": "string",
              "enum": [
                "linkedin",
                "remote_boards",
                "builtin",
                "justjoinit",
                "nofluffjobs",
                "hackernews",
                "ycombinator_was",
                "wttj",
                "infojobs",
                "tecnoempleo"
              ]
            },
            "default": [
              "linkedin",
              "remote_boards",
              "builtin",
              "justjoinit",
              "nofluffjobs",
              "hackernews",
              "ycombinator_was",
              "wttj",
              "infojobs",
              "tecnoempleo"
            ]
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Legacy single search term. Prefer Keywords below for broader searches. Forwarded only to boards that support free-text search; RUN-SUMMARY explicitly marks category-only boards instead of pretending they honored it."
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "One or more searches, e.g. React, TypeScript, frontend engineer. Array-aware boards receive all terms together; single-query boards are queried once per term with the per-source cap divided fairly. Leave empty for the bundle's developer-role defaults.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "City / province / location",
            "type": "string",
            "description": "Native geographic filter where supported: LinkedIn location, JustJoin.it city, and InfoJobs/Tecnoempleo province. Use Country codes for WTTJ."
          },
          "countryCodes": {
            "title": "Country codes (WTTJ)",
            "type": "array",
            "description": "ISO two-letter country codes forwarded to Welcome to the Jungle, e.g. ES, FR, DE.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Fully remote only",
            "type": "boolean",
            "description": "Ask every source with a native remote filter for remote roles, then enforce the normalized isRemote=true field across the merged output. Hybrid and unknown arrangements are excluded.",
            "default": false
          },
          "titleExclude": {
            "title": "Exclude titles containing",
            "type": "array",
            "description": "Forward these exclusions to boards that support them, e.g. intern, sales, unpaid.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "experienceLevels": {
            "title": "Experience levels (JustJoin.it)",
            "type": "array",
            "description": "Native JustJoin.it experience levels such as junior, mid, senior, manager or c_level.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxExperienceYears": {
            "title": "Maximum experience years (WTTJ)",
            "type": "integer",
            "description": "Keep WTTJ postings that require at most this many years. Leave empty to disable."
          },
          "includeDetails": {
            "title": "Legacy detail toggle (ignored)",
            "type": "boolean",
            "description": "Deprecated compatibility input. Every emitted job always includes its complete description; false is ignored.",
            "default": true
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "type": "integer",
            "description": "Recency filter: only return postings no older than this many days. Forwarded to each child under its own recency parameter (most take days, Hacker News takes hours — mapped automatically). Two sources with no recency input (Y Combinator, WTTJ) return their normal window. Listings with no known posting date are kept, not dropped. Set 0 to disable.",
            "default": 0
          },
          "candidateProfile": {
            "title": "Candidate profile (optional AI ranking)",
            "type": "string",
            "description": "Paste a resume/profile summary with skills, seniority, location, work authorization and must-haves. When supplied, every job receives matchScore (0-10), matchReason and mismatchReason from an LLM. Requires one API key below. Matching is prompt-driven; the bundle does not use brittle keyword score rules."
          },
          "preferences": {
            "title": "Candidate preferences",
            "type": "string",
            "description": "Optional prose or JSON describing preferred roles, locations, salary, exclusions and hard constraints."
          },
          "minimumMatchScore": {
            "title": "Minimum match score",
            "type": "integer",
            "description": "When candidate matching is enabled, omit jobs scored below this 0-10 threshold. Set 0 to keep all jobs ranked best-first.",
            "default": 0
          },
          "aiProvider": {
            "title": "AI provider",
            "enum": [
              "anthropic",
              "mistral",
              "openai"
            ],
            "type": "string",
            "description": "Provider used only for candidate matching. If omitted, inferred from the supplied key."
          },
          "aiModel": {
            "title": "AI model override",
            "type": "string",
            "description": "Optional provider model ID. Leave empty for the bundle's low-cost default."
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Secret Anthropic key used only when candidate matching selects Anthropic."
          },
          "mistralApiKey": {
            "title": "Mistral API key",
            "type": "string",
            "description": "Secret Mistral key used only when candidate matching selects Mistral."
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "Secret OpenAI key used only when candidate matching selects OpenAI."
          },
          "maxItemsPerSource": {
            "title": "Max items per source",
            "type": "integer",
            "description": "Cap on items fetched from EACH child board before merging. Raise it for a deeper sweep of every board; the merged total is still bounded by 'Max items (total)' below.",
            "default": 36
          },
          "maxItems": {
            "title": "Max items (total)",
            "type": "integer",
            "description": "Hard cap on the merged, deduped output — and therefore on what you pay, since this Actor charges per unique job returned. Default (360) is sources × 'Max items per source'. Set 0 to remove the cap — cost then scales with every source's raw output.",
            "default": 360
          },
          "cacheTtlSeconds": {
            "title": "Cache time (seconds)",
            "type": "integer",
            "description": "How long to reuse results already fetched from a source instead of fetching again. Set 0 to always fetch fresh data.",
            "default": 1800
          },
          "concurrency": {
            "title": "Concurrency",
            "type": "integer",
            "description": "How many source boards to fetch at the same time. The default fetches them all at once, so a run takes as long as the slowest board rather than the sum.",
            "default": 10
          },
          "runTimeoutSecs": {
            "title": "Per-source timeout (seconds)",
            "type": "integer",
            "description": "How long to wait for each source before giving up on it. Sources run in parallel, so this is a per-source ceiling, not a budget shared across them.",
            "default": 300
          },
          "apifyToken": {
            "title": "Apify API token",
            "type": "string",
            "description": "Leave empty — injected automatically when this Actor runs on the Apify platform. Only set this when running the code outside the platform, e.g. on your own machine."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}