{
  "openapi": "3.0.1",
  "info": {
    "title": "Internshala Scraper: Applicants per Opening & Deadline Alerts",
    "description": "Scrape Internshala internships and fresher jobs with applicants per opening, stipend, deadline and employer hiring history. Find low-competition openings, then schedule runs to catch new posts, changed stipends, closing deadlines, applicant surges and closed openings.",
    "version": "0.7",
    "x-build-id": "lTkzbMdGo6c3ka3jV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~internshala-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-internshala-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/getascraper~internshala-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-internshala-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/getascraper~internshala-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-internshala-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",
        "required": [
          "proxyConfiguration"
        ],
        "properties": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "internships",
              "jobs",
              "both"
            ],
            "type": "string",
            "description": "Choose public internship listings, public job listings, or both in one run. With both, the result limit is shared between the two feeds.",
            "default": "internships"
          },
          "startUrls": {
            "title": "Public listing URLs (optional)",
            "type": "array",
            "description": "Public Internshala internships, jobs, or fresher-jobs listing pages. These URLs replace automatic source URL construction, but the search filters below still apply. Query parameters, commas, fragments, detail pages, login pages, and non-Internshala URLs are rejected. Pagination follows each page's public Next link.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "keyword": {
            "title": "Role or keyword",
            "type": "string",
            "description": "Search public title, company, summary, and skill text. With automatic sources, this also selects Internshala keyword results. Use the list below to search several keywords in one run.",
            "default": ""
          },
          "keywords": {
            "title": "More keywords",
            "type": "array",
            "description": "Extra roles or keywords searched in the same run, for example Python, React, Marketing. Each one opens its own results page and listings are de-duplicated across them.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Cities",
            "type": "array",
            "description": "Only keep listings whose public location contains one of these cities. Multiple cities create separate source pages when the URL pattern supports it. Work-from-home does not automatically match a city.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Internship category",
            "type": "string",
            "description": "Select an Internshala internship category source, for example 'Computer Science' or 'Marketing'. Supported only in internships mode and cannot be combined with startUrls.",
            "default": ""
          },
          "workFromHome": {
            "title": "Work from home only",
            "type": "boolean",
            "description": "Only keep listings explicitly marked as work from home.",
            "default": false
          },
          "partTime": {
            "title": "Part-time only",
            "type": "boolean",
            "description": "Only keep listings explicitly marked as part time.",
            "default": false
          },
          "datePosted": {
            "title": "Posted within",
            "enum": [
              "all",
              "24h",
              "3d",
              "7d",
              "30d"
            ],
            "type": "string",
            "description": "Filter using the public relative posting age shown on the listing card. Records without a parseable age do not pass a selected window.",
            "default": "all"
          },
          "specialFilters": {
            "title": "Verifiable badges",
            "type": "array",
            "description": "Only keep listings carrying every selected public card badge.",
            "items": {
              "type": "string",
              "enum": [
                "actively_hiring",
                "early_applicant",
                "job_offer"
              ],
              "enumTitles": [
                "Actively hiring",
                "Early applicant",
                "Job offer after internship"
              ]
            },
            "default": []
          },
          "skills": {
            "title": "Required skills",
            "type": "array",
            "description": "Only keep listings that list at least one of these skills on the card, for example SQL or Figma. Matching ignores case.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop listings whose title, company, summary, or skills contain any of these words, for example sales or telecalling.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minStipend": {
            "title": "Minimum monthly stipend (INR)",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "Only keep internships whose published minimum monthly stipend is at least this amount. Unpaid or undisclosed stipends do not pass a positive minimum.",
            "default": 0
          },
          "minSalary": {
            "title": "Minimum annual salary (INR)",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Only keep jobs whose published minimum annual salary is at least this amount. Undisclosed salaries do not pass a positive minimum.",
            "default": 0
          },
          "maxDurationMonths": {
            "title": "Maximum internship duration",
            "minimum": 0,
            "maximum": 24,
            "type": "integer",
            "description": "Only keep listings with a published duration at or below this number of months. 0 disables the filter.",
            "default": 0
          },
          "maxExperienceYears": {
            "title": "Maximum required experience",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Only keep jobs whose published minimum experience requirement is at or below this number of years. 0 disables the filter.",
            "default": 0
          },
          "includeDetails": {
            "title": "Fetch applicants and deadlines",
            "type": "boolean",
            "description": "Open each selected listing page to add applicants per opening, applicant pressure, application deadline, openings, description, eligibility, perks, employer hiring history, and start date. Turns on by itself when you use an applicant or deadline filter below. If a page cannot be read, the listing is still returned with detailsFetched set to false.",
            "default": false
          },
          "maxApplicantsPerOpening": {
            "title": "Max applicants per opening",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only keep listings with at most this many applicants per opening, the quickest way to find low-competition roles. Early applicant listings always pass. 0 disables the filter. Opens detail pages automatically.",
            "default": 0
          },
          "maxApplicants": {
            "title": "Max total applicants",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Only keep listings with at most this many applicants so far. Early applicant listings always pass. 0 disables the filter. Opens detail pages automatically.",
            "default": 0
          },
          "minOpenings": {
            "title": "Minimum openings",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only keep listings with at least this many open positions, useful for bulk hiring. 0 disables the filter. Opens detail pages automatically.",
            "default": 0
          },
          "closingWithinDays": {
            "title": "Closing within days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Only keep listings whose application deadline falls within this many days. In monitor mode this sets the closing-soon alert window instead (default 3 days). 0 disables it. Opens detail pages automatically.",
            "default": 0
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of a recurring monitor, for example data-internships-daily. Runs with the same name and search share memory and report only new listings, changes, closing deadlines, applicant surges, and closed openings. Leave empty to scrape without a monitor.",
            "default": ""
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "In monitor mode, return only listings that are new, changed, closing soon, surging, or closed. Turn off to return every listing with its status.",
            "default": true
          },
          "surgePercent": {
            "title": "Applicant surge threshold",
            "minimum": 5,
            "maximum": 1000,
            "type": "integer",
            "description": "In monitor mode, flag a listing when its applicant count grew by at least this percent since the previous run (and by at least 5 applicants). Needs fetched applicants and deadlines turned on.",
            "default": 50
          },
          "monitoringMode": {
            "title": "Legacy monitoring mode",
            "enum": [
              "off",
              "new_only",
              "new_and_changed",
              "all_with_status"
            ],
            "type": "string",
            "description": "Older change detection that keeps working for existing schedules: it compares stable listing fingerprints with earlier runs in the store named below. New schedules should use the monitor name instead, which also covers closing deadlines, applicant surges, and closed openings.",
            "default": "off"
          },
          "monitoringStoreName": {
            "title": "Legacy monitoring store name",
            "pattern": "^[a-z0-9][a-z0-9-]{0,62}$",
            "type": "string",
            "description": "Persistent named key-value store shared by recurring runs. Change this to isolate environments or workflows.",
            "default": "internshala-monitor-state"
          },
          "monitorScope": {
            "title": "Legacy monitor scope",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,255}$",
            "type": "string",
            "description": "Use 'auto' to derive a deterministic scope from the effective source, filters, and detail setting. Set an explicit scope to control which recurring runs share history.",
            "default": "auto"
          },
          "enrichEmails": {
            "title": "Find employer contact email",
            "type": "boolean",
            "description": "Optional add-on. For each employer, looks for a contact email on the company's own public website (for example info@ or hr@) and adds it to every listing of that employer. Many employers publish no email, so not every listing gets one. Charged once per employer whose email is returned in the run, not once per listing. Leave off for a normal scrape.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum matching listings",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Maximum number of listings to return in this run. With several sources (cities, keywords, both feeds) the limit is shared fairly between them. Applicant and deadline filters count only listings that pass them. Monitor runs can return fewer rows because unchanged listings are skipped.",
            "default": 25
          },
          "sortBy": {
            "title": "Sort collected results",
            "enum": [
              "relevance",
              "newest"
            ],
            "type": "string",
            "description": "Keep source relevance order or sort the collected matching window by the public relative posting age. Records with an unknown age sort last.",
            "default": "relevance"
          },
          "maxConcurrency": {
            "title": "Requests at once",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum parallel public page requests. The default is fast and polite; raise it only for very large detail runs.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional Apify proxy configuration. Leave the default: the Actor connects directly first and switches to datacenter proxy by itself if Internshala refuses the connection. Choose specific proxy groups or your own proxy URLs only if you need them.",
            "default": {
              "useApifyProxy": true
            }
          },
          "debugLogging": {
            "title": "Detailed logging",
            "type": "boolean",
            "description": "Enable additional page and parser diagnostics.",
            "default": 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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}