{
  "openapi": "3.0.1",
  "info": {
    "title": "Liepin Scraper 猎聘: Jobs, Salary & Change Tracking",
    "description": "Liepin scraper for public China white-collar job postings, with cross-run change tracking (new/updated/removed jobs). Export source URLs, CNY salary ranges, requirements, locations, and company context in clean, analysis-ready rows.",
    "version": "1.3",
    "x-build-id": "dA1TmwuHYnHlqmmuJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~liepin-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-liepin-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~liepin-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-liepin-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~liepin-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-liepin-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": [
          "scrapeMode"
        ],
        "properties": {
          "scrapeMode": {
            "title": "How do you want to find jobs?",
            "enum": [
              "home",
              "search",
              "urls"
            ],
            "type": "string",
            "description": "Pick the simplest mode that fits your use case. 'home' grabs today's featured jobs (fastest). 'search' lets you filter by keyword and city. 'urls' is for pasting direct search links.",
            "default": "home"
          },
          "keyword": {
            "title": "Search Keyword",
            "type": "string",
            "description": "Free-text keyword (e.g. 'python', 'sales').",
            "default": "python"
          },
          "startUrls": {
            "title": "Direct Start URLs",
            "type": "array",
            "description": "Only used when scrapeMode is 'urls'. Paste specific Liepin search web links.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "city": {
            "title": "Target City",
            "enum": [
              "all",
              "010",
              "020",
              "030",
              "040",
              "180",
              "090",
              "080",
              "060",
              "070",
              "050",
              "230",
              "240",
              "280"
            ],
            "type": "string",
            "description": "Pick the city to focus the search on. 'all' searches nationwide.",
            "default": "010"
          },
          "pagesPerQuery": {
            "title": "Pages to Crawl",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many search result pages to walk through. Each page has up to 40 jobs.",
            "default": 3
          },
          "includeJobDetail": {
            "title": "Fetch Full Job Description?",
            "type": "boolean",
            "description": "Optionally visit each public job page for its description. Listing rows are preserved when a detail page is unavailable.",
            "default": false
          },
          "monitorMode": {
            "title": "Monitoring mode",
            "enum": [
              "snapshot",
              "changes_only"
            ],
            "type": "string",
            "description": "'Snapshot' (default) returns every matching job on every run, exactly like before. 'Track changes' remembers jobs across runs (scoped by Watchlist name below) and returns only new, updated, and removed jobs, so a recurring schedule never re-delivers the same job. A removed job is only reported after two consecutive complete scans confirm it, so one blocked run never falsely reports a job as gone.",
            "default": "snapshot"
          },
          "stateName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Only used with 'Track changes'. Runs sharing this name track new/updated/removed jobs together; use a different name for each independent keyword or schedule so their histories never mix.",
            "default": "default"
          },
          "includeUnchanged": {
            "title": "Also include unchanged jobs",
            "type": "boolean",
            "description": "Only used with 'Track changes'. By default only new, updated, and removed jobs are returned. Turn this on to also get a row for every job that scraped identically to last run.",
            "default": false
          },
          "maxItems": {
            "title": "Max Jobs to Extract",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on records returned.",
            "default": 25
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "For 'search' and 'urls' modes, Residential is used automatically unless you set your own groups here, since Liepin's search pages are gated by an IP-based access challenge. 'home' mode never needs a proxy, since that surface is not gated at all.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}