{
  "openapi": "3.0.1",
  "info": {
    "title": "OnlineJobs.ph Job Radar Actor",
    "description": "Scrape job listings from OnlineJobs.ph, the largest Filipino remote job board. Search by keywords, filter by recency, and get structured job data with title, salary, employer, and direct links.",
    "version": "0.1",
    "x-build-id": "y1reYofpDt6FxyTFi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vjkhush~onlinejobsph-job-radar-actor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vjkhush-onlinejobsph-job-radar-actor",
        "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/vjkhush~onlinejobsph-job-radar-actor/runs": {
      "post": {
        "operationId": "runs-sync-vjkhush-onlinejobsph-job-radar-actor",
        "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/vjkhush~onlinejobsph-job-radar-actor/run-sync": {
      "post": {
        "operationId": "run-sync-vjkhush-onlinejobsph-job-radar-actor",
        "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": [
          "maximumItems"
        ],
        "properties": {
          "keywords": {
            "title": "🧠 Keywords (multi)",
            "type": "array",
            "description": "Add one or more role/skill keywords. Each keyword becomes a separate search on OnlineJobs.ph. Examples: \"web developer\", \"virtual assistant\", \"graphic designer\", \"data entry\". Comma-separated values inside a single entry are also supported.",
            "default": [
              "virtual assistant"
            ],
            "items": {
              "type": "string"
            }
          },
          "keyword": {
            "title": "🧠 Single keyword (optional)",
            "type": "string",
            "description": "Optional fallback keyword if you prefer a single text field. Comma-separated values are supported (e.g. \"SEO, content writer\"). If both this and Keywords above are provided, they are merged.",
            "default": ""
          },
          "maximumItems": {
            "title": "🎯 Target results",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum number of job records to output. The actor stops crawling once this limit is reached. Actual results may be fewer if the search yields less or recency filters narrow the set. Each result requires a detail page visit, so higher values take longer.",
            "default": 50
          },
          "dateFilter": {
            "title": "🕒 Posting freshness",
            "enum": [
              "LAST_24_HOURS",
              "LAST_3_DAYS"
            ],
            "type": "string",
            "description": "Only keep jobs posted within this window. \"Last 3 days\" is the default and recommended for daily monitoring. \"Last 24 hours\" is stricter — useful for high-volume keywords.",
            "default": "LAST_3_DAYS"
          },
          "companyName": {
            "title": "🏢 Company contains",
            "type": "string",
            "description": "Optional filter: only keep jobs where the employer name contains this text. Case-insensitive substring match. Leave empty to include all employers.",
            "default": ""
          },
          "remoteWork": {
            "title": "🏡 Remote-first only",
            "type": "boolean",
            "description": "Enable to keep only jobs that mention remote, hybrid, work-from-home, or home-based in the title or description. Note: most OnlineJobs.ph listings are already remote by nature.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🛰 Proxy mode",
            "type": "object",
            "description": "Proxy setup for request routing and anti-block resilience. If you see frequent 403 errors or blocked pages, switch to residential proxies or lower concurrency."
          },
          "maxListingPages": {
            "title": "📄 Listing page cap",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum number of listing pages to crawl per keyword. Each page has ~30 results. Keep low since each result also needs a detail page visit.",
            "default": 3
          },
          "maxConcurrency": {
            "title": "⚡ Parallel pages",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of browser pages running at the same time. Keep at 1 for stability — OnlineJobs.ph is aggressive with rate limiting. Increase only if you have high-quality residential proxies.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "🔁 Retry budget",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request before giving up. Higher values improve resilience against transient blocks but increase run time.",
            "default": 3
          },
          "minListingDelayMs": {
            "title": "⏱ Min page pause (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Minimum random delay (in milliseconds) before parsing each listing page. Adds human-like pacing to reduce detection. 700ms is a safe default.",
            "default": 700
          },
          "maxListingDelayMs": {
            "title": "⏱ Max page pause (ms)",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Maximum random delay (in milliseconds) before parsing each listing page. The actual delay is randomized between min and max. 2200ms is a safe default.",
            "default": 2200
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}