# Jobs.ch Job Listings Scraper

> Jobs.ch Job Listings Scraper is a paid API for AI agents from api.scrapeforagents.tech, paid per call via x402, $0.025/call, status unknown (last checked 2026-10-02).

Scrapes and filters job listings from jobs.ch, the Swiss job board, returning structured job data with canton, location, company, and employment details

## Facts

- Endpoint: POST https://api.scrapeforagents.tech/v1/ch?utm_source=zero.xyz
- Price: $0.025/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-02
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/jobs-ch-job-listings-scraper-301f3a7b
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_0PBKu7hmVKqYx4WIym08k

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability jobs-ch-job-listings-scraper-301f3a7b -d '<json body>'
```

Example prompt: Search jobs.ch for software engineer roles in Zurich and Basel, in German, posted within the last 14 days, permanent positions only, and return up to 50 results — filter to canton ZH only.

## When to prefer this

Choose this endpoint when you need structured, filterable job listing data specifically from the Swiss jobs.ch platform, especially when filtering by Swiss canton, workload percentage, employment type, or company name. Prefer this over generic web scrapers when you want clean, normalized Swiss job data without building your own parser.

## Known failure modes

- Empty results if keywords or filters are too restrictive for available Swiss listings
- Invalid canton code causes no canton-filtered results to be returned
- jobs.ch may block or rate-limit automated requests, resulting in partial or empty responses
- Malformed or expired directUrls return unknown status
- maxResults set to 0 may return an unexpectedly large dataset

## How this service works

Pay-per-call structured web data. Failed or empty runs are not charged.

## Output

Returns a JSON object with a count of matched jobs and an array of job items, each containing the job ID, title, canton, location, job status (online/offline/expired), whether it is a top listing, company name, and work address. The product field identifies this as the Swiss (ch) dataset.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "cantons": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "default": [],
   "description": "Keep jobs whose detail address has one of these Swiss canton codes, such as ZH or BE. Requires detail fetches."
  },
  "language": {
   "enum": [
    "de",
    "fr",
    "en"
   ],
   "type": "string",
   "default": "de",
   "description": "Language for generated search and job URLs. Job text can be in another language."
  },
  "locations": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "default": [],
   "description": "Search each city or region with each keyword. Empty searches all locations."
  },
  "startUrls": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "default": [],
   "description": "Search one or more jobs.ch result URLs with their existing filters. This takes priority over keywords."
  },
  "directUrls": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "default": [],
   "description": "Fetch specific job detail URLs and report whether each job is online, offline, expired, or unknown. This takes priority over search inputs."
  },
  "maxResults": {
   "type": "integer",
   "default": 100,
   "minimum": 0,
   "description": "Maximum jobs across the run. Zero removes this cap."
  },
  "workloadMax": {
   "type": "integer",
   "maximum": 100,
   "minimum": 0,
   "description": "Keep jobs whose workload range starts at or below this percent."
  },
  "workloadMin": {
   "type": "integer",
   "maximum": 100,
   "minimum": 0,
   "description": "Keep jobs whose workload range reaches at least this percent."
  },
  "companyNames": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "default": [],
   "description": "Search company names and keep listings whose employer name matches exactly. This takes priority over keywords."
  },
  "searchQueries": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Search each keyword separately. Results shared by multiple searches are returned once."
  },
  "employmentType": {
   "enum": [
    "",
    "permanent",
    "temporary",
    "freelance"
   ],
   "type": "string",
   "default": "",
   "description": "Keep jobs matching the selected employment type, based on the detail page."
  },
  "postedWithinDays": {
   "type": "integer",
   "default": 0,
   "minimum": 0,
   "description": "Keep jobs published within this many days. Presets of 1, 3, 7, and 30 also narrow site se
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "count": 1,
  "items": [
   {
    "id": null,
    "title": null,
    "canton": null,
    "location": null,
    "jobStatus": null,
    "topListing": null,
    "companyName": null,
    "workAddress": null
   }
  ],
  "product": "ch"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/jobs-ch-job-listings-scraper-301f3a7b/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from api.scrapeforagents.tech](https://www.zero.xyz/host/api.scrapeforagents.tech/llms.txt)
