# ITJobs.pt Scraper (`solidcode/itjobs-pt-scraper`) Actor

\[💰 $1.3 / 1K] Scrape IT & tech jobs from ITJobs.pt, Portugal's leading technology job board. Get title, company, district, work model, contract type, salary range, tech tags, full description & apply link. Filter by keyword, location, remote/hybrid, contract type, salary and posting date.

- **URL**: https://apify.com/solidcode/itjobs-pt-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ITJobs.pt Scraper

Pull every IT and tech job from ITJobs.pt — Portugal's leading technology job board — with the full description, annual salary range, contract type, work model, and employer details on every listing. Search by keyword or narrow by district, technology, remote/hybrid, and posting date, all applied on ITJobs.pt's own servers. Built for Portuguese tech recruiters, salary and market analysts, and job-board builders who need clean, structured hiring data without copy-pasting listings one page at a time.

### Why This Scraper?

- **Portugal's whole IT board in one run** — every listing across 14 Portuguese districts (Lisboa, Porto, Aveiro, Braga, Coimbra, Faro, Açores and more) plus International roles.
- **Deep detail on every job, not just the card** — each posting is opened to pull the full job description, annual salary range, contract type, and employer reference number that never appear on the results list.
- **Five contract types, normalized to English** — Permanent, Fixed-term, Services/freelance, Professional internship, and Academic internship, translated from the Portuguese "contrato sem termo / a termo / prestação de serviços / estágio" labels.
- **Three work models as a first-class filter** — On-site, Remote, and Hybrid (Presencial / Remoto / Híbrido), with a plain `isRemote` boolean on every row.
- **18 curated technology tags** — Python, Java, React, Angular, .NET, PHP, Go, AWS, Azure, Docker, Linux, Oracle, SAP, Salesforce, OutSystems, Android, and AI among them — each applied by ITJobs.pt itself, so no keyword guesswork.
- **Salary intelligence with min/max split** — seven annual brackets from €10,000 to €160,000 plus an "any published salary" flag; where the employer publishes pay you get `salaryMin`, `salaryMax`, and currency, not just a text blob.
- **Fresh-listing windows built in** — last 24 hours, 7 days, or 15 days, ideal for scheduled runs that pick up only brand-new postings.
- **One clean row per job** — deduplicated on the ITJobs.pt job ID across sponsored, repeated, and overlapping filter results, so no listing is counted twice.
- **Every filter runs server-side** — keyword, district, work model, employment type, contract, tags, salary, and date all narrow the search on ITJobs.pt, so tighter filters mean lower cost, never billed rows you then throw away.

### Use Cases

**Recruitment & Talent Sourcing**
- Map which companies are hiring for Python, React, or .NET across Lisboa and Porto
- Track remote and hybrid openings to benchmark against your own offer
- Feed fresh openings straight into your ATS or CRM
- Build target-employer shortlists by technology and district

**Market & Salary Research**
- Benchmark advertised salary ranges by role, district, and contract type
- Measure how many roles publish salary versus keep it private
- Track hiring demand for AI, cloud, and specific frameworks over time
- Compare the on-site / remote / hybrid mix across the Portuguese tech market

**Job Board Aggregation**
- Power a niche Portuguese IT job site or newsletter with structured listings
- Merge ITJobs.pt data with other boards into a single feed
- Republish clean, de-duplicated apply links with full descriptions

**Competitive Intelligence**
- See which competitors are expanding teams, and in which cities
- Track a rival's open roles, tech stack, and contract types
- Spot new market entrants hiring in Portugal

**Lead Generation**
- Build lists of companies actively hiring for a technology you sell into
- Identify employers by district for regional outreach
- Enrich company records with logo, profile URL, and live hiring signals

### Getting Started

#### Simple Keyword Search

The quickest start — one keyword and a cap:

