{
  "openapi": "3.0.1",
  "info": {
    "title": "Paylocity Jobs API",
    "description": "Live jobs from any Paylocity recruiting board, no keys. Built-in company discovery across thousands of tenants, plus new-postings change detection. Returns titles, locations, departments, structured salaries, and full descriptions as JSON, Markdown, or text. Pay only for rows delivered.",
    "version": "0.0",
    "x-build-id": "yDiRhT6NTbIdjr106"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/johnvc~paylocity-jobs-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-johnvc-paylocity-jobs-api",
        "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/johnvc~paylocity-jobs-api/runs": {
      "post": {
        "operationId": "runs-sync-johnvc-paylocity-jobs-api",
        "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/johnvc~paylocity-jobs-api/run-sync": {
      "post": {
        "operationId": "run-sync-johnvc-paylocity-jobs-api",
        "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",
        "properties": {
          "companies": {
            "title": "Companies (names, GUIDs, or URLs)",
            "type": "array",
            "description": "Paylocity boards to scrape, mixed freely: a board GUID (0062c37f-a34c-479c-978c-bd800d23f223), a full board URL (https://recruiting.paylocity.com/recruiting/jobs/All/{guid}/{slug}), or a bare company name (matched against boards discovered from the public web archive). Leave empty and turn on discoverAll to enumerate every Paylocity board instead.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Alternative to the companies field for URL-shaped input; both lists are merged. Accepts recruiting.paylocity.com board URLs of the form /recruiting/jobs/All/{guid}/{slug}.",
            "items": {
              "type": "object"
            }
          },
          "discoverAll": {
            "title": "Discover all Paylocity boards",
            "type": "boolean",
            "description": "Enumerate every Paylocity recruiting board from the public Common Crawl web archive, then scrape jobs from a sample capped at maxCompanies. Combine with discoverOnly to return just the company directory. No input list is needed when this is on.",
            "default": false
          },
          "discoverOnly": {
            "title": "Discover companies only (skip jobs)",
            "type": "boolean",
            "description": "Return one lightweight company row per discovered tenant (board GUID, URL, live job count, locations, departments) and skip job scraping entirely. Billed only for live-verified tenants; unverified and dead tenants are free. Turn on discoverAll or provide companies to choose the tenant set.",
            "default": false
          },
          "discoveryQuery": {
            "title": "Discovery query",
            "type": "string",
            "description": "Case-insensitive text matched against the board slug and GUID when discovering boards. Scopes discoverAll and discoverOnly runs. Leave empty to sample across all discovered boards.",
            "default": ""
          },
          "crawlDepth": {
            "title": "Discovery crawl depth",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many monthly Common Crawl snapshots to union when discovering boards. Higher values find more (and older) boards at the cost of a slower discovery pass. Only used when discovering.",
            "default": 2
          },
          "titleKeywords": {
            "title": "Job title keywords",
            "type": "array",
            "description": "Keep only jobs whose title contains any of these words, for example nurse, engineer, driver. Case-insensitive. Filters run before billing, so filtered jobs cost nothing.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department contains",
            "type": "array",
            "description": "Keep only jobs whose hiring department contains any of these values. Note that many Paylocity employers leave the department blank; those jobs are filtered out when this is set.",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location contains",
            "type": "array",
            "description": "Keep only jobs whose location, city, state, or address contains any of these values, for example Remote, Indiana, South Bend.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs the board flags as remote.",
            "default": false
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only jobs whose employment type matches any of these values, for example FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN. Employment type comes from the job detail page, so this filter runs after the detail fetch but still before billing.",
            "items": {
              "type": "string"
            }
          },
          "newerThan": {
            "title": "Newer than (change detection)",
            "type": "string",
            "description": "Keep only jobs published on or after this cutoff. Accepts a relative window (24h, 7d, 2w) or an ISO date or datetime (2026-08-01 or 2026-08-01T12:00:00Z). Applied to the listing's published date before the detail fetch, so a daily schedule with 25h only fully processes what changed. No state to manage between runs.",
            "default": ""
          },
          "cutoffField": {
            "title": "Cutoff field",
            "enum": [
              "posted",
              "updated"
            ],
            "type": "string",
            "description": "Which timestamp newerThan compares against. Paylocity publishes a single posting timestamp per job, so both options filter on the listing's published date; the field is kept for parity with other job-board APIs.",
            "default": "updated"
          },
          "includeDescriptionMarkdown": {
            "title": "Description as Markdown (paid add-on)",
            "type": "boolean",
            "description": "Add descriptionMarkdown to each job row: the posting converted to clean Markdown, compact and ready for AI agents. Billed per job row that carries it. The base row already includes the source-HTML description at no extra charge.",
            "default": false
          },
          "includeDescriptionText": {
            "title": "Description as plain text (paid add-on)",
            "type": "boolean",
            "description": "Add descriptionText to each job row: the posting flattened to plain prose. Billed per job row that carries it.",
            "default": false
          },
          "verifyLive": {
            "title": "Verify boards live (discovery)",
            "type": "boolean",
            "description": "Discovery modes only: fetch each discovered board to confirm it is live and read its current job count, locations, and departments. Only live or empty verified tenants are billed as company results. Turn off to list discovered tenants unverified and free.",
            "default": true
          },
          "includeInactive": {
            "title": "Include dead boards (discovery)",
            "type": "boolean",
            "description": "Discovery modes only: also return boards that no longer respond (status dead). Dead and unverified rows are always delivered free. Off by default so a discovery run returns only serving boards.",
            "default": false
          },
          "report": {
            "title": "Whole-run report (paid add-on)",
            "enum": [
              "none",
              "markdown",
              "html"
            ],
            "type": "string",
            "description": "Also write a human-readable digest of every scraped job, grouped by company, to the key-value store under the REPORT key. One flat charge per report. Capped at 5000 rows. Applies to job runs only.",
            "default": "none"
          },
          "maxCompanies": {
            "title": "Max companies",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap on how many boards a discovery run processes, sampled evenly across the discovered keyspace. Keeps discovery runs small and predictable.",
            "default": 25
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on job rows per board after filtering. 0 means no per-company cap.",
            "default": 0
          },
          "maxJobs": {
            "title": "Max jobs for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "Hard ceiling on job rows across the entire run, all boards combined. The main cost control. 0 means unlimited.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel per-job detail requests and per-board verification probes.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The public recruiting boards answer direct connections, so leave this off unless your network requires a proxy.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}