# Glints Jobs & Company Scraper (Southeast Asia) (`fanndev/glints-jobs-scraper`) Actor

Scrape jobs and employers from Glints across Indonesia, Singapore, Vietnam, Malaysia, the Philippines and Taiwan. Keyword search with full filters, job detail with salary and benefits, company profiles with every open vacancy, whole-corpus crawl and market facets. No login needed.

- **URL**: https://apify.com/fanndev/glints-jobs-scraper.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/fanndev) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 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/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

## Glints Jobs & Company Scraper

Extract job postings, employer profiles and hiring-market structure from **Glints**, the Southeast Asian job platform — across Indonesia, Singapore, Vietnam, Malaysia, the Philippines and Taiwan.

### Why use this actor

- **No account, no login, no API key** — every mode runs on public data
- **Salary data on most postings**, with the currency and pay period, not just a vague band
- **Full job descriptions**, required skills, benefits, interview process, workplace address and coordinates
- **Employer profiles with every open vacancy** in a single request
- **Reaches past the site's own 50-result search limit** via a whole-corpus crawl mode
- **Market intelligence built in** — which employers, cities and roles actually have postings for a keyword
- **Six markets from one actor**, with automatic retries and clean, stable JSON

### How it works

1. Pick a **mode** — search by keyword, pull full detail for specific jobs, profile an employer, or crawl the whole corpus.
2. Pick a **market** (Indonesia, Singapore, Vietnam, Malaysia, the Philippines or Taiwan) and, if you like, narrow with filters: salary, employment type, remote/hybrid/on-site, experience, education or how recently the job was posted.
3. The actor collects the data, retrying automatically on any hiccup.
4. Results stream into your dataset, ready to download as JSON, CSV or Excel.

You never manage scrapers, browsers, logins or accounts.

### Modes

| Mode | What you get | Good for |
| --- | --- | --- |
| `search` | Job cards matching your keywords and filters | Job boards, lead lists, daily new-vacancy alerts |
| `jobDetail` | Everything about specific postings: description, benefits, interview process, address | Enriching a shortlist |
| `company` | Employer profile **plus every open vacancy there** | Competitor hiring tracking |
| `similarJobs` | Glints' own related-jobs recommendations | Expanding a seed list |
| `sitemapCrawl` | The whole public corpus for a market | Full datasets, market-wide analysis |
| `filters` | Top employers, cities and roles for a keyword | Market research, talent mapping |
| `suggestions` | Autocomplete job titles and company names | Keyword research, discovering employers |
| `skills` | Glints' skill catalogue with the ids the search filter accepts | Building precise skill-filtered searches |

#### Getting more than 50 results

Glints itself only shows the first page of search results to visitors who are not signed in, so **any one search returns at most 50 jobs**. Two ways around it, both built in:

- **Run several narrow searches.** Each keyword and filter combination is its own query. In testing, eight different slices of the same market returned **326 unique jobs** where a single search returned 50. The actor removes duplicates for you.
- **Use `sitemapCrawl`.** It works from the site's own public index and is not subject to the limit, so it reaches the full corpus — roughly 73,000 Indonesian postings plus around 54,000 aggregated ones.

### Input

```json
{
  "mode": "search",
  "countryCode": "ID",
  "searchTerms": ["data analyst", "software engineer"],
  "jobTypes": ["FULL_TIME"],
  "workArrangements": ["ONSITE", "HYBRID"],
  "lastUpdatedRange": "PAST_WEEK",
  "salaryMin": 8000000,
  "salaryCurrency": "IDR",
  "sortBy": "LATEST",
  "maxItems": 200,
  "pageSize": 50
}
```

