{
  "openapi": "3.0.1",
  "info": {
    "title": "JobStreet $1💰 Companies | Reviews Scraper",
    "description": "From $1/1K. Pull JobStreet company profiles and employee reviews across Malaysia, Singapore, Indonesia, and the Philippines. Search by company, industry, or URL. Returns rich company records with embedded reviews or flat review datasets, with optional open job listings included.",
    "version": "1.0",
    "x-build-id": "WuFe5rYklopQZ8YqO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~jobstreet-companies-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-jobstreet-companies-reviews-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/abotapi~jobstreet-companies-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-jobstreet-companies-reviews-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/abotapi~jobstreet-companies-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-jobstreet-companies-reviews-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": [
              "companies",
              "reviews"
            ],
            "type": "string",
            "description": "companies -> one row per company with embedded top reviews. reviews -> one row per individual review, fanned out across the resolved companies.",
            "default": "companies"
          },
          "urls": {
            "title": "Company URLs",
            "type": "array",
            "description": "Paste JobStreet company URLs: profile, /reviews, /jobs, with or without trailing slash, query or http://; numeric-id-only /companies/<id>; any MY/SG/PH/ID host. A /companies directory URL (optionally ?keywords=dbs) switches to country discovery / name search, but only when no company URL is in the list; otherwise it is ignored with a warning. A ?sortBy=recent or ?sortBy=helpful on a company link sets the review sort for that company; a ?page= number is ignored (reviews are always fetched from the first page). Country is auto-detected per URL. The two sample URLs are filled in when you leave this empty in the API; set Keywords, a different Industry or a different Country (without URLs) to use discovery instead.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://sg.jobstreet.com/companies/dbs-bank-168553715857256",
              "https://my.jobstreet.com/companies/aeon-168552725744507"
            ]
          },
          "keywords": {
            "title": "Keywords",
            "type": "string",
            "description": "Optional. Search by company name (e.g. 'maybank', 'grab', 'shopee'). Combined with 'Industry' below, the actor browses the industry then filters to companies whose name contains the keyword."
          },
          "industry": {
            "title": "Industry",
            "enum": [
              "",
              "Accounting",
              "Administration & Office Support",
              "Advertising, Arts & Media",
              "Banking & Financial Services",
              "Call Centre & Customer Service",
              "Community Services & Development",
              "Construction",
              "Consulting & Strategy",
              "Design & Architecture",
              "Education & Training",
              "Engineering",
              "Farming, Animals & Conservation",
              "Government & Defence",
              "Healthcare & Medical",
              "Hospitality & Tourism",
              "Human Resources & Recruitment",
              "Information & Communication Technology",
              "Insurance & Superannuation",
              "Legal",
              "Manufacturing, Transport & Logistics",
              "Marketing & Communications",
              "Mining, Resources & Energy",
              "Real Estate & Property",
              "Retail & Consumer Products",
              "Sales",
              "Science & Technology",
              "Sport & Recreation",
              "Trades & Services"
            ],
            "type": "string",
            "description": "Optional. Select an industry to browse up to 30 companies in it. Combined with 'Keywords' above, narrows the industry to companies whose name matches the keyword. Leave blank to use keyword-only or URL-only sourcing.",
            "default": "Information & Communication Technology"
          },
          "country": {
            "title": "Country",
            "enum": [
              "MY",
              "SG",
              "PH",
              "ID"
            ],
            "type": "string",
            "description": "Country market to search in Option B (keywords / industry). MY = my.jobstreet.com, SG = sg.jobstreet.com, PH = ph.jobstreet.com, ID = id.jobstreet.com. Ignored for pasted URLs: the country is auto-detected per URL.",
            "default": "MY"
          },
          "maxReviewsPerCompany": {
            "title": "Max reviews per company",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Companies mode: how many top reviews to embed per company record (1-30 from the SSR snapshot, more triggers extra requests). Reviews mode: how many reviews to fan out per company. Set 0 to use the SSR snapshot of 30. Capped at 1000 so a run cannot fetch unbounded reviews.",
            "default": 20
          },
          "reviewSort": {
            "title": "Review sort order",
            "enum": [
              "helpful",
              "recent"
            ],
            "type": "string",
            "description": "How reviews are ordered. 'helpful' = most upvoted first (best for companies-mode top-N). 'recent' = newest first (best for ongoing sentiment monitoring).",
            "default": "helpful"
          },
          "includeAISummary": {
            "title": "Include AI review summary",
            "type": "boolean",
            "description": "Companies mode only. When the company has one, a short AI-generated summary of its reviews (pros, cons, themes) is embedded. No extra request, already in the SSR. Disable to drop the field.",
            "default": true
          },
          "includeJobs": {
            "title": "Include open jobs",
            "type": "boolean",
            "description": "Companies mode only. When true, embeds a `jobs` array on each company record with the company's currently-listed jobs (id, title, location, salary, workType, listingDate, url). Adds 1-2 extra API calls per company. Capped by `maxJobsPerCompany`.",
            "default": false
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Hard cap on jobs embedded per company when `includeJobs` is true. The actor pulls jobs page-by-page and stops as soon as this many matching jobs have been collected (or the company runs out). Set 0 to pull every open job for the company. This is THE cap on jobs; no other field overrides it.",
            "default": 50
          },
          "maxItems": {
            "title": "Max items to return",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Total cap across all URLs / search results. Default 1000, maximum 100000; 0 is read as 100000. In reviews mode counts individual reviews; in companies mode counts companies. The `maxJobsPerCompany` cap applies independently to each company's embedded jobs and is not affected by this field.",
            "default": 1000
          },
          "maxTimeSec": {
            "title": "Max run time (seconds)",
            "minimum": 0,
            "type": "integer",
            "description": "Wall-clock cap. When exceeded, the actor flushes whatever it already fetched and exits cleanly. 0 = no time limit.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Defaults to Apify datacenter proxy (free-tier friendly). For production workloads, set apifyProxyGroups to [\"RESIDENTIAL\"] on a paid Apify plan.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": []
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for companies (companies mode) or reviews (reviews mode) already collected there. Use this after an interrupted run. For recurring monitoring of the same input, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "For a company set you run on a schedule: the actor remembers a baseline for this exact input and returns only NEW or UPDATED rows next time. Companies mode tracks each company by its id and compares ratings, review counts, perks, awards, overview, embedded reviews and jobs; reviews mode tracks each review by reviewId and compares its text, ratings and fields. Scrape timestamp, upvote counts, logo/cover image URLs, the relative job listing age (listingDateDisplay) and the tracking columns (firstSeenAt, lastSeenAt, contentHash) never count as a change, and the order of embedded jobs and reviews is ignored. Unchanged rows are not returned and not billed. Rows that stop appearing are never reported as expired, because capped or filtered scans are partial. Off by default so a normal run is unchanged.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional)",
            "type": "string",
            "description": "Only used with Incremental mode. Leave empty to key the baseline automatically off this run's mode, country, URLs, keywords, industry and review settings, so two different searches never share state. Set your own text to share or isolate a baseline on purpose. The mode is always part of the key."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows (Incremental mode)",
            "type": "boolean",
            "description": "Only used with Incremental mode. By default an unchanged company or review is not returned and not billed. Turn this on to also return every unchanged row each run; every returned row is billed.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Output field names that should not make a row count as UPDATED, even when they changed. Always ignored: scrapedAt, upvotes, logoUrl, coverImageUrl, listingDateDisplay, firstSeenAt, lastSeenAt, contentHash. Matches a field name at any nesting depth (for example totalJobs or reviewCount). Ignored fields are still returned in the output.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}