# Glassdoor — Zapi reference > Glassdoor job search — salary bands, seniority, company rating and job-type filters, read from its structured page data. **Base URL:** `https://api.zpi.web.id` **Auth:** Send `x-api-key: YOUR_KEY` header on every request. Get a free key at https://zpi.web.id/dashboard/keys. **Response envelope:** `{ content, message, errors }` **Rate limit:** 60 req/min on free tier. **Related:** - Detail page: https://zpi.web.id/api/jobs/glassdoor - Endpoint catalog: https://zpi.web.id/category/jobs - Concise index: https://zpi.web.id/llms.txt - Full reference: https://zpi.web.id/llms-full.txt --- ## Glassdoor **Category:** jobs · **Slug:** `glassdoor` **Detail page:** https://zpi.web.id/api/jobs/glassdoor Glassdoor job search — salary bands, seniority, company rating and job-type filters, read from its structured page data. **Tags:** glassdoor, jobs, salary, reviews, global ### By Salary Glassdoor jobs above a pay floor — the search endpoint pre-bound to `minSalary`. Tier: clearance ticket (rung 8), 1.0-2.5s on a warm ticket. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:glassdoor/by-salary` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `minSalary` | number | query | yes | Lowest annual pay to accept, in the searched country's own currency. | | `maxSalary` | number | query | no | Highest annual pay to accept, in the searched country's own currency. | | `query` | string | query | no | Keyword searched across job titles. Omit it to list everything in the country. | | `country` | enum(indonesia|singapore|united-states) | query | no | Country to search in. Default indonesia. | | `cityId` | number | query | no | Glassdoor city id — 2709872 Jakarta, 2768561 Tangerang, 2708612 Bandung, 2798307 Surabaya, 2793794 Denpasar. | | `days` | number | query | no | Only jobs posted within this many days. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:glassdoor/by-salary?minSalary=60000000&maxSalary=330000000&query=developer&country=indonesia&cityId=2709872&days=7" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:glassdoor/by-salary?minSalary=60000000&maxSalary=330000000&query=developer&country=indonesia&cityId=2709872&days=7", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/jobs:glassdoor/by-salary?minSalary=60000000&maxSalary=330000000&query=developer&country=indonesia&cityId=2709872&days=7", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "count": 2, "items": [ { "url": "https://www.glassdoor.com/job-listing/frontend-developer-abhidi-solution-JV_IC2709872_KO0,18_KE19,34.htm?jl=1010250393232", "jobId": 1010250393232, "title": "Frontend Developer", "salary": { "max": 30000000, "min": 30000000, "median": 30000000, "source": "EMPLOYER_PROVIDED", "currency": "IDR", "interval": "MONTHLY" }, "company": { "id": 1014059, "code": "Abhidi Solution", "logo": "https://media.glassdoor.com/sql/1014059/abhidi-solution-squarelogo-1572505960334.png", "name": "Abhidi Solution Sdn. Bhd", "rating": 3.5 }, "function": "front end engineer", "location": { "city": "Jakarta", "countryId": 113 }, "ageInDays": 0, "easyApply": true, "isExpired": false, "isFeatured": false, "description": "O Proficiency in Next.js, React.js, and modern JavaScript (ES6+). O Strong experience with Golang, including building RESTful APIs and microservices.", "isSponsored": false, "employmentType": "Full-time", "normalizedTitle": "front end engineer" }, { "url": "https://www.glassdoor.com/job-listing/backend-java-developer-bank-btn-intikom-berlian-mustika-JV_IC2709872_KO0,31_KE32,55.htm?jl=1010247929818", "jobId": 1010247929818, "title": "Backend Java Developer ( Bank BTN)", "salary": { "max": 16000000, "min": 16000000, "median": 16000000, "source": "EMPLOYER_PROVIDED", "currency": "IDR", "interval": "MONTHLY" }, "company": { "id": 3097730, "code": "Intikom Berlian Mustika", "logo": "https://media.glassdoor.com/sql/3097730/intikom-berlian-mustika-squarelogo-1629970136422.png", "name": "PT. Intikom Berlian Mustika", "rating": 4.7 }, "function": "other", "location": { "city": "Jakarta", "countryId": 113 }, "ageInDays": 1, "easyApply": true, "isExpired": false, "isFeatured": false, "description": "Berpengalaman minimal 5 tahun dalam menggunakan Java Spring Boot. Java Developer: 3 tahun (Diutamakan). JAVA Web SPRING MVC dengan JSP / Thymeleaf.", "isSponsored": false } ], "query": "developer", "total": 2, "country": "indonesia", "provider": "glassdoor", "maxSalary": 5, "minSalary": 60000000 } ``` --- ### Entry Level Glassdoor entry-level jobs — the search endpoint pre-bound to `seniorityType=entrylevel`. Tier: clearance ticket (rung 8), 1.0-2.9s on a warm ticket. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:glassdoor/entry-level` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `query` | string | query | no | Keyword searched across job titles. Omit it to list everything in the country. | | `country` | enum(indonesia|singapore|united-states) | query | no | Country to search in. Default indonesia. | | `cityId` | number | query | no | Glassdoor city id — 2709872 Jakarta, 2768561 Tangerang, 2708612 Bandung, 2798307 Surabaya, 2793794 Denpasar. | | `days` | number | query | no | Only jobs posted within this many days. | | `employmentType` | enum(fulltime|parttime|contract|internship|temporary) | query | no | Contract shape of the role. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:glassdoor/entry-level?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:glassdoor/entry-level?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/jobs:glassdoor/entry-level?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "count": 0, "items": [], "query": "developer", "total": 0, "country": "indonesia", "provider": "glassdoor", "seniority": "entrylevel" } ``` --- ### Job Glassdoor job detail — the listing page's JobPosting schema plus its flight-stream header. Tier: clearance ticket (rung 8). Measured 2026-09-02 from the BE: 0.6-1.7s on a warm ticket. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:glassdoor/job/:listingId` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `listingId` | string | path | yes | The listing id — the `jl` value in a Glassdoor job URL, also `jobId` in this scraper's search response. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:glassdoor/job/:listingId" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:glassdoor/job/:listingId", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/jobs:glassdoor/job/:listingId", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "url": "https://www.glassdoor.com/job-listing/business-development-executive-wellness-by-solace-JV_IC2793794_KO0,30_KE31,49.htm?jl=1010182284886", "jobId": 1010182284886, "title": "Business Development Executive", "salary": { "currency": "IDR" }, "company": { "name": "Wellness by Solace" }, "applyUrl": "https://www.glassdoor.com/partner/jobListing.htm?pos=101&ao=1136043&s=344&guid=000001a061ef42fbaddebe6c995bb201&src=GD_JOB_AD&t=NS&vt=w&ea=1&cs=1_b3b7ba65&cb=1788349465564&jobListingId=1010182284886&jrtk=5-yul1-3-1k1guugon2c37i00", "function": "business development executive", "location": { "city": "Denpasar", "region": "Bali", "country": "Indonesia", "latitude": -8.65, "longitude": 115.21667 }, "postedAt": "2026-08-29T00:00:00", "provider": "glassdoor", "easyApply": true, "expiresAt": "2026-12-31", "description": "

