{
  "openapi": "3.0.1",
  "info": {
    "title": "Unstop Scraper API - Hackathons, Competitions & Jobs",
    "description": "Unstop's public API never rejects a filter value it doesn't know: ask for oppstatus=banana and you get all 6,110 hackathons, not the 111 that are open. This one allows only verified values. Hackathons, jobs, internships, scholarships, with organiser emails where given. $2.50/1k.",
    "version": "0.1",
    "x-build-id": "lwD5zJPnf7pWy67Hi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~unstop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-unstop-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/dami_studio~unstop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-unstop-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/dami_studio~unstop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-unstop-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": {
          "listing": {
            "title": "What to scrape",
            "type": "array",
            "description": "Unstop's opportunity boards. Live counts measured on 2026-08-08: jobs 1,170 · internships 861 · competitions 275 · hackathons 111 · cultural events 43 · workshops 42 · quizzes 38 · hiring challenges 28 · conferences 17 · scholarships 6. Two boards are supergroups: 'Competitions' (275) also carries all 111 hackathons and all 38 quizzes, and 'all' (377) is Competitions plus workshops, conferences and cultural events — it does NOT include jobs, internships or scholarships. Pick several and each is walked in turn; every row carries a plain 'kind' field (hackathon, competition, quiz, internship, job, scholarship, workshop, conference, cultural-event) so duplicates are easy to see.",
            "items": {
              "type": "string",
              "enum": [
                "hackathons",
                "competitions",
                "internships",
                "jobs",
                "quizzes",
                "scholarships",
                "workshops",
                "conferences",
                "cultural",
                "hiring-challenges",
                "all"
              ],
              "enumTitles": [
                "Hackathons",
                "Competitions",
                "Internships",
                "Jobs",
                "Quizzes",
                "Scholarships",
                "Workshops",
                "Conferences",
                "Cultural events",
                "Hiring challenges",
                "All (mixed feed, no jobs/internships)"
              ]
            }
          },
          "searchQueries": {
            "title": "Keywords",
            "type": "array",
            "description": "Free-text searches, exactly as you would type them into Unstop's search box: a topic (\"machine learning\"), a technology (\"blockchain\"), or an organiser (\"Flipkart\"). Each keyword is run separately against every board you selected. Leave empty to take everything that matches the filters below.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Opportunity URLs",
            "type": "array",
            "description": "Paste full Unstop opportunity URLs, for example https://unstop.com/hackathons/evil-corp-ctf-v2-1733381, or just the numeric id (1733381). Each is fetched directly with full detail, including the organiser's contact email. Short unstop.com/o/XXXX links do not carry the id and are not supported.",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "title": "Registration status",
            "enum": [
              "open",
              "expired",
              "closed"
            ],
            "type": "string",
            "description": "Live = registration is open right now. Expired = the deadline has passed (that archive is large: 5,893 hackathons against 111 live). Closed = the organiser closed registration early. Anything else is refused, because Unstop answers HTTP 200 with the ENTIRE archive for a status it does not recognise.",
            "default": "open"
          },
          "category": {
            "title": "Domain",
            "enum": [
              "",
              "architecture",
              "chemical-engineering",
              "civil-engineering",
              "data-analytics",
              "design",
              "electrical-engineering",
              "electronics-engineering",
              "finance",
              "human-resources",
              "industrial-engineering",
              "legal-compliance",
              "mechanical-engineering",
              "operations",
              "product-design",
              "product-management",
              "psychology",
              "software-development"
            ],
            "type": "string",
            "description": "Unstop's domain taxonomy. These 17 values are the complete verified set: 150+ other plausible slugs (\"marketing\", \"data-science\", \"case-study\", \"web-development\") were tested against the live API and every one of them is silently ignored, returning the whole unfiltered corpus. Only the values in this list actually filter anything.",
            "default": ""
          },
          "region": {
            "title": "Online or in person",
            "enum": [
              "",
              "online",
              "offline"
            ],
            "type": "string",
            "description": "Online events run remotely; offline events have a venue and fill in city, state and country. Measured on 2026-08-08: 106 of the 275 live competitions are offline, held in cities such as Pune, Indore and Guwahati.",
            "default": ""
          },
          "cities": {
            "title": "City",
            "type": "array",
            "description": "Indian cities such as \"Pune\", \"Delhi\", \"Bangalore\", \"Mumbai\". Matched against each row's city and state. Unstop has no working server-side city filter — location=<city> is accepted and then silently ignored — so this is applied here after the rows arrive, and rows dropped by it are NEVER charged for. Best combined with \"In person only\".",
            "items": {
              "type": "string"
            }
          },
          "workMode": {
            "title": "Work mode (jobs & internships)",
            "enum": [
              "",
              "wfh",
              "in_office",
              "hybrid",
              "on_field"
            ],
            "type": "string",
            "description": "How the role is worked. Measured on 2026-08-08 across 861 live internships: 441 work-from-home. Ignored on competition-style boards.",
            "default": ""
          },
          "employmentType": {
            "title": "Employment type (jobs & internships)",
            "enum": [
              "",
              "full_time",
              "part_time",
              "contractual"
            ],
            "type": "string",
            "description": "Full time, part time or contract. Measured on 2026-08-08 across 1,170 live jobs: 1,152 full time, 5 part time.",
            "default": ""
          },
          "paidOnly": {
            "title": "Paid or unpaid (jobs & internships)",
            "enum": [
              "",
              "paid",
              "unpaid"
            ],
            "type": "string",
            "description": "Measured on 2026-08-08: 630 of 861 live internships are paid, the rest are explicitly unpaid. Careful — Unstop treats any value it does not recognise as \"paid\", so only these two are allowed through.",
            "default": ""
          },
          "workingDays": {
            "title": "Working days per week (jobs)",
            "enum": [
              "",
              "4",
              "5",
              "6"
            ],
            "type": "string",
            "description": "Measured on 2026-08-08: 799 of 1,170 live jobs are 5 days a week.",
            "default": ""
          },
          "eligibleFor": {
            "title": "Who it is open to",
            "enum": [
              "",
              "students",
              "fresher",
              "corporate",
              "school students"
            ],
            "type": "string",
            "description": "Unstop's own eligibility buckets. Measured on 2026-08-08 across 861 live internships: 515 are open to freshers. Across 1,170 live jobs: 992 to working professionals, 32 to college students.",
            "default": ""
          },
          "postedWithinDays": {
            "title": "Posted within",
            "enum": [
              "",
              "1",
              "7",
              "30",
              "90",
              "180",
              "365"
            ],
            "type": "string",
            "description": "Only opportunities published in the last N days. Measured on 2026-08-08: 512 of 861 live internships were posted in the past week.",
            "default": ""
          },
          "teamSize": {
            "title": "Team size (competitions & hackathons)",
            "enum": [
              "",
              "1",
              "2",
              "3"
            ],
            "type": "string",
            "description": "Solo entries, pairs, or teams of three and up. Only meaningful on competition-style boards; on jobs it returns nothing.",
            "default": ""
          },
          "entryFee": {
            "title": "Entry fee (competitions & hackathons)",
            "enum": [
              "",
              "unpaid",
              "paid"
            ],
            "type": "string",
            "description": "Free to enter, or a paid entry. Only meaningful on competition-style boards.",
            "default": ""
          },
          "skill": {
            "title": "Skill",
            "type": "string",
            "description": "One skill tag, spelled the way Unstop spells it — this one IS case sensitive. \"Python\" returned 93 live jobs on 2026-08-08; \"python\" returned 0."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "",
              "latest",
              "prize",
              "daysleft",
              "salary"
            ],
            "type": "string",
            "description": "Newest first is Unstop's default. Prize money and stipend/salary sort by the published figure; opportunities with no figure sink to the bottom.",
            "default": ""
          },
          "sortDirection": {
            "title": "Sort direction",
            "enum": [
              "desc",
              "asc"
            ],
            "type": "string",
            "description": "Which end of the sort to start from. Only used when \"Sort by\" is set.",
            "default": "desc"
          },
          "maxItems": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many opportunities across every board and keyword. You are charged per opportunity returned, so this is your spending cap. Unstop lets any single search reach its first 10,000 results; past that, split the run with a domain, a status or a keyword.",
            "default": 50
          },
          "includeDetails": {
            "title": "Fetch the organiser's contact details",
            "type": "boolean",
            "description": "Reads each opportunity's own page for the organiser's contact email and phone, the round schedule, the start date and the live participant count. Measured over 40 live opportunities on 2026-08-08: an email on 30, a phone number on 18, a round schedule on 25, a participant count on 40. It costs one extra request per row (about 100 ms) and nothing extra in money. Turn it off for the fastest possible listing-only run.",
            "default": true
          },
          "includeDescriptionHtml": {
            "title": "Keep the raw HTML description",
            "type": "boolean",
            "description": "Every row already carries descriptionText, the plain-text version. Switch this on to also keep descriptionHtml, the organiser's original markup. It makes the dataset roughly three times larger.",
            "default": false
          },
          "detailConcurrency": {
            "title": "Detail requests in parallel",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many opportunity pages to read at once when \"Fetch the organiser's contact details\" is on. 8 measured 40 pages in 4.0 seconds with no throttling.",
            "default": 8
          },
          "egressMode": {
            "title": "Network route",
            "enum": [
              "auto",
              "direct",
              "datacenter",
              "isp"
            ],
            "type": "string",
            "description": "Unstop's API is open, fast and unmetered from anywhere: 24-72 ms from the plain container address against 600-2,000 ms through a proxy, and identical results from three different addresses. Leave this on Automatic unless you have a reason not to.",
            "default": "auto"
          },
          "proxyConfiguration": {
            "title": "Your own proxy servers",
            "type": "object",
            "description": "Optional. Supply your own proxy URLs here and they are used for every request instead of the routes above.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}