```json
{
    "searchKeyword": "python",
    "maxResults": 50
}
````

#### Fresh Remote & Hybrid Roles

The most useful everyday combination — recent openings in the biggest markets:

```json
{
    "searchKeyword": "data engineer",
    "locations": ["Lisboa", "Porto"],
    "workModels": ["remote", "hybrid"],
    "postedWithin": "7d",
    "maxResults": 100
}
```

#### Full-Featured Example

```json
{
    "searchKeyword": "backend",
    "locations": ["Lisboa", "Porto", "Braga"],
    "workModels": ["hybrid"],
    "employmentTypes": ["full_time"],
    "contractTypes": ["permanent", "fixed_term"],
    "tags": ["python", "aws"],
    "salaryRange": "40000-60000",
    "postedWithin": "15d",
    "maxResults": 500
}
```

#### Using ITJobs.pt Links

Paste search or tag links you have already refined on the site — each link carries its own filters and is collected as its own task:

```json
{
    "startUrls": [
        "https://www.itjobs.pt/emprego?q=react",
        "https://www.itjobs.pt/emprego/python"
    ],
    "maxResults": 200
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchKeyword` | string | `"python"` | Word or phrase to match in job postings (e.g. "react senior", "data engineer"). Leave blank to collect every listing matching the filters below. |
| `startUrls` | array | `[]` | Paste ITJobs.pt search, tag, or location links. Each is collected as its own task and results are merged and de-duplicated. When set, the keyword and filters below are ignored — the link already carries its own filters. |

#### Filters

Every filter is applied by ITJobs.pt itself, so narrowing your search also lowers your cost. Leave everything empty to collect the whole board.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locations` | multi-select | `[]` | Portuguese districts to include: Lisboa, Porto, Aveiro, Braga, Leiria, Coimbra, Setúbal, Castelo Branco, Bragança, Faro, Santarém, Viana do Castelo, Viseu, Açores, or International (outside Portugal). Empty = anywhere. |
| `workModels` | multi-select | `[]` | Work arrangement: On-site, Remote, Hybrid. Empty = all. |
| `employmentTypes` | multi-select | `[]` | Full-time or Part-time. Empty = both. |
| `contractTypes` | multi-select | `[]` | Permanent, Fixed-term, Services / freelance, Professional internship, or Academic internship. Empty = all. |
| `tags` | multi-select | `[]` | Technology tags: Python, Java, React, Angular, .NET, PHP, Go (Golang), AWS, Azure, Docker, Linux, Oracle, SAP, Salesforce, OutSystems, Android, AI, Remote. Empty = every technology. |
| `salaryRange` | select | `Any salary` | Annual salary bracket, from €10,000–€20,000 up to €140,000–€160,000, or "Any published salary". Most listings do not publish pay — picking a bracket excludes them. |
| `postedWithin` | select | `Any time` | Only include jobs published recently: Last 24 hours, Last 7 days, or Last 15 days. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Hard cap on how many job listings to collect. Set to `0` to collect everything that matches. The run stops asking for new pages once the cap is reached but keeps the whole final page, so you may receive slightly more than requested. |

### Output

Every job posting becomes one flat row. Here is a representative result:

```json
{
    "jobId": "521483",
    "title": "Senior Python Engineer",
    "company": "Critical TechWorks",
    "companyLogo": "https://www.itjobs.pt/img/company/critical-techworks.png",
    "companyUrl": "https://www.itjobs.pt/empresa/critical-techworks",
    "location": "Porto",
    "district": "Porto",
    "workModel": "Hybrid",
    "isRemote": false,
    "employmentType": "Full-time",
    "contractType": "Permanent",
    "salaryText": "€40.000 – €60.000 / ano",
    "salaryMin": 40000,
    "salaryMax": 60000,
    "salaryCurrency": "EUR",
    "tags": ["python", "aws", "docker"],
    "description": "We are looking for a Senior Python Engineer to join our platform team, building scalable services on AWS...",
    "descriptionHtml": "<p>We are looking for a Senior Python Engineer to join our platform team, building scalable services on AWS...</p>",
    "publishedAt": "2026-07-14",
    "referenceNumber": "CTW-2026-0142",
    "applyUrl": "https://www.itjobs.pt/oferta/521483/senior-python-engineer",
    "url": "https://www.itjobs.pt/oferta/521483/senior-python-engineer",
    "searchKeyword": "python",
    "scrapedAt": "2026-07-17T09:22:14.318472+00:00"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Unique ITJobs.pt job identifier |
| `title` | string | Job title |
| `company` | string | Hiring company name |
| `companyLogo` | string | Company logo image URL |
| `companyUrl` | string | ITJobs.pt company profile URL |
| `url` | string | Canonical job posting URL |
| `applyUrl` | string | Direct application link |
| `publishedAt` | string | Date the job was posted (ISO 8601) |
| `searchKeyword` | string | The keyword that surfaced this row (provenance) |
| `scrapedAt` | string | Extraction timestamp (ISO 8601) |

#### Location & Work Arrangement

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | Job location as displayed |
| `district` | string | Normalized Portuguese district |
| `workModel` | string | On-site, Remote, or Hybrid |
| `isRemote` | boolean | True when the role is fully remote |
| `employmentType` | string | Full-time or Part-time |
| `contractType` | string | Permanent, Fixed-term, Services, Professional internship, or Academic internship |
| `referenceNumber` | string | Employer's internal job reference, when published |

#### Salary

| Field | Type | Description |
|-------|------|-------------|
| `salaryText` | string | Salary exactly as displayed on the listing |
| `salaryMin` | number | Parsed lower bound of the annual range |
| `salaryMax` | number | Parsed upper bound of the annual range |
| `salaryCurrency` | string | Currency code (e.g. EUR) |

#### Content & Tags

| Field | Type | Description |
|-------|------|-------------|
| `tags` | array | Technology and skill tags on the posting |
| `description` | string | Full job description as clean plain text |
| `descriptionHtml` | string | Full job description in its original HTML |

### Tips for Best Results

- **Start small.** Set `maxResults` to 50 on your first run to confirm the data fits your needs, then scale up.
- **Salary is only present when the employer published it.** Most ITJobs.pt listings keep pay private, so choosing a `salaryRange` bracket (or "Any published salary") will drop the majority of jobs — leave it on "Any salary" whenever you want full coverage.
- **Use `postedWithin` for fresh-lead monitoring.** On a scheduled daily or weekly run, set it to "Last 24 hours" or "Last 7 days" to collect only brand-new postings and keep every run cheap.
- **Filters lower your cost.** Because each filter runs on ITJobs.pt's servers, narrowing your search removes rows before they are ever collected — you are never billed for listings a filter discarded.
- **Collect the whole board.** Leave every field blank and set `maxResults` to `0` to pull all current listings in one pass.
- **Pair a keyword with a technology tag** for precision — the tag is a curated facet and the keyword is free text, so together they cut noise a plain search leaves in.
- **Reuse links you have already refined.** Drop a search or tag URL into `startUrls` to replay it exactly; the link's own filters take over and the keyword/filter fields are ignored.

### Pricing

**From $1.30 per 1,000 results** — below the going rate for Portuguese IT job-board data. No compute or time-based charges: you pay per result, plus a small fixed per-run start fee. Bronze, Silver, and Gold subscribers pay progressively less, as shown below.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.16 | $0.15 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

A "result" is one job row in your dataset. Platform fees (compute, storage) are billed separately by Apify according to your plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate recruitment research, labor-market analysis, and job aggregation. You are responsible for complying with applicable laws, GDPR, and ITJobs.pt's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data you collect responsibly.

# Actor input Schema

## `searchKeyword` (type: `string`):

Word or phrase to look for in job postings (e.g. 'python', 'react senior', 'data engineer'). Leave blank to collect every listing matching the filters below.

## `startUrls` (type: `array`):

Paste ITJobs.pt search, tag, or location links (e.g. https://www.itjobs.pt/emprego?q=python). Each link is collected as its own task and results are merged and de-duplicated. When you use this, the keyword and filters below are ignored — the link already carries its own filters.

## `locations` (type: `array`):

Only include jobs in these Portuguese districts. Leave empty for anywhere in Portugal.

## `workModels` (type: `array`):

Only include jobs with these work arrangements. Leave empty to include all.

## `employmentTypes` (type: `array`):

Only include full-time or part-time roles. Leave empty to include both.

## `contractTypes` (type: `array`):

Only include jobs offering these contract types. Leave empty to include all.

## `tags` (type: `array`):

Only include jobs tagged with these technologies. Each tag is applied by ITJobs.pt itself. Leave empty to include every technology.

## `salaryRange` (type: `string`):

Only include jobs advertising a yearly salary in this bracket. Most listings do not publish a salary — picking a bracket, or 'Any published salary', will exclude those. Leave blank for any salary.

## `postedWithin` (type: `string`):

Only include jobs published recently. Ideal for scheduled runs that pick up just the newest postings. ITJobs.pt only offers these windows, so no other period is available.

## `maxResults` (type: `integer`):

Hard cap on how many job listings to collect. Default 100 — increase for bigger runs, or set to 0 to collect everything that matches. The run stops asking for new pages once the cap is reached, but keeps the whole final page, so you may receive slightly more than requested. A "collect everything" (0) search is internally capped at 9,000 results per search as a safety limit, far above the size of the board.

## Actor input object example

```json
{
  "searchKeyword": "python",
  "startUrls": [],
  "locations": [],
  "workModels": [],
  "employmentTypes": [],
  "contractTypes": [],
  "tags": [],
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of jobs with the most useful fields — title, company, district, work model, salary, posting date, and link.

## `details` (type: `string`):

Full per-job rows with technology tags, employment and contract type, salary breakdown, full description, and apply link.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchKeyword": "python",
    "startUrls": [],
    "locations": [],
    "workModels": [],
    "employmentTypes": [],
    "contractTypes": [],
    "tags": [],
    "salaryRange": "",
    "postedWithin": "",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/itjobs-pt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchKeyword": "python",
    "startUrls": [],
    "locations": [],
    "workModels": [],
    "employmentTypes": [],
    "contractTypes": [],
    "tags": [],
    "salaryRange": "",
    "postedWithin": "",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/itjobs-pt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchKeyword": "python",
  "startUrls": [],
  "locations": [],
  "workModels": [],
  "employmentTypes": [],
  "contractTypes": [],
  "tags": [],
  "salaryRange": "",
  "postedWithin": "",
  "maxResults": 100
}' |
apify call solidcode/itjobs-pt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/itjobs-pt-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ITJobs.pt Scraper",
        "description": "[💰 $1.3 / 1K] Scrape IT & tech jobs from ITJobs.pt, Portugal's leading technology job board. Get title, company, district, work model, contract type, salary range, tech tags, full description & apply link. Filter by keyword, location, remote/hybrid, contract type, salary and posting date.",
        "version": "1.0",
        "x-build-id": "0wiWDadWoqS2iqnHQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~itjobs-pt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-itjobs-pt-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/solidcode~itjobs-pt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-itjobs-pt-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/solidcode~itjobs-pt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-itjobs-pt-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",
                "properties": {
                    "searchKeyword": {
                        "title": "Search Keyword",
                        "type": "string",
                        "description": "Word or phrase to look for in job postings (e.g. 'python', 'react senior', 'data engineer'). Leave blank to collect every listing matching the filters below."
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste ITJobs.pt search, tag, or location links (e.g. https://www.itjobs.pt/emprego?q=python). Each link is collected as its own task and results are merged and de-duplicated. When you use this, the keyword and filters below are ignored — the link already carries its own filters.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs in these Portuguese districts. Leave empty for anywhere in Portugal.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Lisboa",
                                "Porto",
                                "Aveiro",
                                "Braga",
                                "Leiria",
                                "Coimbra",
                                "Setúbal",
                                "Castelo Branco",
                                "Bragança",
                                "Faro",
                                "Santarém",
                                "Viana do Castelo",
                                "Viseu",
                                "Açores",
                                "International"
                            ],
                            "enumTitles": [
                                "Lisboa",
                                "Porto",
                                "Aveiro",
                                "Braga",
                                "Leiria",
                                "Coimbra",
                                "Setúbal",
                                "Castelo Branco",
                                "Bragança",
                                "Faro",
                                "Santarém",
                                "Viana do Castelo",
                                "Viseu",
                                "Açores",
                                "International (outside Portugal)"
                            ]
                        }
                    },
                    "workModels": {
                        "title": "Work Model",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs with these work arrangements. Leave empty to include all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "onsite",
                                "remote",
                                "hybrid"
                            ],
                            "enumTitles": [
                                "On-site",
                                "Remote",
                                "Hybrid"
                            ]
                        }
                    },
                    "employmentTypes": {
                        "title": "Employment Type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include full-time or part-time roles. Leave empty to include both.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full_time",
                                "part_time"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time"
                            ]
                        }
                    },
                    "contractTypes": {
                        "title": "Contract Type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs offering these contract types. Leave empty to include all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "permanent",
                                "fixed_term",
                                "services",
                                "professional_internship",
                                "academic_internship"
                            ],
                            "enumTitles": [
                                "Permanent contract (sem termo)",
                                "Fixed-term contract (a termo)",
                                "Services / freelance (prestação de serviços)",
                                "Professional internship (estágio profissional)",
                                "Academic internship (estágio académico)"
                            ]
                        }
                    },
                    "tags": {
                        "title": "Technology Tags",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs tagged with these technologies. Each tag is applied by ITJobs.pt itself. Leave empty to include every technology.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "python",
                                "java",
                                "react",
                                "angular",
                                ".net",
                                "php",
                                "golang",
                                "aws",
                                "azure",
                                "docker",
                                "linux",
                                "oracle",
                                "sap",
                                "salesforce",
                                "outsystems",
                                "android",
                                "ai",
                                "remote"
                            ],
                            "enumTitles": [
                                "Python",
                                "Java",
                                "React",
                                "Angular",
                                ".NET",
                                "PHP",
                                "Go (Golang)",
                                "AWS",
                                "Azure",
                                "Docker",
                                "Linux",
                                "Oracle",
                                "SAP",
                                "Salesforce",
                                "OutSystems",
                                "Android",
                                "AI",
                                "Remote"
                            ]
                        }
                    },
                    "salaryRange": {
                        "title": "Salary Range",
                        "enum": [
                            "",
                            "1",
                            "10000-20000",
                            "20000-40000",
                            "40000-60000",
                            "60000-80000",
                            "80000-100000",
                            "100000-140000",
                            "140000-160000"
                        ],
                        "type": "string",
                        "description": "Only include jobs advertising a yearly salary in this bracket. Most listings do not publish a salary — picking a bracket, or 'Any published salary', will exclude those. Leave blank for any salary."
                    },
                    "postedWithin": {
                        "title": "Posted Within",
                        "enum": [
                            "",
                            "24h",
                            "7d",
                            "15d"
                        ],
                        "type": "string",
                        "description": "Only include jobs published recently. Ideal for scheduled runs that pick up just the newest postings. ITJobs.pt only offers these windows, so no other period is available."
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on how many job listings to collect. Default 100 — increase for bigger runs, or set to 0 to collect everything that matches. The run stops asking for new pages once the cap is reached, but keeps the whole final page, so you may receive slightly more than requested. A \"collect everything\" (0) search is internally capped at 9,000 results per search as a safety limit, far above the size of the board."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