Business Development Executive — Wellness by Solace | Bali
Salary: Base Salary + uncapped commission

Wellness by Solace is Indonesia's leading premium wellness brand ice baths, hot plunge units, and bespoke sauna installations for high-end residential villas, boutique hotels, and commercial wellness facilities. Our clients include property developers, architects, hotels, wellness centers, and contractors across Bali and beyond.

We're expanding, and we're looking for a Business Development Executive who knows how to open doors in the premium space, someone who can walk into a developer's showroom or an architect's studio and be taken seriously.

What you'll be doing

You'll own outbound sales from lead to close. That means identifying the right targets, developers, architects, hospitality groups, contractors, and building genuine relationships that convert into long-term relationships. You'll conduct prospect meetings, present our product range, and work with the team to tailor proposals.

This is a hunter role. You'll be expected to build pipeline, not just manage it.

What we're looking for

What's in it for you

How to apply

We don't review applications submitted through Indeed. To be considered :

1. Email your CV directly to contact@wellnessbysolace.com

2. Write in the subject line: \"Application for Solace Business Development Executive.\"

3. In your email, include a short response to this question below, we're not looking for a textbook answer, we want to understand how you think:

\"When selling a premium product or service, what matters more: persuasion or positioning? Explain your reasoning.\"

Applications that skip the steps above won't be considered.

