# EngineerHub.in Jobs Scraper (`solidcode/engineerhub-in-scraper`) Actor

\[💰 $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.

- **URL**: https://apify.com/solidcode/engineerhub-in-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## EngineerHub.in Jobs Scraper

Pull engineering jobs and internships from EngineerHub.in at scale — titles, companies, structured salary and experience ranges, skill tags, work model, location, application windows, apply links, and per-listing view and click counts. One run can return a handful of today's postings or the entire 9,465-listing board. Built for technical recruiters, campus placement teams, and job-board operators who need India's engineering hiring market as clean structured rows instead of an endless scroll of cards.

### Why This Scraper?

- **Jobs *and* internships — 9,465 listings in total** — 8,309 engineering jobs plus 1,156 internships. Most EngineerHub extractors return jobs only; the internship feed is 1,156 openings you would otherwise have to collect by hand.
- **Structured salary, not one opaque text blob** — `salaryMin`, `salaryMax`, `salaryUnit` (LPA for jobs, monthly CTC stipend for internships), `salaryType` and `salaryDisclosed` ship as separate fields, so you can sort, band, and average pay without parsing strings.
- **Experience as numbers** — `experienceMin` and `experienceMax` in years, plus a maximum-experience filter that isolates 0–2-year roles across the whole board in a single run.
- **Skill tags on every single listing** — up to 19 named skills per row (Python, AWS, AutoCAD, CI/CD, Solidworks…), with an any-match skills filter over them. Every listing on the board carries tags today, averaging 5 skills per job.
- **Keyword search that reads the full job description** — EngineerHub's own search box only matches job title and company name. This scraper matches title, company, skill tags **and** the complete description text, so "Kubernetes" finds the roles that only mention it in the requirements.
- **Fresher hiring signals built in** — an `isForFreshers` flag on roughly 1,200 of the 8,309 jobs, plus `eligibility`, the published minimum CGPA cutoff (5.0–8.5) where the employer set one.
- **Demand signals no job board publishes** — per-listing `views` and `clicks` counts let you rank roles by real candidate interest instead of by posting date.
- **No free-tier ceiling** — take 60 rows or the entire 9,465-listing catalogue in a single run. The only cap is the one you set; comparable extractors stop free users at 20 jobs.
- **Application windows, not just post dates** — `applicationStartDate`, `applicationDeadline` and a computed `isOpen` flag on every row, plus a still-accepting-applications filter for live vacancies only.

### Use Cases

**Recruitment & Talent Sourcing**
- Build target-company lists by skill — every listing tagged with AWS, React, or Solidworks in one pull
- Track which employers are hiring for 0–2 years of experience right now
- Monitor competitor headcount signals by watching a company's posting volume over time
- Surface roles with `openings` counts above 1 for bulk-hiring drives

**Campus Hiring & Student Placement**
- Filter to the 1,156-listing internship feed with duration in months and paid/unpaid status
- Pull freshers-only roles for final-year placement cells
- Use the published CGPA cutoff in `eligibility` to match students to roles they qualify for
- Track application deadlines so students never see an expired posting

**Job Board & Aggregator Content**
- Refresh your own board daily with the last 24 hours of engineering postings
- Keep normalized company logos, websites, and apply links alongside each role
- Split jobs and internships into separate feeds on your site
- De-duplicated rows keyed on the listing ID, ready for direct upsert

**Salary & Skills Market Research**
- Chart LPA bands by city, state, and years of experience
- Rank the most-demanded skills across 8,309 engineering jobs
- Compare on-site, hybrid, and remote pay for the same job titles
- Measure internship stipends by domain and duration

**Career Tools & Alerting**
- Power a daily digest of new remote roles matching a saved skill list
- Alert candidates when a role in their city crosses a salary threshold
- Rank recommendations by view and click counts to show what is actually competitive
- Feed a resume-matching engine with full plain-text descriptions

### Getting Started

#### Latest Engineering Jobs

The simplest run — the most recent postings, newest first:

```json
{
    "opportunityTypes": ["Job"],
    "maxResults": 100
}
````

#### Remote Roles for Freshers, by Skill

```json
{
    "opportunityTypes": ["Job"],
    "skills": ["Python", "AWS"],
    "workModels": ["remote"],
    "freshersOnly": true,
    "maxResults": 500
}
```

#### Full Board, Filtered by City and Date Window

```json
{
    "opportunityTypes": ["Job", "Internship"],
    "searchKeyword": "backend developer",
    "location": "Bangalore",
    "workModels": ["onsite", "hybrid"],
    "maxExperienceYears": 3,
    "postedWithin": "7",
    "maxResults": 0
}
```

Setting `maxResults` to `0` collects everything that matches your filters — `location: "Bangalore"` alone returns 2,444 jobs, and the internship feed drains to exactly 1,156 rows.

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `opportunityTypes` | array | `Jobs` | Which feeds to collect: **Jobs**, **Internships**, or both. Leave empty for both. |
| `searchKeyword` | string | `""` | Word or phrase matched against job title, company name, skill tags and the full description. Case-insensitive. |
| `skills` | array | `[]` | Keep listings tagged with at least one of these skills (e.g. `Python`, `AWS`, `AutoCAD`). Case-insensitive and partial, so `java` also matches `JavaScript`. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `location` | string | `""` | Keep listings whose city, state or country contains this text. States and countries are 2-letter codes, so use `IN` rather than `India`. |
| `workModels` | array | `[]` | `On-site`, `Remote (incl. WFH)`, or `Hybrid`. Leave empty to include all. |
| `freshersOnly` | boolean | `false` | Keep only listings marked open to freshers — around 1,200 of the 8,309 jobs. |
| `maxExperienceYears` | integer | — | Keep listings asking for at most this many years. `2` returns roles wanting 0–2 years and drops senior openings. |
| `openOnly` | boolean | `false` | Keep only listings whose application deadline is still in the future. |
| `postedWithin` | string | `Any time` | `Last 24 hours`, `Last 3 days`, `Last 7 days`, `Last 14 days`, or `Last 30 days`. Ignored when exact dates are set. |
| `postedFrom` | string | `""` | Keep listings posted on or after this date (`YYYY-MM-DD`). Takes precedence over `postedWithin`. |
| `postedTo` | string | `""` | Keep listings posted on or before this date (`YYYY-MM-DD`), the whole day included. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Total cap on collected listings. Set to `0` to collect everything matching your filters, up to a 20,000-listing safety bound. Listings are read 60 at a time, so a run can finish up to about one page above your cap. |

### Output

Every listing becomes one flat row. Example job:

```json
{
    "jobId": "6a619342b7a1e1d85eee8ca3",
    "opportunityType": "Job",
    "title": "Software Engineer Full Stack",
    "companyName": "Lowe's India",
    "companyLogo": "https://engineerhubs3.s3.ap-south-1.amazonaws.com/backend/company/hiring/lowes_india.jpg",
    "companyWebsite": null,
    "city": "Bangalore Urban",
    "state": "KA",
    "country": "IN",
    "location": "Bangalore Urban, KA, IN",
    "workModel": "On-Site",
    "employmentType": "Full Time",
    "salaryMin": 13,
    "salaryMax": 18,
    "salaryUnit": "LPA",
    "salaryType": "Range",
    "salaryText": "13 - 18 LPA",
    "salaryDisclosed": true,
    "experienceMin": 2,
    "experienceMax": 3,
    "isForFreshers": false,
    "skills": ["SDLC", "DevOps", "Problem Solving"],
    "openings": null,
    "eligibility": null,
    "descriptionText": "Design and deliver full-stack features across the retail platform...",
    "applyLink": "https://talent.lowes.com/in/en/job/JR-02561638/Software-Engineer-Full-Stack",
    "postedAt": "2026-07-23T04:06:26.146Z",
    "applicationStartDate": "2026-07-23T00:00:00.000Z",
    "applicationDeadline": "2026-07-31T00:00:00.000Z",
    "isOpen": true,
    "views": 2428,
    "clicks": 33,
    "sourceUrl": "https://www.engineerhub.in/career/jobs/6a619342b7a1e1d85eee8ca3",
    "scrapedAt": "2026-07-24T09:12:04.881Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Unique EngineerHub listing ID — stable key for upserts |
| `opportunityType` | string | `Job` or `Internship` |
| `title` | string | Role title as published |
| `companyName` | string | Hiring organisation |
| `applyLink` | string | External application URL (empty on apply-on-platform listings) |
| `sourceUrl` | string | Listing page on EngineerHub |
| `scrapedAt` | string | ISO timestamp of collection |

#### Company & Location

| Field | Type | Description |
|-------|------|-------------|
| `companyLogo` | string | Company logo image URL |
| `companyWebsite` | string | Company website when published |
| `city` | string | City |
| `state` | string | State code, e.g. `KA`, `MP` |
| `country` | string | Country code, e.g. `IN` |
| `location` | string | Ready-to-display `city, state, country` |
| `workModel` | string | `On-Site`, `Hybrid`, `WFH` or `Remote` as published |
| `employmentType` | string | `Full Time`, `Part Time`, `In Office`, `Remote` or `Hybrid` |

#### Salary & Experience

| Field | Type | Description |
|-------|------|-------------|
| `salaryMin` | number | Lower bound of the published range |
| `salaryMax` | number | Upper bound of the published range |
| `salaryUnit` | string | `LPA` (annual lakhs, jobs) or `CTC` (monthly stipend, internships) |
| `salaryType` | string | `Range` or `Fixed` |
| `salaryText` | string | Ready-to-display salary line, or the employer's own disclosure text |
| `salaryDisclosed` | boolean | Whether the employer chose to show pay |
| `experienceMin` | number | Minimum years of experience required |
| `experienceMax` | number | Maximum years of experience |

#### Requirements & Description

| Field | Type | Description |
|-------|------|-------------|
| `isForFreshers` | boolean | Open to candidates with no prior experience |
| `skills` | array | Named skill tags, up to 19 per listing |
| `openings` | number | Number of positions when published |
| `eligibility` | number | Minimum CGPA cutoff (5.0–8.5) when set by the employer |
| `description` | string | Full description exactly as published, formatting preserved |
| `descriptionText` | string | Same description as clean plain text, ready for search and matching |

#### Dates & Engagement

| Field | Type | Description |
|-------|------|-------------|
| `postedAt` | string | ISO publication timestamp |
| `applicationStartDate` | string | ISO date applications open |
| `applicationDeadline` | string | ISO date applications close |
| `isOpen` | boolean | `true` when the deadline is still in the future |
| `views` | number | How many times the listing was viewed |
| `clicks` | number | How many times candidates clicked through to apply |
| `isFeatured` | boolean | Promoted listing — EngineerHub sets this on only a handful of postings |

#### Internship-Only Fields

| Field | Type | Description |
|-------|------|-------------|
| `durationMonths` | string | Duration in months, e.g. `3` or `3-6` |
| `isPaid` | boolean | Whether the internship pays a stipend |
| `domain` | string | Internship domain, e.g. `Software Development`, `Mechanical` |

### Tips for Best Results

- **Set `maxResults` to `0` for full-market pulls.** The whole board — 8,309 jobs and 1,156 internships — comes back in one run, so there is no reason to page through it in small batches.
- **`openOnly` is strict, and deliberately so.** EngineerHub keeps publishing roles long after their stated deadline, so only about 45 of the 8,309 jobs currently have a deadline in the future. Leave it off and judge for yourself using `applicationDeadline`, or turn it on when you specifically want live-only vacancies.
- **`freshersOnly` applies to jobs, not internships.** EngineerHub never sets the freshers flag on internship listings, so pairing that filter with the internship feed alone returns nothing. Select `Job` — or both feeds — when you use it.
- **The experience filter is inclusive by design.** Listings that do not state an experience requirement (about 3 in 10 jobs, and every internship) are kept rather than dropped, so a `maxExperienceYears` of `2` will not silently hide junior roles that simply left the field blank.
- **Use 2-letter codes for state and country.** Locations are stored as `KA`, `MP`, `IN` — searching `India` returns nothing, while `IN` returns the whole country.
- **Never compare `salaryMin` across types.** Jobs are quoted in LPA (annual lakhs) and internships in monthly CTC stipends. Group by `salaryUnit` before averaging, or you will mix two different scales.
- **Schedule with `postedWithin` for daily refreshes.** Listings arrive newest-first, so a `Last 24 hours` run stops as soon as it reaches older postings — the cheapest way to keep a board or alert feed current.

### Pricing

**From $3.00 per 1,000 results** — around 25% below the going rate for EngineerHub data, with internships included at no extra cost. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.36 | $0.34 | $0.32 | $0.30 |
| 1,000 | $3.60 | $3.40 | $3.20 | $3.00 |
| 10,000 | $36.00 | $34.00 | $32.00 | $30.00 |
| 100,000 | $360.00 | $340.00 | $320.00 | $300.00 |

A "result" is one listing row in your dataset. **No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.**

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom endpoints on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This scraper is built for legitimate recruitment research, campus placement, labour-market analysis, and job-aggregation use. You are responsible for complying with applicable laws and EngineerHub.in's Terms of Service. Contact details published by employers are excluded from the output by design — do not use collected data for spam, harassment, or any unlawful purpose, and respect candidate and employer privacy when storing or redistributing it.

# Actor input Schema

## `opportunityTypes` (type: `array`):

Choose whether to collect jobs, internships, or both. Leave empty to collect both.

## `searchKeyword` (type: `string`):

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` (type: `array`):

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.

## `location` (type: `string`):

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` (type: `array`):

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.

## `freshersOnly` (type: `boolean`):

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` (type: `integer`):

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` (type: `boolean`):

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` (type: `string`):

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` (type: `string`):

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` (type: `string`):

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` (type: `integer`):

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'.

## Actor input object example

```json
{
  "opportunityTypes": [
    "Job"
  ],
  "skills": [],
  "workModels": [],
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of listings with the most useful fields — title, company, location, work model, salary, posting date and apply link.

## `details` (type: `string`):

Full per-listing rows including description, skills, experience and salary breakdown, application window and engagement stats.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "opportunityTypes": [
        "Job"
    ],
    "searchKeyword": "",
    "skills": [],
    "location": "",
    "workModels": [],
    "freshersOnly": false,
    "openOnly": false,
    "postedWithin": "",
    "postedFrom": "",
    "postedTo": "",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/engineerhub-in-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "opportunityTypes": ["Job"],
    "searchKeyword": "",
    "skills": [],
    "location": "",
    "workModels": [],
    "freshersOnly": False,
    "openOnly": False,
    "postedWithin": "",
    "postedFrom": "",
    "postedTo": "",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/engineerhub-in-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "opportunityTypes": [
    "Job"
  ],
  "searchKeyword": "",
  "skills": [],
  "location": "",
  "workModels": [],
  "freshersOnly": false,
  "openOnly": false,
  "postedWithin": "",
  "postedFrom": "",
  "postedTo": "",
  "maxResults": 100
}' |
apify call solidcode/engineerhub-in-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/engineerhub-in-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