| Field | Type | Description |
|---|---|---|
| `mode` | string | `search`, `jobDetail`, `company`, `similarJobs`, `sitemapCrawl`, `filters`, `suggestions` or `skills`. Default `search`. |
| `countryCode` | string | Market: `ID`, `SG`, `VN`, `MY`, `PH` or `TW`. Default `ID`. |
| `searchTerms` | array | Keywords. Used by `search`, `filters`, `suggestions` and `skills`. Each is a separate query; duplicates are removed across all of them. |
| `jobUrlsOrIds` | array | Job links or ids for `jobDetail` and `similarJobs`. Any public job link works. |
| `companyUrlsOrIds` | array | Company links or ids for `company`. |
| `maxItems` | integer | Stop after this many records. Default 100. Use 0 in `search` for no cap. |
| `pageSize` | integer | Results per search. Glints caps this at 50. Default 50. |
| `sortBy` | string | `RELEVANCY`, `LATEST` or `SALARY`. Switching this surfaces a different 50 jobs for the same keyword. |
| `jobTypes` | array | `FULL_TIME`, `PART_TIME`, `INTERNSHIP`, `CONTRACT`, `TEMPORARY`, `FREELANCE`, `DAILY`, `PROJECT_BASED`. |
| `workArrangements` | array | `ONSITE`, `HYBRID`, `REMOTE`. |
| `educationLevels` | array | From `PRIMARY_SCHOOL` through `DOCTORATE`. |
| `lastUpdatedRange` | string | `ANY_TIME`, `PAST_24_HOURS`, `PAST_WEEK`, `PAST_MONTH`. |
| `salaryMin` / `salaryMax` | integer | Pay band, in `salaryCurrency`. See the note below. |
| `salaryCurrency` | string | Must match the market — `IDR`, `SGD`, `VND`. Default `IDR`. |
| `minYearsOfExperience` / `maxYearsOfExperience` | integer | Required experience, in years. |
| `locationIds` / `categoryIds` / `companyIds` / `skillIds` | array | Filter by id. Run `filters` or `skills` first to discover them. |
| `includeExternalJobs` | boolean | Include postings Glints aggregates from other job boards. Default `true`. |
| `includeCompanyJobs` | boolean | In `company` mode, also emit each open vacancy. Default `true`. |
| `sitemapFetchDetails` | boolean | In `sitemapCrawl`, fetch full detail per job. Turn off for ids and links only. Default `true`. |
| `maxConcurrency` | integer | Parallel requests for the detail, company and sitemap modes. Default 5. |
| `proxyConfiguration` | object | Optional. Off by default — this actor does not need a proxy. |

> **Note on the salary filter:** Glints matches any posting whose advertised range *overlaps* your band, not one whose floor clears it. A job advertised at 3,500,000–5,000,000 will match `salaryMin: 5000000` because its ceiling touches your figure. Setting any salary filter also excludes postings that hide their pay. This matches what the Glints website itself shows.

### Output

#### `search` mode

```json
{
  "_input": "data analyst",
  "_source": "S1-gql-searchJobsV3",
  "_scrapedAt": "2026-09-20T17:50:46Z",
  "recordType": "JOB",
  "id": "14ba92ef-c8bd-4224-b074-094b798d61b5",
  "title": "Data Analyst",
  "jobUrl": "https://glints.com/id/opportunities/jobs/data-analyst/14ba92ef-c8bd-4224-b074-094b798d61b5",
  "status": "OPEN",
  "type": "CONTRACT",
  "workArrangementOption": "ONSITE",
  "educationLevel": "BACHELOR_DEGREE",
  "minYearsOfExperience": 1,
  "maxYearsOfExperience": 3,
  "salaryMin": 6000000,
  "salaryMax": 11000000,
  "salaryCurrency": "IDR",
  "salaryMode": "MONTH",
  "shouldShowSalary": true,
  "companyName": "PT Abhimantra Sistem Solusindo",
  "companyUrl": "https://glints.com/id/companies/pt-abhimantra-sistem-solusindo/9eccff28-ba74-40db-9c94-19240809158f",
  "companyLogoUrl": "https://images.glints.com/unsafe/glints-dashboard/5def3a2317c48c882e611fdd45a19f1f.png",
  "companyIsVerified": true,
  "locationName": "Tebet",
  "countryCode": "ID",
  "categoryName": "Data Analyst",
  "categoryPath": "Computer & Software > Data > Data Analyst",
  "skillNames": ["Microsoft SQL Server", "Tableau", "Data Visualization", "Data Analysis"],
  "createdAt": "2025-11-05T10:48:39.76Z",
  "updatedAt": "2026-09-18T18:09:37.918Z",
  "jobSource": "EMPLOYER",
  "searchTerm": "data analyst",
  "_warning": "anon_page_1_only",
  "country": { "code": "ID", "name": "Indonesia" },
  "location": { "...": "full district / city / province / country chain with coordinates" },
  "company":  { "...": "full employer object" },
  "salaries": { "...": "every salary row, including allowances" },
  "skills":   { "...": "each skill with its id and whether it is mandatory" }
}
```

