{
  "data": {
    "id": "MiuZfLBEFxbiXz4Uj",
    "actId": "vxRSmgrG9noDPw1BM",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-02T23:03:03.194Z",
    "finishedAt": "2026-11-02T23:03:32.184Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 28843,
      "runTimeSecs": 28.843,
      "computeUnits": 0.03204777777777778,
      "imageSizeBytes": 3291489280
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"ZipRecruiter Jobs & Salary Scraper Input\",\n  \"description\": \"Search ZipRecruiter jobs by keyword, location or company, scrape exact URLs, or read salary benchmarks. Descriptions, benefits, company profiles and structured pay are optional.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What do you want to scrape?\",\n      \"type\": \"string\",\n      \"description\": \"Search job postings, scrape URLs you already have, or get salary benchmarks for a role and location.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byUrls\",\n        \"salary\"\n      ],\n      \"enumTitles\": [\n        \"Search jobs\",\n        \"Scrape specific URLs\",\n        \"Salary benchmarks\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search keywords\",\n      \"type\": \"array\",\n      \"description\": \"Job titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": [\n        \"registered nurse\"\n      ]\n    },\n    \"locations\": {\n      \"title\": \"Locations\",\n      \"type\": \"array\",\n      \"description\": \"Cities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [\n        \"United States\"\n      ],\n      \"prefill\": [\n        \"Chicago, IL\"\n      ]\n    },\n    \"companyName\": {\n      \"title\": \"Company name\",\n      \"type\": \"string\",\n      \"description\": \"Only jobs from this employer, e.g. `Visa`. Leave the keywords empty to browse every open role at the company.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\"\n    },\n    \"startUrls\": {\n      \"title\": \"ZipRecruiter URLs\",\n      \"type\": \"array\",\n      \"description\": \"Search, job, company or salary URLs. Use this with `Scrape specific URLs`; filters already in a search URL are kept.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"jobType\": {\n      \"title\": \"Job type\",\n      \"type\": \"string\",\n      \"description\": \"Employment-type filter for keyword searches.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"full_time\",\n        \"part_time\",\n        \"contract\",\n        \"contract_to_hire\",\n        \"temporary\",\n        \"as_needed\",\n        \"other\",\n        \"internship\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Full-time\",\n        \"Part-time\",\n        \"Contract\",\n        \"Contract to hire\",\n        \"Temporary\",\n        \"As needed\",\n        \"Other\",\n        \"Internship\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"workplace\": {\n      \"title\": \"Workplace type\",\n      \"type\": \"string\",\n      \"description\": \"Work arrangement for keyword searches.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"remote\",\n        \"hybrid\",\n        \"onsite\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Remote\",\n        \"Hybrid\",\n        \"On-site\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"experienceLevels\": {\n      \"title\": \"Experience levels\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to one or more seniority levels. Empty means no filter.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"no_experience\",\n          \"junior\",\n          \"mid\",\n          \"senior\"\n        ],\n        \"enumTitles\": [\n          \"No experience\",\n          \"Junior\",\n          \"Mid\",\n          \"Senior\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"daysPosted\": {\n      \"title\": \"Posted within (days)\",\n      \"type\": \"integer\",\n      \"description\": \"Only jobs posted within the last N days. 0 means any time.\",\n      \"minimum\": 0,\n      \"maximum\": 30,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"radiusMiles\": {\n      \"title\": \"Search radius (miles)\",\n      \"type\": \"integer\",\n      \"description\": \"Distance around each location. 0 uses ZipRecruiter's default.\",\n      \"minimum\": 0,\n      \"maximum\": 100,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"salaryMin\": {\n      \"title\": \"Minimum annual salary (USD)\",\n      \"type\": \"integer\",\n      \"description\": \"Only jobs whose advertised annual pay reaches this amount. 0 means no lower bound.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"salaryMax\": {\n      \"title\": \"Maximum annual salary (USD)\",\n      \"type\": \"integer\",\n      \"description\": \"Only jobs whose advertised annual pay stays at or below this amount. Best effort; 0 means no upper bound.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"fetchDescriptions\": {\n      \"title\": \"Fetch full descriptions\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each posting's detail page for the complete description, benefits, company profile and apply details. Off gives faster card-only rows.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeCompanyProfile\": {\n      \"title\": \"Include company profile\",\n      \"type\": \"boolean\",\n      \"description\": \"Add industry, website, size, headquarters, rating and about text from the posting's company data.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxItems\": {\n      \"title\": \"Max records\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of job or salary records to return across all searches and URLs.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 3\n    },\n    \"maxSearches\": {\n      \"title\": \"Max searches\",\n      \"type\": \"integer\",\n      \"description\": \"Cap on keyword × location combinations in search mode.\",\n      \"minimum\": 1,\n      \"maximum\": 100,\n      \"default\": 100,\n      \"prefill\": 1\n    },\n    \"salaryRoles\": {\n      \"title\": \"Salary roles\",\n      \"type\": \"array\",\n      \"description\": \"Job titles for salary benchmarks, e.g. `registered nurse` or `data analyst`. Used in salary mode.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": [\n        \"registered nurse\"\n      ]\n    },\n    \"salaryLocations\": {\n      \"title\": \"Salary locations\",\n      \"type\": \"array\",\n      \"description\": \"Cities, states or `United States` for salary benchmarks. Every role is looked up in every location.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [\n        \"United States\"\n      ],\n      \"prefill\": [\n        \"Chicago, IL\"\n      ]\n    },\n    \"salaryUrls\": {\n      \"title\": \"Salary page URLs\",\n      \"type\": \"array\",\n      \"description\": \"Exact ZipRecruiter `/Salaries/...` URLs. When set, these are used instead of role and location pairs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    }\n  },\n  \"required\": []\n}",
    "readme": "# ZipRecruiter Jobs & Salary Scraper\n\nCollect **ZipRecruiter job postings and salary benchmarks** in one run. Search by keyword across locations, browse a single employer, paste search/job/company URLs, or ask for salary percentiles by role and city. Job rows carry the full description, structured pay with a source flag, benefits, company profile, dates and the real apply destination.\n\n## What this actor does\n\n- **Three modes:** search jobs, scrape exact URLs, or read salary benchmarks.\n- **Multi-query × multi-location:** every keyword is searched in every location, deduplicated by ZipRecruiter's own job identity.\n- **Company-scoped search:** set a company name or paste a `/co/<company>/Jobs` URL to get only that employer's postings.\n- **Rich job rows:** full description text and HTML, structured pay (min/max, period, currency, annualized values, provided vs predicted), benefits, workplace and employment types, posting dates, education, skills, company industry/website/size/HQ/rating, and apply links.\n- **Salary directory:** median, 10th/25th/75th/90th percentile, average annual and hourly pay, related titles and top-paying cities — something plain job-board scrapers usually skip.\n- **Filters that work:** employment type, remote/hybrid/on-site, experience level, posted within N days, radius, and minimum salary (maximum is best effort).\n- **HTTP-first and cheap:** search, detail and salary pages are fetched directly with a Safari TLS profile. A headed browser with a US residential exit is used automatically only when the source challenges the request.\n- **No setup:** no cookies, account, API key or proxy configuration. Omit-empty everywhere: a value the source does not show is left out, never sent as `null`.\n\n## Modes\n\n| Mode | What it reads | Example input |\n|---|---|---|\n| `search` | Keyword × location searches, or a company name | `searchQueries: [\"registered nurse\"]`, `locations: [\"Chicago, IL\"]` |\n| `byUrls` | Search, job, company or salary URLs you already have | `startUrls: [\"https://www.ziprecruiter.com/c/...\"]` |\n| `salary` | Salary pages for role × location, or exact salary URLs | `salaryRoles: [\"data analyst\"]`, `salaryLocations: [\"Austin, TX\"]` |\n\n## Output\n\nJob records use `type: job_ziprecruiter` and `recordType: job`.\n\nIdentity: `id`, `jid`, `listingKey`, `openSeatId`, `matchId`, `url`, `title`.\n\nCompany: `company`, `companyId`, `companyUrl`, `companyLogo`, `companyWebsite`, `companyIndustries`, `companySize`, `companyHqLocation`, `companyRating`, `companyAbout`, `companyFoundedYear`.\n\nLocation: `location`, `city`, `state`, `country`, `countryCode`, `postalCode`, `county`, `locationId`, `workplaceTypes`, `isRemote`, `isHybrid`.\n\nPay: `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `salaryMinAnnual`, `salaryMaxAnnual`, `salarySource` (`provided`, `parsed`, `predicted` or `missing`), `isEstimatedSalary`.\n\nJob: `description`, `descriptionHtml`, `shortDescription`, `employmentTypes`, `benefits`, `educationLevels`, `experienceMonths`, `postedAt`, `rollingPostedAt`, `postedAgo`, `validThrough`, `isActive`, `isNew`, `skills`, `occupationalCategory`, `industry`.\n\nApply and meta: `applyUrl`, `applyType`, `directApply`, `shareUrl`, `inputUrl`, `searchQuery`, `descriptionFetchFailed`, `scrapedAt`.\n\nSalary records use `type: salary_ziprecruiter` and `recordType: salary`: `salaryRole`, `salaryLocation`, `salaryMedian`, `salaryP10`, `salaryP25`, `salaryP75`, `salaryP90`, `salaryAverage`, `salaryAverageHourly`, `salaryCurrency`, `salaryPeriod`, `salaryUrl`, `relatedTitles`, `topPayingCities`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | Select | `search` | `search`, `byUrls` or `salary` |\n| `searchQueries` | String list | `[]` | Keywords searched in every location |\n| `locations` | String list | `[\"United States\"]` | Cities, states, ZIPs or nationwide |\n| `companyName` | String | – | Only this employer's jobs; empty keywords browse all of them |\n| `startUrls` | String list | `[]` | Search, job, company or salary URLs for `byUrls` |\n| `jobType` | Select | `any` | `full_time`, `part_time`, `contract`, `contract_to_hire`, `temporary`, `as_needed`, `other`, `internship` |\n| `workplace` | Select | `any` | `remote`, `hybrid`, `onsite` |\n| `experienceLevels` | Multi-select | `[]` | `no_experience`, `junior`, `mid`, `senior` |\n| `daysPosted` | Integer | `0` | Posted within N days (0–30); 0 = any |\n| `radiusMiles` | Integer | `0` | Radius around each location (0–100); 0 = default |\n| `salaryMin` | Integer | `0` | Annual minimum; 0 = any |\n| `salaryMax` | Integer | `0` | Annual maximum (best effort); 0 = any |\n| `fetchDescriptions` | Boolean | `true` | Fetch detail pages for full descriptions and pay |\n| `includeCompanyProfile` | Boolean | `true` | Add industry, website, size, HQ, rating and about |\n| `maxItems` | Integer | `50` | Total records across all searches |\n| `maxSearches` | Integer | `100` | Cap on keyword × location searches |\n| `salaryRoles` | String list | `[]` | Role titles for `salary` mode |\n| `salaryLocations` | String list | `[\"United States\"]` | Locations for `salary` mode |\n| `salaryUrls` | String list | `[]` | Exact `/Salaries/...` URLs; overrides role/location pairs |\n\n### Example: keyword search with filters\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"registered nurse\"],\n  \"locations\": [\"Chicago, IL\"],\n  \"jobType\": \"full_time\",\n  \"daysPosted\": 7,\n  \"maxItems\": 50\n}\n```\n\n### Example: several queries and locations\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"data engineer\", \"analytics engineer\"],\n  \"locations\": [\"Texas\", \"Florida\"],\n  \"workplace\": \"remote\",\n  \"experienceLevels\": [\"senior\"],\n  \"salaryMin\": 120000,\n  \"maxItems\": 200\n}\n```\n\n### Example: one company's openings\n\n```json\n{\n  \"mode\": \"search\",\n  \"companyName\": \"Visa\",\n  \"locations\": [\"United States\"],\n  \"fetchDescriptions\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: exact URLs\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"startUrls\": [\n    \"https://www.ziprecruiter.com/jobs-search?search=fire+alarm+technician&location=New+York%2C+NY&days=7\",\n    \"https://www.ziprecruiter.com/c/Company/Job/Title/-in-Chicago,IL?jid=abcdef1234567890\",\n    \"https://www.ziprecruiter.com/co/Visa/Jobs\"\n  ],\n  \"maxItems\": 100\n}\n```\n\n### Example: salary benchmarks\n\n```json\n{\n  \"mode\": \"salary\",\n  \"salaryRoles\": [\"software engineer\", \"data analyst\"],\n  \"salaryLocations\": [\"New York, NY\", \"Austin, TX\"],\n  \"maxItems\": 10\n}\n```\n\n## Use cases\n\n- **Talent intelligence:** follow hiring volume and role mix for a company, city or industry.\n- **Compensation research:** compare provided versus predicted pay and build salary bands from percentiles.\n- **Recruiting pipelines:** export clean rows with real apply links and workplace types.\n- **Remote-work tracking:** measure remote, hybrid and on-site mixes across markets.\n- **Job-board products:** refresh an internal board with scheduled runs and deduplicate on `jid`.\n\n## Limitations\n\n- ZipRecruiter's public data has no latitude/longitude, so this actor does not invent coordinates.\n- Search results arrive in ZipRecruiter's own order; the public site ignores sort parameters, so no sort input is offered.\n- One search is capped at roughly 10,000 results. Split broad topics by keyword, location or filter for more.\n- The salary maximum filter is best effort because ZipRecruiter's ceiling parameter does not narrow reliably; the minimum filter is server-side and is also checked on each row.\n- `salarySource: predicted` means ZipRecruiter estimated the range, not that the employer published it. Values are kept and flagged rather than silently mixed with provided pay.\n- US and Canada listings on ziprecruiter.com are covered. The separate UK and Ireland sites are not.\n- A very broad run can hit detail-page rate limits; the actor pauses, backs off and keeps card rows with `descriptionFetchFailed` instead of failing the whole run.\n\n## FAQ\n\n**Do I need a ZipRecruiter account, cookies or a proxy?**\nNo. Only public pages are read, and the actor chooses its own network path. There is nothing to configure.\n\n**What is the difference between the three modes?**\n`search` discovers jobs from keywords, locations or a company. `byUrls` reads exact search, job, company or salary URLs. `salary` reads salary benchmark pages and returns percentile/average pay.\n\n**Why do some rows have no salary?**\nZipRecruiter does not publish pay for every posting. When it shows an estimated range, the row is marked `salarySource: predicted` and `isEstimatedSalary: true`; when it shows nothing, the pay fields are omitted rather than filled with zero.\n\n**Do I get the full job description?**\nYes when `fetchDescriptions` is on. It returns both plain text and HTML. Turn it off for faster, cheaper card-only runs.\n\n**What does `descriptionFetchFailed: true` mean?**\nThe detail page could not be read for that posting, so the row was kept from search-card data. Re-run those job URLs later if you need the description.\n\n**Why is the same job missing from a second search?**\nJobs are deduplicated by ZipRecruiter's job id across every query and location in the run, so a posting found twice is delivered once. Running the same search on another day can return different rows as ZipRecruiter re-ranks and refreshes listings.\n\n**How current is the salary data?**\nSalary pages are ZipRecruiter's own estimates and are returned as shown, including median, percentiles, average annual/hourly pay, related titles and top-paying cities. They are benchmarks, not offers.\n\n**Can I filter for 1-Click Apply jobs?**\nThere is no reliable server-side filter for it, so it is not exposed as an input. `applyType` on each row tells you whether the application is external, internal or quick-apply.\n\n**How many results can I get?**\n`maxItems` supports up to 10,000 per run, and that also matches ZipRecruiter's per-search ceiling. For larger datasets, split the work into multiple runs by keyword or location.\n\n**Is this affiliated with ZipRecruiter?**\nNo. It is an independent tool that reads ZipRecruiter's public job and salary data.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "ziprecruiter-job-search-results-and-salary-scraper",
      "title": "ZipRecruiter Jobs & Salary Scraper",
      "description": "Scrape ZipRecruiter job postings by keyword, location, company or URL with full descriptions, structured pay and source, benefits, company profiles and apply links, plus salary benchmarks.",
      "version": "1.0",
      "buildTag": "latest",
      "minMemoryMbytes": 1024,
      "maxMemoryMbytes": 4096,
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "meta": {
        "templateId": "python-playwright"
      },
      "input": {
        "title": "ZipRecruiter Jobs & Salary Scraper Input",
        "description": "Search ZipRecruiter jobs by keyword, location or company, scrape exact URLs, or read salary benchmarks. Descriptions, benefits, company profiles and structured pay are optional.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What do you want to scrape?",
            "type": "string",
            "description": "Search job postings, scrape URLs you already have, or get salary benchmarks for a role and location.",
            "editor": "select",
            "enum": [
              "search",
              "byUrls",
              "salary"
            ],
            "enumTitles": [
              "Search jobs",
              "Scrape specific URLs",
              "Salary benchmarks"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Job titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": [
              "registered nurse"
            ]
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [
              "United States"
            ],
            "prefill": [
              "Chicago, IL"
            ]
          },
          "companyName": {
            "title": "Company name",
            "type": "string",
            "description": "Only jobs from this employer, e.g. `Visa`. Leave the keywords empty to browse every open role at the company.",
            "editor": "textfield",
            "default": ""
          },
          "startUrls": {
            "title": "ZipRecruiter URLs",
            "type": "array",
            "description": "Search, job, company or salary URLs. Use this with `Scrape specific URLs`; filters already in a search URL are kept.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "jobType": {
            "title": "Job type",
            "type": "string",
            "description": "Employment-type filter for keyword searches.",
            "editor": "select",
            "enum": [
              "any",
              "full_time",
              "part_time",
              "contract",
              "contract_to_hire",
              "temporary",
              "as_needed",
              "other",
              "internship"
            ],
            "enumTitles": [
              "Any",
              "Full-time",
              "Part-time",
              "Contract",
              "Contract to hire",
              "Temporary",
              "As needed",
              "Other",
              "Internship"
            ],
            "default": "any",
            "prefill": "any"
          },
          "workplace": {
            "title": "Workplace type",
            "type": "string",
            "description": "Work arrangement for keyword searches.",
            "editor": "select",
            "enum": [
              "any",
              "remote",
              "hybrid",
              "onsite"
            ],
            "enumTitles": [
              "Any",
              "Remote",
              "Hybrid",
              "On-site"
            ],
            "default": "any",
            "prefill": "any"
          },
          "experienceLevels": {
            "title": "Experience levels",
            "type": "array",
            "description": "Restrict to one or more seniority levels. Empty means no filter.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "no_experience",
                "junior",
                "mid",
                "senior"
              ],
              "enumTitles": [
                "No experience",
                "Junior",
                "Mid",
                "Senior"
              ]
            },
            "default": [],
            "prefill": []
          },
          "daysPosted": {
            "title": "Posted within (days)",
            "type": "integer",
            "description": "Only jobs posted within the last N days. 0 means any time.",
            "minimum": 0,
            "maximum": 30,
            "default": 0,
            "prefill": 0
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "type": "integer",
            "description": "Distance around each location. 0 uses ZipRecruiter's default.",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "prefill": 0
          },
          "salaryMin": {
            "title": "Minimum annual salary (USD)",
            "type": "integer",
            "description": "Only jobs whose advertised annual pay reaches this amount. 0 means no lower bound.",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0,
            "prefill": 0
          },
          "salaryMax": {
            "title": "Maximum annual salary (USD)",
            "type": "integer",
            "description": "Only jobs whose advertised annual pay stays at or below this amount. Best effort; 0 means no upper bound.",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0,
            "prefill": 0
          },
          "fetchDescriptions": {
            "title": "Fetch full descriptions",
            "type": "boolean",
            "description": "Fetch each posting's detail page for the complete description, benefits, company profile and apply details. Off gives faster card-only rows.",
            "default": true,
            "prefill": false
          },
          "includeCompanyProfile": {
            "title": "Include company profile",
            "type": "boolean",
            "description": "Add industry, website, size, headquarters, rating and about text from the posting's company data.",
            "default": true,
            "prefill": false
          },
          "maxItems": {
            "title": "Max records",
            "type": "integer",
            "description": "Maximum number of job or salary records to return across all searches and URLs.",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 3
          },
          "maxSearches": {
            "title": "Max searches",
            "type": "integer",
            "description": "Cap on keyword × location combinations in search mode.",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "prefill": 1
          },
          "salaryRoles": {
            "title": "Salary roles",
            "type": "array",
            "description": "Job titles for salary benchmarks, e.g. `registered nurse` or `data analyst`. Used in salary mode.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": [
              "registered nurse"
            ]
          },
          "salaryLocations": {
            "title": "Salary locations",
            "type": "array",
            "description": "Cities, states or `United States` for salary benchmarks. Every role is looked up in every location.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [
              "United States"
            ],
            "prefill": [
              "Chicago, IL"
            ]
          },
          "salaryUrls": {
            "title": "Salary page URLs",
            "type": "array",
            "description": "Exact ZipRecruiter `/Salaries/...` URLs. When set, these are used instead of role and location pairs.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "ZipRecruiter Jobs & Salary Scraper Output",
        "description": "One flat dataset with job postings and salary benchmark records. Job rows carry the full description, structured pay, company profile, benefits, dates and apply link; salary rows carry median, percentile and average pay.",
        "type": "object",
        "properties": {
          "jobs": {
            "type": "string",
            "title": "ZipRecruiter job postings",
            "description": "Job rows (type `job_ziprecruiter`) with description, pay, company, location, benefits, dates and apply details.",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=jobs"
          },
          "salaries": {
            "type": "string",
            "title": "Salary benchmarks",
            "description": "Salary rows (type `salary_ziprecruiter`) with median, percentile, average, related titles and top-paying cities.",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=salaries"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# ZipRecruiter Jobs & Salary Scraper\n\nCollect **ZipRecruiter job postings and salary benchmarks** in one run. Search by keyword across locations, browse a single employer, paste search/job/company URLs, or ask for salary percentiles by role and city. Job rows carry the full description, structured pay with a source flag, benefits, company profile, dates and the real apply destination.\n\n## What this actor does\n\n- **Three modes:** search jobs, scrape exact URLs, or read salary benchmarks.\n- **Multi-query × multi-location:** every keyword is searched in every location, deduplicated by ZipRecruiter's own job identity.\n- **Company-scoped search:** set a company name or paste a `/co/<company>/Jobs` URL to get only that employer's postings.\n- **Rich job rows:** full description text and HTML, structured pay (min/max, period, currency, annualized values, provided vs predicted), benefits, workplace and employment types, posting dates, education, skills, company industry/website/size/HQ/rating, and apply links.\n- **Salary directory:** median, 10th/25th/75th/90th percentile, average annual and hourly pay, related titles and top-paying cities — something plain job-board scrapers usually skip.\n- **Filters that work:** employment type, remote/hybrid/on-site, experience level, posted within N days, radius, and minimum salary (maximum is best effort).\n- **HTTP-first and cheap:** search, detail and salary pages are fetched directly with a Safari TLS profile. A headed browser with a US residential exit is used automatically only when the source challenges the request.\n- **No setup:** no cookies, account, API key or proxy configuration. Omit-empty everywhere: a value the source does not show is left out, never sent as `null`.\n\n## Modes\n\n| Mode | What it reads | Example input |\n|---|---|---|\n| `search` | Keyword × location searches, or a company name | `searchQueries: [\"registered nurse\"]`, `locations: [\"Chicago, IL\"]` |\n| `byUrls` | Search, job, company or salary URLs you already have | `startUrls: [\"https://www.ziprecruiter.com/c/...\"]` |\n| `salary` | Salary pages for role × location, or exact salary URLs | `salaryRoles: [\"data analyst\"]`, `salaryLocations: [\"Austin, TX\"]` |\n\n## Output\n\nJob records use `type: job_ziprecruiter` and `recordType: job`.\n\nIdentity: `id`, `jid`, `listingKey`, `openSeatId`, `matchId`, `url`, `title`.\n\nCompany: `company`, `companyId`, `companyUrl`, `companyLogo`, `companyWebsite`, `companyIndustries`, `companySize`, `companyHqLocation`, `companyRating`, `companyAbout`, `companyFoundedYear`.\n\nLocation: `location`, `city`, `state`, `country`, `countryCode`, `postalCode`, `county`, `locationId`, `workplaceTypes`, `isRemote`, `isHybrid`.\n\nPay: `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `salaryMinAnnual`, `salaryMaxAnnual`, `salarySource` (`provided`, `parsed`, `predicted` or `missing`), `isEstimatedSalary`.\n\nJob: `description`, `descriptionHtml`, `shortDescription`, `employmentTypes`, `benefits`, `educationLevels`, `experienceMonths`, `postedAt`, `rollingPostedAt`, `postedAgo`, `validThrough`, `isActive`, `isNew`, `skills`, `occupationalCategory`, `industry`.\n\nApply and meta: `applyUrl`, `applyType`, `directApply`, `shareUrl`, `inputUrl`, `searchQuery`, `descriptionFetchFailed`, `scrapedAt`.\n\nSalary records use `type: salary_ziprecruiter` and `recordType: salary`: `salaryRole`, `salaryLocation`, `salaryMedian`, `salaryP10`, `salaryP25`, `salaryP75`, `salaryP90`, `salaryAverage`, `salaryAverageHourly`, `salaryCurrency`, `salaryPeriod`, `salaryUrl`, `relatedTitles`, `topPayingCities`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | Select | `search` | `search`, `byUrls` or `salary` |\n| `searchQueries` | String list | `[]` | Keywords searched in every location |\n| `locations` | String list | `[\"United States\"]` | Cities, states, ZIPs or nationwide |\n| `companyName` | String | – | Only this employer's jobs; empty keywords browse all of them |\n| `startUrls` | String list | `[]` | Search, job, company or salary URLs for `byUrls` |\n| `jobType` | Select | `any` | `full_time`, `part_time`, `contract`, `contract_to_hire`, `temporary`, `as_needed`, `other`, `internship` |\n| `workplace` | Select | `any` | `remote`, `hybrid`, `onsite` |\n| `experienceLevels` | Multi-select | `[]` | `no_experience`, `junior`, `mid`, `senior` |\n| `daysPosted` | Integer | `0` | Posted within N days (0–30); 0 = any |\n| `radiusMiles` | Integer | `0` | Radius around each location (0–100); 0 = default |\n| `salaryMin` | Integer | `0` | Annual minimum; 0 = any |\n| `salaryMax` | Integer | `0` | Annual maximum (best effort); 0 = any |\n| `fetchDescriptions` | Boolean | `true` | Fetch detail pages for full descriptions and pay |\n| `includeCompanyProfile` | Boolean | `true` | Add industry, website, size, HQ, rating and about |\n| `maxItems` | Integer | `50` | Total records across all searches |\n| `maxSearches` | Integer | `100` | Cap on keyword × location searches |\n| `salaryRoles` | String list | `[]` | Role titles for `salary` mode |\n| `salaryLocations` | String list | `[\"United States\"]` | Locations for `salary` mode |\n| `salaryUrls` | String list | `[]` | Exact `/Salaries/...` URLs; overrides role/location pairs |\n\n### Example: keyword search with filters\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"registered nurse\"],\n  \"locations\": [\"Chicago, IL\"],\n  \"jobType\": \"full_time\",\n  \"daysPosted\": 7,\n  \"maxItems\": 50\n}\n```\n\n### Example: several queries and locations\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"data engineer\", \"analytics engineer\"],\n  \"locations\": [\"Texas\", \"Florida\"],\n  \"workplace\": \"remote\",\n  \"experienceLevels\": [\"senior\"],\n  \"salaryMin\": 120000,\n  \"maxItems\": 200\n}\n```\n\n### Example: one company's openings\n\n```json\n{\n  \"mode\": \"search\",\n  \"companyName\": \"Visa\",\n  \"locations\": [\"United States\"],\n  \"fetchDescriptions\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: exact URLs\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"startUrls\": [\n    \"https://www.ziprecruiter.com/jobs-search?search=fire+alarm+technician&location=New+York%2C+NY&days=7\",\n    \"https://www.ziprecruiter.com/c/Company/Job/Title/-in-Chicago,IL?jid=abcdef1234567890\",\n    \"https://www.ziprecruiter.com/co/Visa/Jobs\"\n  ],\n  \"maxItems\": 100\n}\n```\n\n### Example: salary benchmarks\n\n```json\n{\n  \"mode\": \"salary\",\n  \"salaryRoles\": [\"software engineer\", \"data analyst\"],\n  \"salaryLocations\": [\"New York, NY\", \"Austin, TX\"],\n  \"maxItems\": 10\n}\n```\n\n## Use cases\n\n- **Talent intelligence:** follow hiring volume and role mix for a company, city or industry.\n- **Compensation research:** compare provided versus predicted pay and build salary bands from percentiles.\n- **Recruiting pipelines:** export clean rows with real apply links and workplace types.\n- **Remote-work tracking:** measure remote, hybrid and on-site mixes across markets.\n- **Job-board products:** refresh an internal board with scheduled runs and deduplicate on `jid`.\n\n## Limitations\n\n- ZipRecruiter's public data has no latitude/longitude, so this actor does not invent coordinates.\n- Search results arrive in ZipRecruiter's own order; the public site ignores sort parameters, so no sort input is offered.\n- One search is capped at roughly 10,000 results. Split broad topics by keyword, location or filter for more.\n- The salary maximum filter is best effort because ZipRecruiter's ceiling parameter does not narrow reliably; the minimum filter is server-side and is also checked on each row.\n- `salarySource: predicted` means ZipRecruiter estimated the range, not that the employer published it. Values are kept and flagged rather than silently mixed with provided pay.\n- US and Canada listings on ziprecruiter.com are covered. The separate UK and Ireland sites are not.\n- A very broad run can hit detail-page rate limits; the actor pauses, backs off and keeps card rows with `descriptionFetchFailed` instead of failing the whole run.\n\n## FAQ\n\n**Do I need a ZipRecruiter account, cookies or a proxy?**\nNo. Only public pages are read, and the actor chooses its own network path. There is nothing to configure.\n\n**What is the difference between the three modes?**\n`search` discovers jobs from keywords, locations or a company. `byUrls` reads exact search, job, company or salary URLs. `salary` reads salary benchmark pages and returns percentile/average pay.\n\n**Why do some rows have no salary?**\nZipRecruiter does not publish pay for every posting. When it shows an estimated range, the row is marked `salarySource: predicted` and `isEstimatedSalary: true`; when it shows nothing, the pay fields are omitted rather than filled with zero.\n\n**Do I get the full job description?**\nYes when `fetchDescriptions` is on. It returns both plain text and HTML. Turn it off for faster, cheaper card-only runs.\n\n**What does `descriptionFetchFailed: true` mean?**\nThe detail page could not be read for that posting, so the row was kept from search-card data. Re-run those job URLs later if you need the description.\n\n**Why is the same job missing from a second search?**\nJobs are deduplicated by ZipRecruiter's job id across every query and location in the run, so a posting found twice is delivered once. Running the same search on another day can return different rows as ZipRecruiter re-ranks and refreshes listings.\n\n**How current is the salary data?**\nSalary pages are ZipRecruiter's own estimates and are returned as shown, including median, percentiles, average annual/hourly pay, related titles and top-paying cities. They are benchmarks, not offers.\n\n**Can I filter for 1-Click Apply jobs?**\nThere is no reliable server-side filter for it, so it is not exposed as an input. `applyType` on each row tells you whether the application is external, internal or quick-apply.\n\n**How many results can I get?**\n`maxItems` supports up to 10,000 per run, and that also matches ZipRecruiter's per-search ceiling. For larger datasets, split the work into multiple runs by keyword or location.\n\n**Is this affiliated with ZipRecruiter?**\nNo. It is an independent tool that reads ZipRecruiter's public job and salary data.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "ZipRecruiter jobs and salary benchmarks",
          "fields": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "description": "job_ziprecruiter or salary_ziprecruiter"
              },
              "recordType": {
                "type": "string",
                "description": "job or salary"
              },
              "id": {
                "type": "string",
                "description": "Job identity: open seat id, listing key or canonical URL"
              },
              "jid": {
                "type": "string",
                "description": "ZipRecruiter job id from the jid parameter"
              },
              "listingKey": {
                "type": "string",
                "description": "ZipRecruiter listing key"
              },
              "openSeatId": {
                "type": "string",
                "description": "ZipRecruiter open seat id"
              },
              "matchId": {
                "type": "string",
                "description": "ZipRecruiter match id"
              },
              "url": {
                "type": "string",
                "description": "Canonical job page URL"
              },
              "title": {
                "type": "string",
                "description": "Job title"
              },
              "company": {
                "type": "string",
                "description": "Hiring company name"
              },
              "companyId": {
                "type": "string",
                "description": "ZipRecruiter company id"
              },
              "companyUrl": {
                "type": "string",
                "description": "Company profile URL"
              },
              "companyLogo": {
                "type": "string",
                "description": "Company logo image URL"
              },
              "companyWebsite": {
                "type": "string",
                "description": "Company website URL"
              },
              "companyIndustries": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Company industries"
              },
              "companySize": {
                "type": "string",
                "description": "Company size label"
              },
              "companyHqLocation": {
                "type": "string",
                "description": "Company headquarters"
              },
              "companyRating": {
                "type": "number",
                "description": "Breakroom company rating"
              },
              "companyAbout": {
                "type": "string",
                "description": "Company description"
              },
              "companyFoundedYear": {
                "type": "string",
                "description": "Company founding year when shown"
              },
              "location": {
                "type": "string",
                "description": "Display location"
              },
              "city": {
                "type": "string",
                "description": "City"
              },
              "state": {
                "type": "string",
                "description": "State or region code"
              },
              "country": {
                "type": "string",
                "description": "Country name"
              },
              "countryCode": {
                "type": "string",
                "description": "ISO country code"
              },
              "postalCode": {
                "type": "string",
                "description": "Postal code"
              },
              "county": {
                "type": "string",
                "description": "County"
              },
              "locationId": {
                "type": "string",
                "description": "ZipRecruiter location id"
              },
              "workplaceTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "onsite, remote or hybrid"
              },
              "isRemote": {
                "type": "boolean",
                "description": "True when the job is remote"
              },
              "isHybrid": {
                "type": "boolean",
                "description": "True when the job is hybrid"
              },
              "salary": {
                "type": "string",
                "description": "Salary text as shown"
              },
              "salaryMin": {
                "type": "number",
                "description": "Minimum pay in the displayed period"
              },
              "salaryMax": {
                "type": "number",
                "description": "Maximum pay in the displayed period"
              },
              "salaryPeriod": {
                "type": "string",
                "description": "hour, day, week, month or year"
              },
              "salaryCurrency": {
                "type": "string",
                "description": "Pay currency code"
              },
              "salaryMinAnnual": {
                "type": "number",
                "description": "Annualized minimum pay"
              },
              "salaryMaxAnnual": {
                "type": "number",
                "description": "Annualized maximum pay"
              },
              "salarySource": {
                "type": "string",
                "description": "provided, parsed, predicted or missing"
              },
              "isEstimatedSalary": {
                "type": "boolean",
                "description": "True when the pay is estimated"
              },
              "description": {
                "type": "string",
                "description": "Full description as plain text"
              },
              "descriptionHtml": {
                "type": "string",
                "description": "Full description as HTML"
              },
              "shortDescription": {
                "type": "string",
                "description": "Search-card teaser"
              },
              "employmentTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "full_time, part_time, contract and so on"
              },
              "benefits": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Benefits shown for the job"
              },
              "educationLevels": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Education expectations"
              },
              "experienceMonths": {
                "type": "integer",
                "description": "Required experience in months"
              },
              "postedAt": {
                "type": "string",
                "description": "Original posting timestamp"
              },
              "rollingPostedAt": {
                "type": "string",
                "description": "Rolling refresh timestamp"
              },
              "postedAgo": {
                "type": "string",
                "description": "Human posting age"
              },
              "validThrough": {
                "type": "string",
                "description": "Posting expiry date"
              },
              "isActive": {
                "type": "boolean",
                "description": "Whether the listing is active"
              },
              "isNew": {
                "type": "boolean",
                "description": "Whether ZipRecruiter marks the listing new"
              },
              "applyUrl": {
                "type": "string",
                "description": "Apply URL, decoded to the employer when external"
              },
              "applyType": {
                "type": "string",
                "description": "external, quick_apply or internal"
              },
              "directApply": {
                "type": "boolean",
                "description": "True for 1-Click Apply"
              },
              "shareUrl": {
                "type": "string",
                "description": "Short share URL"
              },
              "skills": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Skills listed in JSON-LD"
              },
              "occupationalCategory": {
                "type": "string",
                "description": "O*NET occupational category"
              },
              "industry": {
                "type": "string",
                "description": "Job industry from JSON-LD"
              },
              "inputUrl": {
                "type": "string",
                "description": "Search or job URL that produced the row"
              },
              "searchQuery": {
                "type": "string",
                "description": "Keyword that produced the row"
              },
              "descriptionFetchFailed": {
                "type": "boolean",
                "description": "True when a requested description could not be fetched"
              },
              "scrapedAt": {
                "type": "string",
                "description": "ISO scrape timestamp"
              },
              "salaryRole": {
                "type": "string",
                "description": "Role title for a salary row"
              },
              "salaryLocation": {
                "type": "string",
                "description": "Location for a salary row"
              },
              "salaryMedian": {
                "type": "number",
                "description": "Median annual pay"
              },
              "salaryP10": {
                "type": "number",
                "description": "10th percentile annual pay"
              },
              "salaryP25": {
                "type": "number",
                "description": "25th percentile annual pay"
              },
              "salaryP75": {
                "type": "number",
                "description": "75th percentile annual pay"
              },
              "salaryP90": {
                "type": "number",
                "description": "90th percentile annual pay"
              },
              "salaryAverage": {
                "type": "number",
                "description": "Average annual pay from the FAQ"
              },
              "salaryAverageHourly": {
                "type": "number",
                "description": "Average hourly pay from the FAQ"
              },
              "salaryUrl": {
                "type": "string",
                "description": "Salary page URL"
              },
              "relatedTitles": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "annualSalary": {
                      "type": "number"
                    }
                  }
                },
                "description": "Related job titles and their average annual pay"
              },
              "topPayingCities": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "location": {
                      "type": "string"
                    },
                    "annualSalary": {
                      "type": "number"
                    }
                  }
                },
                "description": "Cities with the highest pay for the role"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Job overview",
              "transformation": {
                "fields": [
                  "title",
                  "company",
                  "city",
                  "state",
                  "salary",
                  "workplaceTypes",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "company": {
                    "label": "Company",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "state": {
                    "label": "State",
                    "format": "text"
                  },
                  "salary": {
                    "label": "Salary",
                    "format": "text"
                  },
                  "workplaceTypes": {
                    "label": "Workplace",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  }
                }
              }
            },
            "jobs": {
              "title": "Jobs",
              "transformation": {
                "fields": [
                  "title",
                  "company",
                  "location",
                  "salary",
                  "salaryMin",
                  "salaryMax",
                  "salaryPeriod",
                  "salarySource",
                  "employmentTypes",
                  "workplaceTypes",
                  "postedAt",
                  "applyUrl",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "company": {
                    "label": "Company",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "salary": {
                    "label": "Salary",
                    "format": "text"
                  },
                  "salaryMin": {
                    "label": "Min",
                    "format": "number"
                  },
                  "salaryMax": {
                    "label": "Max",
                    "format": "number"
                  },
                  "salaryPeriod": {
                    "label": "Period",
                    "format": "text"
                  },
                  "salarySource": {
                    "label": "Pay source",
                    "format": "text"
                  },
                  "employmentTypes": {
                    "label": "Employment",
                    "format": "text"
                  },
                  "workplaceTypes": {
                    "label": "Workplace",
                    "format": "text"
                  },
                  "postedAt": {
                    "label": "Posted",
                    "format": "text"
                  },
                  "applyUrl": {
                    "label": "Apply",
                    "format": "link"
                  },
                  "url": {
                    "label": "Job URL",
                    "format": "link"
                  }
                }
              }
            },
            "salaries": {
              "title": "Salary benchmarks",
              "transformation": {
                "fields": [
                  "salaryRole",
                  "salaryLocation",
                  "salaryMedian",
                  "salaryP10",
                  "salaryP25",
                  "salaryP75",
                  "salaryP90",
                  "salaryAverage",
                  "salaryAverageHourly",
                  "salaryCurrency",
                  "salaryUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "salaryRole": {
                    "label": "Role",
                    "format": "text"
                  },
                  "salaryLocation": {
                    "label": "Location",
                    "format": "text"
                  },
                  "salaryMedian": {
                    "label": "Median",
                    "format": "number"
                  },
                  "salaryP10": {
                    "label": "P10",
                    "format": "number"
                  },
                  "salaryP25": {
                    "label": "P25",
                    "format": "number"
                  },
                  "salaryP75": {
                    "label": "P75",
                    "format": "number"
                  },
                  "salaryP90": {
                    "label": "P90",
                    "format": "number"
                  },
                  "salaryAverage": {
                    "label": "Average",
                    "format": "number"
                  },
                  "salaryAverageHourly": {
                    "label": "Average hourly",
                    "format": "number"
                  },
                  "salaryCurrency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "salaryUrl": {
                    "label": "Salary URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "7b99beb5cc467c2fdce3bf1bd57548ff366247e870ebdf2c466bc3cf3dee3f29",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03204777777777778
    }
  }
}