---
title: "Hopin API reference"
description: "Reference for the public Hopin API: jobs, internships, filters, events, health and the open fresher hiring dataset. No API key required."
canonical: https://hopinjobs.com/api
last-updated: 2026-08-22
---

# Hopin API reference

The public Hopin API is read-only, unauthenticated and CORS-open. Base URL:

```
https://api.hopinjobs.com
```

The formal description is at [https://hopinjobs.com/openapi.json](https://hopinjobs.com/openapi.json)
(OpenAPI 3.1). Every operation below has a stable `operationId` that matches the
spec, so it can be turned into an LLM tool definition mechanically.

Background — rate limits, error shape, CORS and the open dataset — is on
[the docs page](https://hopinjobs.com/docs).

## Conventions

- All public operations are `GET`. There is no public write surface.
- Responses are `application/json; charset=utf-8`.
- No API key, no OAuth, no signup.
- Collection endpoints return the **whole filtered collection** in one response.
  There is no pagination to walk; filter server-side instead.
- Rate limit: 300 requests per 60-second window per client, advertised on every
  response as `ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset` and
  `ratelimit-policy`.

## getHealth

`GET /api/health` — liveness check for the API. Use it to confirm reachability
before a batch of calls.

```bash
curl -s https://api.hopinjobs.com/api/health
```

```json
{"status":"ok","message":"Hopin Backend API is running"}
```

## listJobs

`GET /api/jobs` — full-time and entry-level job listings. Returns every matching
listing in one response under a `jobs` array.

| Parameter | Type | Description |
| --- | --- | --- |
| `is_unofficial` | `"true"` / `"false"` | `true` returns hidden roles — openings sourced from a recruiter's own feed rather than a job board. Default `false`. |
| `is_on_campus` | `"true"` / `"false"` | Restrict to on-campus or off-campus listings. Ignored when `is_unofficial=true`. |
| `industry` | string | Exact match on an industry from `GET /api/filters`, e.g. `Technology`. |
| `location` | string | Exact match on a location from `GET /api/filters`, e.g. `Bangalore, India`. |
| `work_type` | string | One of `On-site`, `Remote`, `Hybrid`. |
| `role_type` | string | Exact match on a role from `GET /api/filters`. |

```bash
curl -s "https://api.hopinjobs.com/api/jobs?is_unofficial=true"
```

```json
{
  "jobs": [
    {
      "id": "e4841672-3717-4959-ac26-d9fa5fca7673",
      "company": "Infosys",
      "title": "Business Roles",
      "description": "Information Technology / Business Roles",
      "location": "Remote, India",
      "work_type": "On-site",
      "industry": "Information Technology",
      "role_type": "Business Roles",
      "ctc_amount": "₹3.5-7 LPA (Estimated)",
      "posted_at": "2026-08-21T03:52:44",
      "posted_days": 1,
      "is_on_campus": false,
      "is_active": true,
      "job_type": "job"
    }
  ]
}
```

`posted_days` is derived at request time from `posted_at`. `ctc_amount` is a
human-readable band and may be marked estimated; treat it as a string, not a number.

## getJob

`GET /api/jobs/{id}` — a single job by its UUID. Returns `404` with
`{"error":"Job not found"}` when the id does not exist.

```bash
curl -s https://api.hopinjobs.com/api/jobs/e4841672-3717-4959-ac26-d9fa5fca7673
```

```json
{"job": {"id": "e4841672-3717-4959-ac26-d9fa5fca7673", "company": "Infosys", "title": "Business Roles"}}
```

## listInternships

`GET /api/internships` — internship listings. Same parameters as `listJobs`;
the response key is `internships` and each item carries `stipend` rather than
`ctc_amount`.

```bash
curl -s "https://api.hopinjobs.com/api/internships?is_unofficial=true"
```

## getInternship

`GET /api/internships/{id}` — a single internship by UUID, under an
`internship` key.

## listFilters

`GET /api/filters` — the allowed values for every filter parameter, grouped by
type. Call this first and filter server-side rather than fetching everything.

```bash
curl -s https://api.hopinjobs.com/api/filters
```

The groups are `industry`, `location`, `pay_range`, `role` and `work_type`. Each
entry carries `filter_value` (what you send) and `display_label` (what to show).

## listEvents

`GET /api/events` — campus and career events (workshops, drives, sessions) with
their date, time, location and whether they are online.

## The open hiring dataset

Aggregate hiring data is a static file on the website origin rather than an API
call, so it is cacheable and citable:

```bash
curl -s https://hopinjobs.com/reports/fresher-hiring-india.json
```

It returns `updatedAt`, a `totals` object (live listings, new in the last seven
days, internship share, remote share, median posting age) and `topCities`,
`topRoles` and `topCompanies` arrays. Licensed CC-BY-4.0 — cite it with
attribution to Hopin.

## Errors

| Status | Meaning | Body |
| --- | --- | --- |
| `404` | The resource does not exist | `{"error":"Job not found"}` |
| `429` | Rate limit exceeded; honour `Retry-After` | JSON error object |
| `500` | Server-side failure; the request is worth retrying | `{"error":"Failed to fetch jobs"}` |

## Stability

These endpoints back Hopin's own web and mobile clients, so they do not change
casually. Breaking changes will be announced on
[the changelog](https://hopinjobs.com/changelog) and reflected in
[openapi.json](https://hopinjobs.com/openapi.json) first. Questions:
[help@hopinjobs.com](mailto:help@hopinjobs.com).