#### `jobDetail` mode

Adds, on top of every field above:

```json
{
  "recordType": "JOB_DETAIL",
  "title": "Barista Toko Kopi: Area Depok",
  "descriptionText": "Kisaran Gaji 2,5jt\n\nDeskripsi Pekerjaan:\nMelakukan segala aktivitas dalam persiapan dan pembuatan minuman.\nMelayani customer dengan ramah baik driver online maupun customer dine-in.\n...\n\nPersyaratan:\nDisiplin, Jujur dan Berperilaku Baik\nBersedia Bekerja Dalam Shift\nDomisili Sekitar Depok Margonda",
  "interviewProcessText": null,
  "benefitTitles": ["Free Wi-Fi", "Perform Bonus"],
  "metadata": {
    "workingDaysPerWeek": 6,
    "requiresWeekendHolidays": false,
    "workShifts": ["REGULAR"]
  },
  "companyAddress": {
    "poi": {
      "addressLabel": "Jalan Kartini, Depok Kel., Pancoran Mas, Depok, 16431, Indonesia"
    }
  },
  "salaryEstimate": null,
  "expiryDate": "2026-10-21",
  "isActivelyHiring": false,
  "acceptsForeignApplications": false,
  "isCoverLetterMandatory": false,
  "screeningQuestionsEnabled": false,
  "externalApplyURL": null,
  "isHighResponseRate": false
}
```

#### `filters` mode

```json
{
  "recordType": "SEARCH_FACETS",
  "searchTerm": "perawat",
  "countryCode": "ID",
  "topCompanyNames": ["Hydro Medical", "IMMODERMA Skin Clinic", "PT Citramed Indonesia", "... 7 more"],
  "topJobRoleNames": ["Dental Assistant", "Physiotherapist", "Midwife", "Nurse", "Doctor", "... 5 more"],
  "topLocationNames": ["Kuta", "Tebet", "Dukuh Pakis", "Menteng", "Grogol Petamburan", "... 15 more"],
  "currencies": ["IDR"],
  "hasRemoteJobs": true,
  "jobTypes": ["FULL_TIME", "CONTRACT", "INTERNSHIP", "PROJECT_BASED", "PART_TIME"],
  "yearsOfExperienceRanges": ["NO_EXPERIENCE", "FRESH_GRAD", "LESS_THAN_A_YEAR", "... 4 more"]
}
```

A keyword search for nurses returns clinics, medical roles and the districts hiring them — the facets are scoped to your keyword, not a global top list.

#### Output fields

