# Unstop Jobs & Internships Scraper (`memo23/unstop-jobs-internships-scraper`) Actor

Scrape Unstop hackathons, jobs, internships, competitions, quizzes, scholarships, workshops, and conferences — titles, organizers, deadlines, prizes, registration counts, skills, and contacts. Browse by type, keyword search, or paste URLs. No proxy needed. JSON or CSV out.

- **URL**: https://apify.com/memo23/unstop-jobs-internships-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Unstop Jobs & Internships Scraper

Scrape hackathons, jobs, internships, competitions, quizzes, scholarships, workshops, and conferences from Unstop.com — with deadlines, prizes, eligibility, registration counts, skills, and organizer contacts. Fast API-based extraction, no login required.

#### How it works

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-unstop.png)

#### ✨ Why use this scraper?

- **8 opportunity types** — hackathons, competitions, jobs, internships, quizzes, scholarships, workshops, and conferences, all from one actor.
- **No proxy, no browser** — Unstop exposes an open JSON API. The actor hits it directly with impit, so runs are fast and cheap.
- **Three input modes** — browse by type, keyword search across titles and organizers, or paste direct opportunity URLs.
- **Full detail enrichment** — optionally call the detail endpoint per opportunity for prizes, eligibility, organizer contacts (email + phone), and job salary fields.
- **Per-result pricing** — you pay for opportunities collected, not for run time.
- **Structured output** — clean normalized rows with ISO dates, registration counts, views, skills, tags, and SEO metadata.

#### 🎯 Use cases

| Audience | Use case |
|---|---|
| Campus recruiters | Track live internships and entry-level jobs by skill or industry to build early-career sourcing lists. |
| Hackathon organizers | Monitor newly posted hackathons and competitions by domain for participation or sponsorship scouting. |
| Scholarship advisors | Collect open scholarships with eligibility criteria for student counseling tools. |
| Market researchers | Analyze registration counts, prize sizes, and organizer activity across opportunity types. |
| Lead-generation teams | Build structured lists of active organizers running opportunities for B2B outreach. |
| Job-board operators | Feed structured Unstop listings into job boards, newsletters, or student portals. |

#### 📥 Supported inputs

| Input | Example | What it does |
|---|---|---|
| Opportunity type | `hackathons` | Collects every live hackathon, paginated. |
| Search keyword | `ai` | Searches titles and organizers across all selected types. |
| Listing URL | `https://unstop.com/hackathons` | Collects that whole type. |
| Single-opportunity URL | `https://unstop.com/hackathons/medha-ai-ml-hackathon-...-1760434` | Collects just that one opportunity (full detail). |

**Not supported:** organizer-profile pages, user dashboards, anything behind a login.

#### 🔄 How it works

1. You provide a keyword, one or more opportunity types, or direct URLs.
2. The actor classifies the input and hits Unstop's JSON API (`/api/public/opportunity/search-new` for browse, `/api/get-global-search-data` for keyword, `/api/public/competition/<id>` for direct URLs).
3. It paginates through results (10 per page) with sliding-window concurrency, deduplicating by opportunity ID.
4. When `fetchFullDetails` is on, it calls the detail endpoint per opportunity for the full ~100-field record.
5. Each opportunity is normalized into a clean row and pushed to the dataset.
6. Export as JSON, CSV, or Excel from the Apify dataset.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `searchKeyword` | string | `""` | Word or phrase to search across titles and organizers. Leave blank to browse by type. |
| `opportunityTypes` | array | `["hackathons"]` | Which types to collect. Ignored when Start URLs are provided. |
| `startUrls` | array | `[]` | Direct Unstop URLs. Overrides keyword + type picker. |
| `fetchFullDetails` | boolean | `false` | Call the detail endpoint per opportunity for prizes, contacts, and job salary. |
| `maxResults` | integer | `100` | Cap on total opportunities. `0` = no cap. |
| `maxConcurrency` | integer | `10` | Max API requests in flight at once. |
| `proxy` | object | none | Not required — Unstop's API is open. |

#### 📊 Output overview

Each dataset row is one opportunity. The listing endpoint already carries most fields (title, type, organizer, dates, registration counts, skills, status). With `fetchFullDetails` on, the row is enriched with prizes, eligibility, organizer contacts (email + phone), and job salary fields from the detail endpoint.

#### 📦 Output sample

```json
{
  "opportunityId": "1760434",
  "url": "https://unstop.com/hackathons/medha-ai-ml-hackathon-national-institute-of-technology-nit-delhi-1760434",
  "title": "Medha AI ML Hackathon",
  "type": "hackathons",
  "subtype": "online_coding_challenge",
  "status": "Live",
  "region": "offline",
  "organizerName": "National Institute of Technology (NIT), Delhi",
  "organizerId": 11329,
  "startDate": "2026-09-22T18:30:00.000Z",
  "endDate": "2026-10-10T11:35:00.000Z",
  "registrationOpen": true,
  "registrationCount": 13,
  "viewsCount": 13924,
  "isPaid": false,
  "prizes": ["Prize pool of 20k+"],
  "eligibility": null,
  "requiredSkills": ["Artificial Intelligence (AI)", "Machine Learning Concepts", "Natural Language Processing (NLP)"],
  "tags": [],
  "description": "<h2>All that you need to know about MEDHA 2026</h2>...",
  "logoUrl": "https://d8it4huxumps7.cloudfront.net/uploads/images/150x150/...",
  "bannerUrl": null,
  "jobDetail": null,
  "contacts": [
    {
      "name": "Kinetic Robotics Club",
      "contact_no": "+919628182281",
      "email": "kinetic@nitdelhi.ac.in"
    }
  ],
  "seoTitle": "MEDHA AI ML Hackathon - 2026",
  "seoDescription": "Find out the best MEDHA AI ML Hackathon that match your interests...",
  "scrapedAt": "2026-10-04T07:38:00.000Z"
}
```

