{
  "openapi": "3.0.1",
  "info": {
    "title": "Glints Jobs & Company Scraper (Southeast Asia)",
    "description": "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.",
    "version": "0.0",
    "x-build-id": "pNtbNxZoLU56u4Xup"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fanndev~glints-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fanndev-glints-jobs-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/fanndev~glints-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fanndev-glints-jobs-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/fanndev~glints-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fanndev-glints-jobs-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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "jobDetail",
              "company",
              "similarJobs",
              "sitemapCrawl",
              "filters",
              "suggestions",
              "skills"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "countryCode": {
            "title": "Market",
            "enum": [
              "ID",
              "SG",
              "VN",
              "MY",
              "PH",
              "TW"
            ],
            "type": "string",
            "description": "Which Glints market to query. Glints operates six Southeast Asian markets from one API; Indonesia carries by far the largest job corpus.",
            "default": "ID"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "jobUrlsOrIds": {
            "title": "Job URLs or ids",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "companyUrlsOrIds": {
            "title": "Company URLs or ids",
            "type": "array",
            "description": "Glints company links or bare UUIDs, for the 'company' mode. Both /companies/ and /company/ URL shapes are accepted.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many records. Applies to the 'search', 'sitemapCrawl' and 'skills' modes. Set 0 in 'search' for no cap.",
            "default": 100
          },
          "pageSize": {
            "title": "Results per search",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "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.",
            "default": 50
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "RELEVANCY",
              "LATEST",
              "SALARY"
            ],
            "type": "string",
            "description": "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.",
            "default": "RELEVANCY"
          },
          "jobTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Restrict the search to these employment types. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "FULL_TIME",
                "PART_TIME",
                "INTERNSHIP",
                "CONTRACT",
                "TEMPORARY",
                "FREELANCE",
                "DAILY",
                "PROJECT_BASED"
              ]
            },
            "default": []
          },
          "workArrangements": {
            "title": "Work arrangements",
            "type": "array",
            "description": "Restrict the search to on-site, hybrid or remote postings. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "ONSITE",
                "HYBRID",
                "REMOTE"
              ]
            },
            "default": []
          },
          "educationLevels": {
            "title": "Education levels",
            "type": "array",
            "description": "Restrict the search to postings asking for these education levels. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "PRIMARY_SCHOOL",
                "SECONDARY_SCHOOL",
                "HIGH_SCHOOL",
                "DIPLOMA",
                "COLLEGE_DEGREE",
                "BACHELOR_DEGREE",
                "MASTER_DEGREE",
                "DOCTORATE",
                "PROFESSIONAL_EDUCATION"
              ]
            },
            "default": []
          },
          "lastUpdatedRange": {
            "title": "Posted within",
            "enum": [
              "ANY_TIME",
              "PAST_24_HOURS",
              "PAST_WEEK",
              "PAST_MONTH"
            ],
            "type": "string",
            "description": "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.",
            "default": "ANY_TIME"
          },
          "salaryMin": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "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": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only return postings whose published pay range stays at or below this figure. Like the minimum, this matches on overlap rather than strictly."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "Currency for the salary filter above. Must match the market: IDR for Indonesia, SGD for Singapore, VND for Vietnam.",
            "default": "IDR"
          },
          "minYearsOfExperience": {
            "title": "Minimum years of experience",
            "minimum": 0,
            "type": "integer",
            "description": "Only return postings whose required experience starts at or above this number of years."
          },
          "maxYearsOfExperience": {
            "title": "Maximum years of experience",
            "minimum": 0,
            "type": "integer",
            "description": "Only return postings whose required experience tops out at or below this number of years."
          },
          "locationIds": {
            "title": "Location ids",
            "type": "array",
            "description": "Glints hierarchical location UUIDs to filter by. Run the 'filters' mode first to discover the ids that have postings for your keyword.",
            "items": {
              "type": "string"
            }
          },
          "categoryIds": {
            "title": "Job category ids",
            "type": "array",
            "description": "Glints hierarchical job-category UUIDs to filter by. The 'filters' mode returns these as jobRoles.",
            "items": {
              "type": "string"
            }
          },
          "companyIds": {
            "title": "Company ids",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "skillIds": {
            "title": "Skill ids",
            "type": "array",
            "description": "Restrict the search to postings requiring these skill UUIDs. The 'skills' mode returns the ids.",
            "items": {
              "type": "string"
            }
          },
          "includeExternalJobs": {
            "title": "Include aggregated postings",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "includeCompanyJobs": {
            "title": "Include company vacancies",
            "type": "boolean",
            "description": "In 'company' mode, also emit one row per open vacancy at the employer, alongside the company profile row.",
            "default": true
          },
          "sitemapFetchDetails": {
            "title": "Fetch full detail in sitemap crawl",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "similarJobsLimit": {
            "title": "Similar jobs per posting",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many related jobs to request per posting. Glints often returns fewer than asked; it serves what its recommender has.",
            "default": 20
          },
          "suggestionLimit": {
            "title": "Suggestions per keyword",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many autocomplete suggestions to request per keyword in 'suggestions' mode.",
            "default": 20
          },
          "facetLimit": {
            "title": "Facet entries per group",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many employers, cities and roles to return per facet group in 'filters' mode.",
            "default": 20
          },
          "maxConcurrency": {
            "title": "Concurrent requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests for the detail, company and sitemap modes. Glints showed no rate limiting during testing, but keeping this modest is the neighbourly default.",
            "default": 5
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request, with exponential backoff and a TLS profile rotation between attempts.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 10,
            "maximum": 180,
            "type": "integer",
            "description": "How long to wait for a single HTTP response before treating it as failed.",
            "default": 45
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "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.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}