| Field | Type | Description |
|---|---|---|
| `_input` | string | The search term, link or id this row came from. |
| `_source` | string | Which call produced the row. |
| `_scrapedAt` | string | UTC timestamp for this row. |
| `recordType` | string | `JOB`, `JOB_DETAIL`, `COMPANY`, `SEARCH_FACETS`, `SUGGESTION`, `SKILL` or `ERROR`. |
| `_warning` | string | `anon_page_1_only` means more results exist than one search can reach. |
| `id`, `title`, `jobUrl` | string | Posting identity and public link. |
| `status`, `type`, `workArrangementOption` | string | Lifecycle state, employment type, on-site/hybrid/remote. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryMode` | number / string | Headline pay, flattened for spreadsheets. `salaryMode` is the period — compare figures only within one period. |
| `shouldShowSalary` | boolean | `false` means the employer hid the pay; empty salary fields are their choice, not a gap in the data. |
| `companyName`, `companyUrl`, `companyLogoUrl`, `companyIsVerified` | string / boolean | Employer identity. |
| `locationName`, `countryCode`, `location` | string / object | Workplace location, down to district with coordinates. |
| `categoryName`, `categoryPath` | string | Job category and its full chain. |
| `skillNames`, `skills` | array | Required and preferred skills. |
| `minYearsOfExperience`, `maxYearsOfExperience`, `educationLevel` | number / string | Candidate requirements. |
| `createdAt`, `updatedAt`, `expiryDate` | string | Posting timeline. |
| `jobSource` | string | `EMPLOYER` for postings made on Glints, `SOURCED` for ones aggregated from other boards. |
| `externalApplyURL` | string | For aggregated postings, where the application actually goes. |
| `descriptionText` | string | Full job description as readable text (detail modes). |
| `benefitTitles`, `benefits` | array | Benefits offered (detail modes). |
| `jobCount`, `size`, `website`, `tagline`, `cultureText` | mixed | Employer fields on `COMPANY` rows. |
| `_error`, `_errorDetail` | string | On failure rows only — see below. |

### Error rows

Every input produces a row. If something cannot be fetched you get a row saying so, rather than a silent gap:

| `_error` | Meaning |
|---|---|
| `not_found` | The job or company id is valid but the posting no longer exists. |
| `unparsable_input` | No Glints id could be read from the value you supplied. |
| `no_results` | The query was valid and returned nothing. |
| `login_required` | Glints walls this slice behind an account. |
| `*_failed` | The request could not be completed after all retries. |

### Good to know

- Indonesia carries by far the largest corpus; Taiwan and the Philippines are much smaller.
- Around 40% of search results publish a salary with no filter applied. Adding a salary filter raises that to nearly all results, because postings that hide pay are excluded.
- Aggregated (`SOURCED`) postings are a large share of the corpus and link out to the original board.
- Recruiters' personal names and activity are deliberately not collected. Hiring responsiveness is reported as posting-level signals instead.

### Other actors

Browse the full collection of job-board, marketplace and social scrapers on the publisher's Apify Store page.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'search' runs keyword searches and returns job cards. 'jobDetail' fetches full postings (description, benefits, interview process) for job URLs or ids. 'company' returns an employer profile plus every open vacancy there. 'similarJobs' returns Glints' related-jobs list for a posting. 'sitemapCrawl' walks the public sitemaps to reach the whole corpus, past the 50-row search ceiling. 'filters' returns the facet rail for a keyword: top employers, cities and roles that actually have postings. 'suggestions' returns autocomplete job titles and company names. 'skills' returns the skill taxonomy with the ids the search filter accepts.

## `countryCode` (type: `string`):

Which Glints market to query. Glints operates six Southeast Asian markets from one API; Indonesia carries by far the largest job corpus.

## `searchTerms` (type: `array`):

Keywords to run. Used by the 'search', 'filters', 'suggestions' and 'skills' modes. Each term is a separate query, and results are deduplicated across all of them. Because anonymous access returns at most 50 jobs per query, several narrow terms reach far more of the market than one broad one. Leave empty in 'search' to get the market's newest postings.

## `jobUrlsOrIds` (type: `array`):

Glints job links or bare UUIDs, for the 'jobDetail' and 'similarJobs' modes. Any public job URL shape works, including the /opportunities/s/ links used for postings aggregated from other boards.

## `companyUrlsOrIds` (type: `array`):

Glints company links or bare UUIDs, for the 'company' mode. Both /companies/ and /company/ URL shapes are accepted.

## `maxItems` (type: `integer`):

Stop after this many records. Applies to the 'search', 'sitemapCrawl' and 'skills' modes. Set 0 in 'search' for no cap.

## `pageSize` (type: `integer`):

Jobs requested per search query. Glints silently caps anonymous callers at 50 and returns exactly 50 for any larger value, so 50 is both the default and the practical maximum.

## `sortBy` (type: `string`):

Result ordering for the 'search' mode. Since anonymous access only reaches the first page, switching between RELEVANCY and LATEST is an easy way to surface a different 50 jobs for the same keyword.

## `jobTypes` (type: `array`):

Restrict the search to these employment types. Leave empty for all types.

## `workArrangements` (type: `array`):

Restrict the search to on-site, hybrid or remote postings. Leave empty for all.

## `educationLevels` (type: `array`):

Restrict the search to postings asking for these education levels. Leave empty for all.

## `lastUpdatedRange` (type: `string`):

Only return postings updated inside this window. Pairing a narrow window with a daily schedule is the reliable way to track new vacancies despite the 50-row search ceiling.

## `salaryMin` (type: `integer`):

Only return postings whose published pay range reaches this figure. Note Glints matches on overlap, not on the floor: a job advertised at 3,500,000-5,000,000 still matches a minimum of 5,000,000 because its ceiling touches it. Setting any salary filter also drops postings that hide their pay. Most Indonesian salaries are monthly figures.

## `salaryMax` (type: `integer`):

Only return postings whose published pay range stays at or below this figure. Like the minimum, this matches on overlap rather than strictly.

## `salaryCurrency` (type: `string`):

Currency for the salary filter above. Must match the market: IDR for Indonesia, SGD for Singapore, VND for Vietnam.

## `minYearsOfExperience` (type: `integer`):

Only return postings whose required experience starts at or above this number of years.

## `maxYearsOfExperience` (type: `integer`):

Only return postings whose required experience tops out at or below this number of years.

## `locationIds` (type: `array`):

Glints hierarchical location UUIDs to filter by. Run the 'filters' mode first to discover the ids that have postings for your keyword.

## `categoryIds` (type: `array`):

Glints hierarchical job-category UUIDs to filter by. The 'filters' mode returns these as jobRoles.

## `companyIds` (type: `array`):

Restrict the search to these employer UUIDs. For a complete vacancy list at one employer, the 'company' mode is cheaper and is not subject to the 50-row ceiling.

## `skillIds` (type: `array`):

Restrict the search to postings requiring these skill UUIDs. The 'skills' mode returns the ids.

## `includeExternalJobs` (type: `boolean`):

Include postings Glints aggregates from other job boards. These carry an externalApplyURL instead of an on-site application and are a large share of the corpus.

## `includeCompanyJobs` (type: `boolean`):

In 'company' mode, also emit one row per open vacancy at the employer, alongside the company profile row.

## `sitemapFetchDetails` (type: `boolean`):

In 'sitemapCrawl' mode, fetch the full posting for every id found. Turn this off to emit ids and URLs only, which costs one request per sitemap instead of one per job.

## `similarJobsLimit` (type: `integer`):

How many related jobs to request per posting. Glints often returns fewer than asked; it serves what its recommender has.

## `suggestionLimit` (type: `integer`):

How many autocomplete suggestions to request per keyword in 'suggestions' mode.

## `facetLimit` (type: `integer`):

How many employers, cities and roles to return per facet group in 'filters' mode.

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

Parallel requests for the detail, company and sitemap modes. Glints showed no rate limiting during testing, but keeping this modest is the neighbourly default.

## `maxRetries` (type: `integer`):

How many times to retry a failed request, with exponential backoff and a TLS profile rotation between attempts.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single HTTP response before treating it as failed.

## `proxyConfiguration` (type: `object`):

Optional. Glints showed no IP gate during testing, so runs work fine without a proxy and that is the default. Enable Apify Proxy if you need a specific exit country or start seeing rate limits; RESIDENTIAL is the group to pick if so.

## Actor input object example

```json
{
  "mode": "search",
  "countryCode": "ID",
  "searchTerms": [
    "data analyst",
    "software engineer"
  ],
  "jobUrlsOrIds": [],
  "companyUrlsOrIds": [],
  "maxItems": 100,
  "pageSize": 50,
  "sortBy": "RELEVANCY",
  "jobTypes": [],
  "workArrangements": [],
  "educationLevels": [],
  "lastUpdatedRange": "ANY_TIME",
  "salaryCurrency": "IDR",
  "locationIds": [],
  "categoryIds": [],
  "companyIds": [],
  "skillIds": [],
  "includeExternalJobs": true,
  "includeCompanyJobs": true,
  "sitemapFetchDetails": true,
  "similarJobsLimit": 20,
  "suggestionLimit": 20,
  "facetLimit": 20,
  "maxConcurrency": 5,
  "maxRetries": 4,
  "requestTimeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every job, company, facet, suggestion, skill and diagnostic error record from this run.

# 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 = {
    "searchTerms": [
        "data analyst",
        "software engineer"
    ],
    "jobUrlsOrIds": [],
    "companyUrlsOrIds": [],
    "locationIds": [],
    "categoryIds": [],
    "companyIds": [],
    "skillIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("fanndev/glints-jobs-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 = {
    "searchTerms": [
        "data analyst",
        "software engineer",
    ],
    "jobUrlsOrIds": [],
    "companyUrlsOrIds": [],
    "locationIds": [],
    "categoryIds": [],
    "companyIds": [],
    "skillIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("fanndev/glints-jobs-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 '{
  "searchTerms": [
    "data analyst",
    "software engineer"
  ],
  "jobUrlsOrIds": [],
  "companyUrlsOrIds": [],
  "locationIds": [],
  "categoryIds": [],
  "companyIds": [],
  "skillIds": []
}' |
apify call fanndev/glints-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fanndev/glints-jobs-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/S07ImePIc0BWlVXuh/builds/pNtbNxZoLU56u4Xup/openapi.json