#### 🗂 Key output fields

| Field | Description |
|---|---|
| `opportunityId` | Unstop's numeric opportunity ID. |
| `url` | Public-facing opportunity URL. |
| `title` | Opportunity title. |
| `type` | One of the 8 opportunity types. |
| `subtype` | Finer category (e.g. `online_coding_challenge`). |
| `status` | `Live`, `Closed`, or `Upcoming`. |
| `region` | `online`, `offline`, or `hybrid`. |
| `organizerName` | Organizing body (college, company, or club). |
| `startDate` / `endDate` | Registration or event window (ISO). |
| `registrationOpen` | Whether registration is currently open. |
| `registrationCount` | Live registration count. |
| `viewsCount` | Page view count. |
| `isPaid` | Whether the opportunity charges a fee. |
| `prizes` | Cash prize descriptions (detail endpoint only). |
| `eligibility` | Eligibility labels (detail endpoint only). |
| `requiredSkills` | Auto-tagged skill names. |
| `contacts` | Organizer contact objects with `email` and `contact_no` (detail endpoint only). |
| `jobDetail` | Job-specific fields: salary, openings, experience, locations (detail endpoint only, jobs/internships). |
| `description` | Full HTML description. |

#### ❓ FAQ

**Do I need a proxy?** No. Unstop's API is open and returns clean JSON to datacenter IPs. The proxy input is there for edge cases but defaults to off.

**How many opportunities are available?** Roughly 2,100 live at any time across all 8 types (hackathons ~270, competitions ~410, jobs ~640, internships ~680, quizzes ~60, scholarships ~5, workshops ~100, conferences ~20).

**What does `fetchFullDetails` cost?** One extra API call per opportunity. The listing item already carries most fields; the detail endpoint adds prizes, eligibility, contacts, and job salary. Turn it on only when you need those.

**Does the keyword search return everything?** Unstop's keyword endpoint is autocomplete-style and capped at ~27 results per query. For a full result set, browse by type instead. Combining a keyword with a type runs the per-type search too.

**Is login required?** No. All endpoints used are public and anonymous.

#### 💬 Support

If you run into any issues, please [open an issue](https://console.apify.com/actors/memo23~unstop-jobs-internships-scraper/issues) on the actor's Apify Console page.

#### 🛠 Additional services

Need a custom modification, a different output format, or integration with your pipeline? Reach out through the Apify Console support channel.

#### 🔎 Explore more scrapers

Looking for other job-board or opportunity scrapers? Check the full portfolio at [apify.com/memo23](https://apify.com/memo23).

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Unstop, Dare2Compete, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available opportunity pages — no authenticated endpoints, organizer-only features, or content behind a Unstop login. Users are responsible for ensuring their use complies with Unstop's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

unstop scraper, scrape unstop, unstop api, apify unstop, unstop hackathon scraper, unstop jobs scraper, unstop internship scraper, student opportunities scraper, hackathon scraper, competition scraper, scholarship scraper, workshop scraper, conference scraper, india jobs scraper, campus recruiting data, hackathon discovery, internship data api, opportunity aggregator, unstop jobs api, unstop internships api, dare2compete scraper, unstop competitions data

# Actor input Schema

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

Word or phrase to search across opportunity titles and organizers (e.g. "coding", "finance", "Flipkart"). Leave blank to browse by type.

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

Which kinds of opportunities to collect. Pick one or more. Ignored when Start URLs are provided.

## `startUrls` (type: `array`):

Paste Unstop URLs directly. A listing link (e.g. https://unstop.com/hackathons) collects that whole type; a single-opportunity link collects just that one. When present, overrides the keyword and type picker.

## `fetchFullDetails` (type: `boolean`):

Call the detail endpoint for each opportunity to pull the full record (prizes, eligibility, contacts, job salary, etc.). Adds one HTTP call per opportunity. The listing item already carries most fields, so this is optional.

## `maxResults` (type: `integer`):

Cap on total opportunities returned across all inputs. Set to 0 for no cap. The last page is always kept in full, so a run may return slightly more than this number.

## `maxConcurrency` (type: `integer`):

Maximum number of API requests in flight at once.

## `proxy` (type: `object`):

Unstop's API is open with no bot protection, so a proxy is not required. Leave at default unless you need a specific exit.

## Actor input object example

```json
{
  "searchKeyword": "",
  "opportunityTypes": [
    "hackathons"
  ],
  "startUrls": [],
  "fetchFullDetails": false,
  "maxResults": 100,
  "maxConcurrency": 10,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "searchKeyword": "",
    "opportunityTypes": [
        "hackathons"
    ],
    "startUrls": [],
    "fetchFullDetails": false,
    "maxResults": 100,
    "maxConcurrency": 10,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/unstop-jobs-internships-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 = {
    "searchKeyword": "",
    "opportunityTypes": ["hackathons"],
    "startUrls": [],
    "fetchFullDetails": False,
    "maxResults": 100,
    "maxConcurrency": 10,
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/unstop-jobs-internships-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchKeyword": "",
  "opportunityTypes": [
    "hackathons"
  ],
  "startUrls": [],
  "fetchFullDetails": false,
  "maxResults": 100,
  "maxConcurrency": 10,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/unstop-jobs-internships-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/unstop-jobs-internships-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xW9MhXKF15Wgtq03F/builds/FdzBwwkl7E3aEA0O2/openapi.json
