{
  "openapi": "3.0.1",
  "info": {
    "title": "EngineerHub.in Jobs Scraper",
    "description": "[💰 $3 / 1K] Extract engineering jobs and internships from EngineerHub.in — title, company, salary and experience ranges, skills, work model, location, apply link and dates. Filter by keyword, skill, location, work model, freshers-only or date posted.",
    "version": "1.0",
    "x-build-id": "9EX3NHz05nAsu71Xy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/solidcode~engineerhub-in-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-solidcode-engineerhub-in-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/solidcode~engineerhub-in-scraper/runs": {
      "post": {
        "operationId": "runs-sync-solidcode-engineerhub-in-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/solidcode~engineerhub-in-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-solidcode-engineerhub-in-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": {
          "opportunityTypes": {
            "title": "What to Collect",
            "uniqueItems": true,
            "type": "array",
            "description": "Choose whether to collect jobs, internships, or both. Leave empty to collect both.",
            "items": {
              "type": "string",
              "enum": [
                "Job",
                "Internship"
              ],
              "enumTitles": [
                "Jobs",
                "Internships"
              ]
            }
          },
          "searchKeyword": {
            "title": "Search Keyword",
            "type": "string",
            "description": "Word or phrase to look for in the job title, company name, skills and description (e.g. 'backend developer', 'data analyst', 'mechanical'). Matching is case-insensitive. Leave blank to collect everything."
          },
          "skills": {
            "title": "Skills",
            "uniqueItems": true,
            "type": "array",
            "description": "Only keep listings tagged with at least one of these skills (e.g. 'Python', 'AWS', 'AutoCAD'). Matching is case-insensitive and partial, so 'java' also matches 'JavaScript'. Every listing on EngineerHub carries skill tags today, so in practice nothing is lost to missing data — and if an untagged listing ever does turn up, the run log says how many were left out. Leave empty to include every skill.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Only keep listings whose city, state or country contains this text (e.g. 'Bangalore', 'KA', 'Pune'). States and countries are stored as 2-letter codes, so use 'IN' rather than 'India'. Around 1 in 4 job listings has no location published at all and is left out whenever you set this filter. Leave blank for anywhere."
          },
          "workModels": {
            "title": "Work Model",
            "uniqueItems": true,
            "type": "array",
            "description": "Only keep listings with these work arrangements. 'Remote' also matches listings published as 'WFH'. About 1 in 7 job listings puts a city name in the work-model field instead of a real arrangement — those are excluded whenever you set this filter. Leave empty to include all.",
            "items": {
              "type": "string",
              "enum": [
                "onsite",
                "remote",
                "hybrid"
              ],
              "enumTitles": [
                "On-site",
                "Remote (incl. WFH)",
                "Hybrid"
              ]
            }
          },
          "freshersOnly": {
            "title": "Freshers Only",
            "type": "boolean",
            "description": "Turn on to keep only listings marked as open to freshers (no prior experience required). Around 1,200 of EngineerHub's ~8,300 jobs carry this flag. Note that EngineerHub never applies it to internships, so combining this with 'Internships' returns nothing from that feed."
          },
          "maxExperienceYears": {
            "title": "Maximum Experience Required",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Only keep listings that ask for at most this many years of experience. For example, 2 returns roles asking for 0–2 years and drops senior roles. About 7 in 10 jobs publish an experience requirement — the rest, and every internship, do not state one and are always kept rather than dropped. Leave empty for any experience level."
          },
          "openOnly": {
            "title": "Still Accepting Applications",
            "type": "boolean",
            "description": "Turn on to keep only listings whose application deadline has not passed yet. Be aware this is drastic: EngineerHub keeps publishing listings long after their stated deadline, so at any given moment only about 45 of its ~8,300 jobs and about 19 of its ~1,150 internships still have a deadline in the future. Expect a handful of rows, not hundreds. Leave it off to receive every listing the board is showing and use the 'applicationDeadline' output field to judge for yourself."
          },
          "postedWithin": {
            "title": "Posted Within",
            "enum": [
              "",
              "1",
              "3",
              "7",
              "14",
              "30"
            ],
            "type": "string",
            "description": "Only keep listings published within this time window. Listings arrive newest-first, so the run stops early once it reaches older postings — ideal for scheduled daily or weekly runs. About 1 in 11 job listings has no publication date and cannot be placed in a window, so those are left out whenever any date filter is set. Ignored when you set exact dates below."
          },
          "postedFrom": {
            "title": "Posted From (date)",
            "type": "string",
            "description": "Only keep listings posted on or after this date, in YYYY-MM-DD format (e.g. 2026-01-31). Takes precedence over 'Posted within'. Set this and 'Posted to' to the same day to collect a single day. Listings with no publication date (about 1 in 11 jobs) are left out when this is set."
          },
          "postedTo": {
            "title": "Posted To (date)",
            "type": "string",
            "description": "Only keep listings posted on or before this date, in YYYY-MM-DD format (e.g. 2026-02-28), the whole day included. Takes precedence over 'Posted within'. Listings with no publication date (about 1 in 11 jobs) are left out when this is set."
          },
          "maxResults": {
            "title": "Maximum Results",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on how many listings to collect in total. Default 100 — increase for bigger runs, or set to 0 to collect everything that matches your filters (an internal safety bound of 20,000 listings still applies, far above the ~9,500 listings on the board). Listings are read 60 at a time and a page already being read is always finished rather than thrown away, so your final count can exceed this number by up to roughly one page (about 60 listings). No further pages are requested once the cap is reached, including when you use the filters that are applied after collection. Negative or non-numeric values are rejected and the default of 100 is used instead — they never mean 'collect everything'."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}