Work Location: In person

", "directApply": true, "employmentType": "CONTRACTOR", "normalizedTitle": "business development executive" } ``` --- ### Recent Glassdoor freshly-posted jobs — the search endpoint pre-bound to `fromAge`. Tier: clearance ticket (rung 8), 1.0-2.7s on a warm ticket. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:glassdoor/recent` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `query` | string | query | no | Keyword searched across job titles. Omit it to list everything in the country. | | `country` | enum(indonesia|singapore|united-states) | query | no | Country to search in. Default indonesia. | | `cityId` | number | query | no | Glassdoor city id — 2709872 Jakarta, 2768561 Tangerang, 2708612 Bandung, 2798307 Surabaya, 2793794 Denpasar. | | `days` | number | query | no | How far back to look. Default 1 — jobs posted in the last day. | | `employmentType` | enum(fulltime|parttime|contract|internship|temporary) | query | no | Contract shape of the role. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:glassdoor/recent?query=developer&country=indonesia&cityId=2709872&days=1&employmentType=fulltime" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:glassdoor/recent?query=developer&country=indonesia&cityId=2709872&days=1&employmentType=fulltime", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/jobs:glassdoor/recent?query=developer&country=indonesia&cityId=2709872&days=1&employmentType=fulltime", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "days": 1, "count": 1, "items": [ { "url": "https://www.glassdoor.com/job-listing/frontend-developer-abhidi-solution-JV_IC2709872_KO0,18_KE19,34.htm?jl=1010250393232", "jobId": 1010250393232, "title": "Frontend Developer", "salary": { "max": 30000000, "min": 30000000, "median": 30000000, "source": "EMPLOYER_PROVIDED", "currency": "IDR", "interval": "MONTHLY" }, "company": { "id": 1014059, "code": "Abhidi Solution", "logo": "https://media.glassdoor.com/sql/1014059/abhidi-solution-squarelogo-1572505960334.png", "name": "Abhidi Solution Sdn. Bhd", "rating": 3.5 }, "function": "front end engineer", "location": { "city": "Jakarta", "countryId": 113 }, "ageInDays": 0, "easyApply": true, "isExpired": false, "isFeatured": false, "description": "O Proficiency in Next.js, React.js, and modern JavaScript (ES6+). O Strong experience with Golang, including building RESTful APIs and microservices.", "isSponsored": false, "employmentType": "Full-time", "normalizedTitle": "front end engineer" } ], "query": "developer", "total": 1, "country": "indonesia", "provider": "glassdoor" } ``` --- ### Search Glassdoor job search — read from the page's React flight stream, not its markup. Tier: clearance ticket (rung 8). Measured 2026-09-02 from the BE: cold solve 6.2-10.1s, - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:glassdoor/search` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `query` | string | query | no | Keyword searched across job titles. Omit it to list everything in the country. | | `country` | enum(indonesia|singapore|united-states) | query | no | Country to search in. Default indonesia. | | `cityId` | number | query | no | Glassdoor city id — 2709872 Jakarta, 2768561 Tangerang, 2708612 Bandung, 2798307 Surabaya, 2793794 Denpasar. | | `days` | number | query | no | Only jobs posted within this many days. | | `employmentType` | enum(fulltime|parttime|contract|internship|temporary) | query | no | Contract shape of the role. | | `seniority` | enum(internship|entrylevel|midseniorlevel|director|executive) | query | no | Seniority band as Glassdoor names it. | | `minSalary` | number | query | no | Lowest annual pay to accept, in the country's own currency. | | `maxSalary` | number | query | no | Highest annual pay to accept, in the country's own currency. | | `minRating` | number | query | no | Only employers rated at least this highly. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:glassdoor/search?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime&seniority=entrylevel&minSalary=60000000&maxSalary=330000000&minRating=4" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:glassdoor/search?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime&seniority=entrylevel&minSalary=60000000&maxSalary=330000000&minRating=4", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/jobs:glassdoor/search?query=developer&country=indonesia&cityId=2709872&days=7&employmentType=fulltime&seniority=entrylevel&minSalary=60000000&maxSalary=330000000&minRating=4", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "count": 0, "items": [], "query": "developer", "total": 0, "country": "indonesia", "provider": "glassdoor" } ``` --- _Generated: 2026-09-02T14:26:03.677Z_