# ITJobs.pt Scraper - Portugal IT Job Listings (`studio-amba/itjobs-pt-scraper`) Actor

Scrape IT and tech job listings from ITJobs.pt, Portugal's leading IT jobs board. Filter by technology category (Java, .NET, DevOps, React, and more). Extract job titles, companies, locations, work mode (remote/hybrid/on-site), employment type, and full descriptions. No login required.

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

## Pricing

from $1.20 / 1,000 result scrapeds

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

### What does ITJobs.pt Scraper do?

**ITJobs.pt Scraper** extracts IT and tech job listings from [ITJobs.pt](https://www.itjobs.pt), Portugal's leading IT and technology jobs board. The scraper searches by technology category (Java, .NET, DevOps, React, Python, AWS, and more) and returns structured data including job titles, hiring companies, locations, work mode (remote/hybrid/on-site), employment type, and full descriptions.

Run it on the Apify platform to get **API access, scheduling, proxy rotation, webhook integrations, and monitoring** out of the box. No login or cookies required — all data is extracted from publicly available job listings.

### Why use ITJobs.pt Scraper?

- **Portuguese tech market research**: Analyze demand for specific technologies, frameworks, and roles across Portugal's IT sector.
- **Recruitment intelligence**: Monitor which companies are hiring for which technologies and track new openings in real time.
- **Remote-work benchmarking**: ITJobs.pt clearly tags remote, hybrid, and on-site roles — useful for tracking Portugal's remote-work adoption in tech.
- **Job aggregation**: Feed Portuguese IT job listings into your own job board, aggregator, or HR platform.
- **Academic research**: Study employment trends and skill demand in the Portuguese tech labor market.
- **Lead generation**: Identify actively hiring Portuguese and nearshore tech companies for B2B sales outreach.
- **Competitive intelligence**: Track which technologies competitors are hiring for as a signal of their roadmap.

### How to scrape ITJobs.pt data

1. Go to the ITJobs.pt Scraper page on Apify Store.
2. Click **Try for free** to open the Actor in Apify Console.
3. Enter a technology category (e.g. "java", "devops", "react", ".net", "python", "aws") or leave the default.
4. Set the maximum number of results you want.
5. Click **Start** and wait for the run to finish.
6. Download your data as JSON, CSV, Excel, or connect it to your workflow via API.

That's it — no coding required. The scraper handles pagination and data extraction automatically over plain HTTP, no browser needed.

### Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `searchQuery` | String | Technology category tag (java, devops, react, .net, python, aws, etc.) — unrecognized values scrape all categories | `java` |
| `maxResults` | Integer | Maximum number of listings to scrape (1-10,000) | `50` |
| `includeDetails` | Boolean | Visit each offer's native detail page for the full description, exact address, and confirmed employment type | `true` |
| `proxyConfiguration` | Object | Proxy settings (optional — the site has no bot protection, recommended for large runs) | Apify Residential |

#### Example input

```json
{
    "searchQuery": "devops",
    "maxResults": 50,
    "includeDetails": true
}
````

### Output

The scraper outputs structured JSON data for each job listing. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "jobTitle": "Senior Java Developer – Calypso and Investment Banking Expertise",
    "company": "ITDS Portugal",
    "companyUrl": "https://itdsportugal.com",
    "location": "Porto",
    "city": "Porto",
    "postalCode": "4000-008",
    "country": "Portugal",
    "workMode": "Remote",
    "salaryText": null,
    "employmentType": "FULL_TIME",
    "postedDate": "2026-06-25",
    "validThrough": "2026-07-25T14:33:07+00:00",
    "jobDescription": "As a Senior Java Developer, you will be working for our client...",
    "url": "https://www.itjobs.pt/oferta/514232/senior-java-developer-calypso-banking-applications",
    "sourceId": "514232",
    "scrapedAt": "2026-07-26T19:38:56.061Z"
}
```

### Data fields

| Field | Description |
|-------|-------------|
| `jobTitle` | Job position title |
| `company` | Hiring company name |
| `companyUrl` | Hiring company website or ITJobs.pt profile URL |
| `location` | Job location text |
| `city` | City where the job is based |
| `postalCode` | Postal code when published (with `includeDetails`) |
| `country` | Job country (usually Portugal) |
| `workMode` | Remote, Hybrid, or On-site |
| `salaryText` | Salary range as published, when the employer discloses it (most listings do not) |
| `employmentType` | Type of employment (FULL\_TIME, PART\_TIME, CONTRACTOR, etc.), published with `includeDetails` |
| `postedDate` | ISO date the offer was published |
| `validThrough` | ISO date the offer expires |
| `jobDescription` | Full description text (with `includeDetails` enabled) |
| `url` | Direct link to the job listing on ITJobs.pt |
| `sourceId` | ITJobs.pt internal offer ID |
| `scrapedAt` | ISO 8601 timestamp of data collection |

### How much does it cost to scrape ITJobs.pt?

The ITJobs.pt Scraper reads server-rendered listing pages and native detail pages over plain HTTP — no browser — so runs are fast and cheap. Typical costs:

- **50 listings** (with full details): ~$0.02-0.05 in platform credits
- **100 listings** (with full details): ~$0.05-0.10 in platform credits
- **1,000 listings** (with full details): ~$0.30-0.80 in platform credits

Costs depend on the number of pages loaded. Disabling `includeDetails` is even faster and cheaper when you only need basic listing data (title, company, location, work mode).

### Tips and advanced options

- **Use a technology tag** to narrow results. Supported tags include: .net, abap, ai, android, angular, aws, azure, backend, c#, c++, cloud, devops, frontend, helpdesk, java, js, linux, microsoft, mobile, node, oracle, outsystems, php, project, python, qa, react, salesforce, sap, sql, sre, web.
- **Leave `searchQuery` empty or unrecognized** to scrape the full unfiltered IT job feed across all technologies.
- **Keep `includeDetails` on** for full job descriptions, exact addresses, and confirmed employment type. Turn it off when you only need listing basics and want the fastest possible run.
- **Set `maxResults`** to control costs. Start small (10-50) to verify the output, then scale up.
- **Schedule runs** to track new listings daily or weekly using Apify's built-in scheduler.
- **Combine with other scrapers** to build a comprehensive European IT job market dataset alongside our Prace.cz, Jobs.cz, and other EU job board scrapers.

### Supported categories

.NET, ABAP, AI, Android, Angular, AWS, Azure, Backend, C#, C++, Cloud, DevOps, Frontend, Helpdesk, Java, JavaScript, Linux, Microsoft, Mobile, Node.js, Oracle, OutSystems, PHP, Project Management, Python, QA, React, Salesforce, SAP, SQL, SRE, Web — plus the full unfiltered feed for any other query.

### About ITJobs.pt

ITJobs.pt is Portugal's leading dedicated IT and technology jobs board, listing openings from direct employers, IT consultancies, and nearshore/outsourcing companies across all Portuguese tech hubs (Lisbon, Porto, and remote-first roles). It is a focused vertical alternative to general job boards, with rich technology tagging and clear remote/hybrid/on-site labeling.

### FAQ and support

#### Is it legal to scrape ITJobs.pt?

This scraper extracts only publicly available job listing data that any visitor can see without logging in. It does not access private data, bypass authentication, or violate GDPR. Always review the website's Terms of Service before large-scale scraping and ensure your use case complies with applicable laws.

#### The scraper returns 0 results

- Make sure your search query matches a supported technology tag, or leave it unset to scrape the unfiltered feed.
- Try a broader category or the default.
- The site may temporarily block automated access — try again after a few minutes, or enable proxies.

#### Can I get custom modifications?

Yes. If you need additional fields, different output formats, or integration with your systems, open an issue in the **Issues** tab or contact us for a custom solution.

#### How often should I run this scraper?

ITJobs.pt updates listings continuously. For most use cases, running once daily or weekly is sufficient. Use Apify's scheduler to automate recurring runs.

#### Does this scraper require an ITJobs.pt API key?

No. ITJobs.pt offers an official public API that requires a registered API key, but this actor scrapes the public website directly instead — no signup, no API key, no rate-limit approval process needed.

# Actor input Schema

## `searchQuery` (type: `string`):

Technology category tag to filter by (e.g. 'java', 'devops', 'react', '.net', 'python', 'aws'). Leave empty or use an unrecognized value to scrape all IT job categories. Defaults to 'java' if empty.

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

Maximum number of job offers to scrape.

## `includeDetails` (type: `boolean`):

Open each offer's native detail page for the full job description, exact address, and confirmed employment type (schema.org JobPosting data embedded on the page). Slower but much richer. Turn off for faster, listing-only results.

## `proxyConfiguration` (type: `object`):

Proxy settings. Not required for ITJobs.pt but recommended for large runs.

## Actor input object example

```json
{
  "searchQuery": "java",
  "maxResults": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PT"
  }
}
```

# 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 = {
    "searchQuery": "java",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "searchQuery": "java",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/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 '{
  "searchQuery": "java",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PT"
  }
}' |
apify call studio-amba/itjobs-pt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ITJobs.pt Scraper - Portugal IT Job Listings",
        "description": "Scrape IT and tech job listings from ITJobs.pt, Portugal's leading IT jobs board. Filter by technology category (Java, .NET, DevOps, React, and more). Extract job titles, companies, locations, work mode (remote/hybrid/on-site), employment type, and full descriptions. No login required.",
        "version": "0.1",
        "x-build-id": "4vowS70SlYJjGTMU1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~itjobs-pt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-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/studio-amba~itjobs-pt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-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/studio-amba~itjobs-pt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-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": {
                    "searchQuery": {
                        "title": "Technology / Category",
                        "type": "string",
                        "description": "Technology category tag to filter by (e.g. 'java', 'devops', 'react', '.net', 'python', 'aws'). Leave empty or use an unrecognized value to scrape all IT job categories. Defaults to 'java' if empty.",
                        "default": "java"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of job offers to scrape.",
                        "default": 50
                    },
                    "includeDetails": {
                        "title": "Include Full Details",
                        "type": "boolean",
                        "description": "Open each offer's native detail page for the full job description, exact address, and confirmed employment type (schema.org JobPosting data embedded on the page). Slower but much richer. Turn off for faster, listing-only results.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Not required for ITJobs.pt but recommended for large runs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
