# Dealls — Zapi reference > Dealls job board — search by sector, employment type, city, company and salary band, with skills and company detail per job. **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/dealls - 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 --- ## Dealls **Category:** jobs · **Slug:** `dealls` **Detail page:** https://zpi.web.id/api/jobs/dealls Dealls job board — search by sector, employment type, city, company and salary band, with skills and company detail per job. **Tags:** dealls, lowongan, karir, indonesia, magang ### Job Dealls single job by id — /v1/explore-job/job with `ids[]=`. There is no detail route: /v1/explore-job/job/{id}, /job/slug/{slug} and /job/detail/{id} all 404. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/job/:id` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `id` | string | path | yes | Dealls job id, as returned in `jobId`. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/job/:id" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/job/:id", { 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:dealls/job/:id", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "url": "https://dealls.com/loker/growth-strategy-manager~fintureid", "slug": "growth-strategy-manager", "jobId": "6a97ec54e2b28600127932b8", "stats": { "viewCount": 0, "applicantCount": 3, "nonCuratedCount": 3 }, "title": "Growth Strategy Manager", "skills": [ { "id": "67573ddc8d8bcd001286b233", "name": "Growth Strategy" }, { "id": "62ba6b677e07610012e5af8f", "name": "Performance Marketing" } ], "status": "active", "company": { "id": "6a4dcfe4417e2a001267622e", "logo": "https://cdn.sejutacita.id/6a4dcfe4e85dd30013306839/JobPortalCompanyLogo/5d93c034-f5b0-44a3-a6ac-94d48669bc5d.jpg", "name": "Finture", "slug": "fintureid", "benefits": [ "Flexible working environment" ], "industry": "education", "verified": false, "createdAt": "2026-07-08T04:19:48.678Z", "workingPolicies": [ "flexible" ] }, "authorId": "6a4dd43b304e700013b38ea7", "function": "strategy-and-project-management", "isHybrid": false, "isRemote": false, "isUrgent": false, "location": { "city": "Jakarta Selatan", "cityId": 158, "country": "Indonesia", "countryId": 102 }, "postedAt": "2026-09-02T09:28:52.962Z", "taxonomy": { "jobRoleId": "69393facffb8a421e1efbba2", "jobRoleCategoryId": "6934fd532622eadf60779985", "jobRoleSubCategoryId": "69393fabffb8a421e1efbba1" }, "createdAt": "2026-09-02T09:28:52.973Z", "recruiter": { "id": "6a4dd43b417e2a00126841dd", "name": "HR Finture", "email": "talent@finture.id" }, "updatedAt": "2026-09-02T09:29:35.376Z", "isFeatured": false, "salaryType": "paid", "employmentType": "fullTime", "latestUpdatedAt": "2026-09-02T09:28:52.967Z", "workArrangement": "onSite", "hasFewApplicants": true, "candidatePreference": { "skillIds": [ "67573ddc8d8bcd001286b233", "62ba6b677e07610012e5af8f" ], "educationLevelCodes": [ 6 ] }, "updatedAtByEmployer": "2026-09-02T09:29:34.295Z", "lastActivelyHiringAt": "2026-09-02T09:43:06.371Z", "applicantPrioritySlots": 8 } ``` --- ### Jobs By City Dealls openings in one city — pre-binds `cityIds=` on /v1/explore-job/job. Measured against the 1229-job baseline: cityIds=158 (Jakarta Selatan) → 254. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/jobs-by-city` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `city` | number | query | yes | City id, as returned in `location.cityId`. | | `query` | string | query | no | Free-text search across job titles. | | `company` | string | query | no | Company id, as returned in `company.id`. | | `sector` | string | query | no | Company sector, spelled as `company.industry` returns it. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | no | Employment type. | | `workArrangement` | enum(onSite|hybrid|remote) | query | no | Where the role is worked from. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/jobs-by-city?city=158&query=marketing&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/jobs-by-city?city=158&query=marketing&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/jobs-by-city?city=158&query=marketing&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "city": 158, "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "hasMore": false, "nextPage": null, "provider": "dealls" } ``` --- ### Jobs By Company Dealls openings at one company — pre-binds `companyIds[]=` on /v1/explore-job/job. Measured against the 1229-job baseline: companyIds[]=6a4dcfe4417e2a001267622e → 6. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/jobs-by-company` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `company` | string | query | yes | Company id, as returned in `company.id`. | | `query` | string | query | no | Free-text search across job titles. | | `city` | number | query | no | City id, as returned in `location.cityId`. | | `sector` | string | query | no | Company sector, spelled as `company.industry` returns it. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | no | Employment type. | | `workArrangement` | enum(onSite|hybrid|remote) | query | no | Where the role is worked from. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/jobs-by-company?company=6a4dcfe4417e2a001267622e&query=marketing&city=158§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/jobs-by-company?company=6a4dcfe4417e2a001267622e&query=marketing&city=158§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/jobs-by-company?company=6a4dcfe4417e2a001267622e&query=marketing&city=158§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "company": "6a4dcfe4417e2a001267622e", "hasMore": false, "nextPage": null, "provider": "dealls" } ``` --- ### Jobs By Employment Type Dealls openings of one employment type — pre-binds `employmentTypes=` on /v1/explore-job/job. Measured against the 1229-job baseline: fullTime → 863, internship → 101. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/jobs-by-employment-type` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | yes | Employment type. | | `query` | string | query | no | Free-text search across job titles. | | `city` | number | query | no | City id, as returned in `location.cityId`. | | `company` | string | query | no | Company id, as returned in `company.id`. | | `sector` | string | query | no | Company sector, spelled as `company.industry` returns it. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `workArrangement` | enum(onSite|hybrid|remote) | query | no | Where the role is worked from. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/jobs-by-employment-type?employmentType=internship&query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/jobs-by-employment-type?employmentType=internship&query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/jobs-by-employment-type?employmentType=internship&query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "hasMore": false, "nextPage": null, "provider": "dealls", "employmentType": "internship" } ``` --- ### Jobs By Sector Dealls openings in one industry — pre-binds `sectors=` on /v1/explore-job/job. Measured against the 1229-job baseline: sectors=Banking → 45, sectors=education → 72. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/jobs-by-sector` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `sector` | string | query | yes | Company sector, spelled as `company.industry` returns it. | | `query` | string | query | no | Free-text search across job titles. | | `city` | number | query | no | City id, as returned in `location.cityId`. | | `company` | string | query | no | Company id, as returned in `company.id`. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | no | Employment type. | | `workArrangement` | enum(onSite|hybrid|remote) | query | no | Where the role is worked from. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/jobs-by-sector?sector=Banking&query=marketing&city=158&company=6a4dcfe4417e2a001267622e&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/jobs-by-sector?sector=Banking&query=marketing&city=158&company=6a4dcfe4417e2a001267622e&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/jobs-by-sector?sector=Banking&query=marketing&city=158&company=6a4dcfe4417e2a001267622e&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "sector": "Banking", "hasMore": false, "nextPage": null, "provider": "dealls" } ``` --- ### Remote Jobs Dealls work-from-home openings — pre-binds `workplaceTypes=remote` on /v1/explore-job/job. Measured against the 1229-job baseline: 1229 → 15. Hybrid roles are a separate value (129) and are - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/remote-jobs` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `query` | string | query | no | Free-text search across job titles. | | `city` | number | query | no | City id, as returned in `location.cityId`. | | `company` | string | query | no | Company id, as returned in `company.id`. | | `sector` | string | query | no | Company sector, spelled as `company.industry` returns it. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | no | Employment type. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/remote-jobs?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/remote-jobs?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/remote-jobs?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "hasMore": false, "nextPage": null, "provider": "dealls" } ``` --- ### Search Dealls job search — open JSON API, rung 1 (direct) per recon, 90-600ms. Upstream: api.sejutacita.id/v1/explore-job/job, envelope {data:{docs,totalDocs,totalPages,page},code}. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/jobs:dealls/search` - **Cache TTL:** 600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `query` | string | query | no | Free-text search across job titles. | | `city` | number | query | no | City id, as returned in `location.cityId`. | | `company` | string | query | no | Company id, as returned in `company.id`. | | `sector` | string | query | no | Company sector, spelled as `company.industry` returns it. | | `benefit` | string | query | no | Company benefit, spelled as `company.benefits` returns it. | | `employmentType` | enum(fullTime|partTime|internship|contract|freelance|projectBased|volunteer|temporary) | query | no | Employment type. | | `workArrangement` | enum(onSite|hybrid|remote) | query | no | Where the role is worked from. | | `educationLevel` | number | query | no | Dealls' numeric education-level code, as returned in `candidatePreference.educationLevelCodes`. | | `highSalary` | enum(true|false) | query | no | Only roles paying above 30 million IDR. | | `status` | enum(active|paused) | query | no | Posting status. Default active. | | `sort` | enum(mostRelevant|createdAt|updatedAt|mostRecentAndLeastApplicant|highestSalary|publishedAt) | query | no | Sort key. Default mostRelevant. | | `sortDirection` | enum(asc|desc) | query | no | Sort direction. Default desc. | | `page` | number | query | no | Page number. Default 1. | | `limit` | number | query | no | Results per page. Default 20, max 50. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/jobs:dealls/search?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/jobs:dealls/search?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", { 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:dealls/search?query=marketing&city=158&company=6a4dcfe4417e2a001267622e§or=Banking&benefit=Flexible%20working%20environment&employmentType=internship&workArrangement=hybrid&educationLevel=6&highSalary=true&status=active&sort=publishedAt&sortDirection=desc&page=1&limit=20", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "page": 1, "count": 0, "items": [], "limit": 5, "query": "marketing", "total": 0, "hasMore": false, "nextPage": null, "provider": "dealls" } ``` --- _Generated: 2026-09-02T14:23:24.674Z_