{
  "openapi": "3.0.1",
  "info": {
    "title": "51job Scraper 前程无忧: China Jobs, Salary Data & Percentile Stats",
    "description": "Chinese job salary scraper and China jobs scraper for 51job (前程无忧). Get normalized monthly CNY and USD pay, salary percentiles per keyword and city, English benefit tags, recruiter reply scores, and a monitor for new, changed and expired postings. No login needed.",
    "version": "2.4",
    "x-build-id": "DAI3fimKyE9IfgVBK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~51job-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-51job-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/getascraper~51job-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-51job-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/getascraper~51job-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-51job-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": [
          "sourceMode",
          "proxyConfiguration"
        ],
        "properties": {
          "sourceMode": {
            "title": "Source mode",
            "enum": [
              "search",
              "urls"
            ],
            "type": "string",
            "description": "Build searches from the filters below, or run exact public 51job search-result URLs.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "description": "Job titles or keywords such as python, data engineer, 软件工程师, 会计, or 销售经理. Every keyword is combined with every selected city, and salary statistics are grouped per keyword and city.",
            "items": {
              "type": "string"
            },
            "default": [
              "python"
            ]
          },
          "cities": {
            "title": "Cities",
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "description": "Select one or more 51job city codes. The Actor removes duplicate jobs across the resulting search combinations.",
            "items": {
              "type": "string",
              "enum": [
                "000000",
                "010000",
                "020000",
                "030200",
                "040000",
                "180200",
                "090200",
                "080200",
                "060000",
                "070300"
              ],
              "enumTitles": [
                "All China / 全国",
                "Beijing / 北京",
                "Shanghai / 上海",
                "Guangzhou / 广州",
                "Shenzhen / 深圳",
                "Wuhan / 武汉",
                "Chengdu / 成都",
                "Hangzhou / 杭州",
                "Nanjing / 南京",
                "Suzhou / 苏州"
              ]
            },
            "default": [
              "020000"
            ]
          },
          "startUrls": {
            "title": "Direct 51job search URLs",
            "type": "array",
            "description": "Optional HTTPS links beginning with https://we.51job.com/pc/search. Detail pages and unrelated hosts are rejected.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "experience": {
            "title": "Experience required",
            "enum": [
              "all",
              "0",
              "1",
              "2",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Filter by source-published work experience requirement.",
            "default": "all"
          },
          "education": {
            "title": "Education required",
            "enum": [
              "all",
              "1",
              "2",
              "3",
              "4"
            ],
            "type": "string",
            "description": "Minimum source-published education requirement.",
            "default": "all"
          },
          "employmentType": {
            "title": "Employment type code",
            "type": "string",
            "description": "Optional 51job public-search employment-type code. Leave blank unless copied from a supported public search URL.",
            "default": ""
          },
          "companyType": {
            "title": "Company type",
            "enum": [
              "all",
              "01",
              "02",
              "03",
              "04",
              "05"
            ],
            "type": "string",
            "description": "Filter by corporate structure.",
            "default": "all"
          },
          "companySize": {
            "title": "Company size",
            "enum": [
              "all",
              "01",
              "02",
              "03",
              "04",
              "05",
              "06"
            ],
            "type": "string",
            "description": "Filter by source-published employee range.",
            "default": "all"
          },
          "industries": {
            "title": "Industry codes",
            "maxItems": 5,
            "type": "array",
            "description": "Optional source industry codes from a public 51job search URL.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "jobFunctions": {
            "title": "Job function codes",
            "maxItems": 5,
            "type": "array",
            "description": "Optional source job-function codes from a public 51job search URL.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "salaryBand": {
            "title": "Salary-band code",
            "type": "string",
            "description": "Optional salary-band code copied from a supported public 51job search URL. Leave blank for all salaries.",
            "default": ""
          },
          "postedWithin": {
            "title": "Posted-within code",
            "type": "string",
            "description": "Optional 51job issue-date code copied from a supported public search URL.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort code",
            "type": "string",
            "description": "Optional 51job public-search sort code.",
            "default": "0"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 20,
            "type": "array",
            "description": "Exclude rows whose title, company, description, industry, function, or source tags contain any supplied keyword.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "includeRecruiterSignals": {
            "title": "Include public recruiter signals",
            "type": "boolean",
            "description": "Include only source-published recruiter name, role, labels, online status, and status fields when available.",
            "default": true
          },
          "convertToUsd": {
            "title": "Add US dollar salary fields",
            "type": "boolean",
            "description": "Add monthly US dollar minimum, maximum and median salary using a free public exchange rate. The rate and its date are saved on every row. Leave off for CNY only.",
            "default": false
          },
          "onlyDisclosedSalary": {
            "title": "Only jobs with a disclosed salary",
            "type": "boolean",
            "description": "Skip jobs listed as negotiable (面议) or without a salary. Useful for pay research.",
            "default": false
          },
          "minMonthlySalaryCny": {
            "title": "Minimum monthly salary (CNY)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs whose highest listed monthly pay reaches this amount in CNY. Annual and daily pay is converted to monthly first. Jobs without a disclosed salary are excluded once this is set. Leave empty for no filter."
          },
          "dropCrossCityDuplicates": {
            "title": "Remove cross-city duplicates",
            "type": "boolean",
            "description": "When the same employer posts the same title in several of your cities, keep only the first. Off by default: duplicates are only flagged on the rows.",
            "default": false
          },
          "includeSourceFields": {
            "title": "Include the original 51job fields",
            "type": "boolean",
            "description": "Add the complete public search-result object under a source key on every row, with 51job's own field names. Useful when moving a pipeline from another 51job scraper. Off by default.",
            "default": false
          },
          "salaryStatistics": {
            "title": "Save salary statistics",
            "type": "boolean",
            "description": "Save a SALARY_STATS record with count, median, 25th and 75th percentile, minimum and maximum monthly pay per keyword and city, computed only from the jobs collected in this run.",
            "default": true
          },
          "salaryStatisticsMinSample": {
            "title": "Minimum jobs per statistic",
            "minimum": 2,
            "maximum": 1000,
            "type": "integer",
            "description": "A group is left out of the salary statistics when fewer jobs than this have a disclosed salary.",
            "default": 5
          },
          "minRecruiterResponsiveness": {
            "title": "Minimum recruiter responsiveness score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only jobs whose recruiter responsiveness score (0-100, derived from the source's own recent-reply, today's-reply-count, and resume-activity labels) meets this minimum. Jobs with no responsiveness signal at all are excluded once this is set. Leave empty for no filtering."
          },
          "maxItems": {
            "title": "Maximum output rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Global maximum across all queries and cities. The run reports when this cap prevents complete source coverage.",
            "default": 20
          },
          "maxPagesPerSearch": {
            "title": "Maximum pages per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Safety cap on public result pages fetched for each keyword-city search.",
            "default": 5
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "Full records are best for research; compact records are better for databases, alerts, and feeds.",
            "default": "full"
          },
          "monitorMode": {
            "title": "Monitoring mode",
            "enum": [
              "snapshot",
              "changes"
            ],
            "type": "string",
            "description": "Snapshot returns every matching job. Changes compares complete runs and emits only new, updated, reappeared, or safely expired jobs.",
            "default": "snapshot"
          },
          "stateName": {
            "title": "Monitoring state name",
            "type": "string",
            "description": "Stable name that separates one watchlist or schedule from another.",
            "default": "default"
          },
          "includeUnchanged": {
            "title": "Include unchanged jobs",
            "type": "boolean",
            "description": "Include unchanged rows during changes mode. Disabled by default to avoid duplicate result charges.",
            "default": false
          },
          "notifyOnNoChanges": {
            "title": "Send no-change heartbeat",
            "type": "boolean",
            "description": "Send a webhook heartbeat when a complete monitoring run finds no selected changes.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Datacenter routing is the tested default and keeps proxy cost low. Switch to Residential with Singapore, Hong Kong, or Japan only if a larger run is blocked or rate-limited.",
            "default": {
              "useApifyProxy": true
            }
          },
          "url": {
            "title": "Search URL (migration alias)",
            "type": "string",
            "description": "Alias for a single 51job search URL, for pipelines built against another 51job scraper. When filled, it replaces the keyword and city search. Prefer Direct 51job search URLs above."
          },
          "max_page": {
            "title": "Maximum pages (migration alias)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Alias for Maximum pages per search. 0 means no limit."
          },
          "max_results": {
            "title": "Maximum results (migration alias)",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Alias for Maximum output rows. 0 means the largest allowed run (5,000)."
          },
          "notificationWebhookUrl": {
            "title": "Change notification webhook URL",
            "type": "string",
            "description": "Optional secret HTTPS endpoint for a bounded JSON change summary. It is used only in changes mode."
          },
          "notificationEvents": {
            "title": "Notification events",
            "maxItems": 4,
            "uniqueItems": true,
            "type": "array",
            "description": "Change types that can trigger the webhook.",
            "items": {
              "type": "string",
              "enum": [
                "NEW",
                "UPDATED",
                "REAPPEARED",
                "EXPIRED"
              ],
              "enumTitles": [
                "New jobs",
                "Updated jobs",
                "Reappeared jobs",
                "Expired jobs"
              ]
            },
            "default": [
              "NEW",
              "UPDATED",
              "REAPPEARED",
              "EXPIRED"
            ]
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}