# Gi Group Scraper — Multi-Country Staffing Agency Jobs (`studio-amba/gigroup-scraper`) Actor

Scrape job listings from Gi Group across 17 European markets (Italy, France, Spain, Portugal, Netherlands, Switzerland, Czech Republic, Hungary, Poland, UK, Romania, Norway, Luxembourg, Lithuania, Bulgaria, Croatia, Slovakia) — one of Europe's largest staffing agencies. No login or cookies required.

- **URL**: https://apify.com/studio-amba/gigroup-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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Gi Group Scraper — Multi-Country

Extract job listings from [Gi Group](https://www.gigroup.it), one of Europe's largest staffing agencies, as clean structured JSON — across 17 European markets from a single actor. Pick a country, search by keyword, and get job titles, location, industry, contract type, posting date and a description excerpt.

No login. No cookies. No browser automation. Gi Group runs the same WordPress job-search platform on every country site this actor covers, and this actor talks to it directly over plain HTTP.

### What this actor does

Gi Group — founded in Italy, now present in dozens of countries — runs a shared job-search plugin on a separate marketing site per market (`{country-code}.gigroup.com`, with Italy as the exception at `www.gigroup.it`). Every one of the 17 markets below accepts the exact same query parameters (`job` for keyword, `placeOfWork` for location, `npage` for pagination) and renders server-side HTML, so no JavaScript execution is needed.

For each job this actor returns:

- Job title, Gi Group's internal "codified role", industry and professional area
- Location (province/region) and, where disclosed, work mode (on-site/remote)
- Contract type and shift tags
- Posting date — either exact (where Gi Group discloses one) or a best-effort estimate (see Limitations)
- A description excerpt (up to 600 characters)
- Gi Group's own detail-page URL and application link

### Supported countries

| Input value | Market |
|---|---|
| `IT` | Italy — default |
| `FR` | France |
| `ES` | Spain |
| `PT` | Portugal |
| `NL` | Netherlands |
| `CH` | Switzerland |
| `CZ` | Czech Republic |
| `HU` | Hungary |
| `PL` | Poland |
| `UK` | United Kingdom |
| `RO` | Romania |
| `NO` | Norway |
| `LU` | Luxembourg |
| `LT` | Lithuania |
| `BG` | Bulgaria |
| `HR` | Croatia |
| `SK` | Slovakia |

All 17 were verified live in August 2026 against real, current listings before shipping. Smaller markets (Switzerland, Norway, Luxembourg, Bulgaria, Croatia) genuinely carry far fewer live postings than Italy or France at any given time — that's Gi Group's real listing volume there, not a scraping gap.

Four markets were investigated and deliberately left out:

- **Germany and Denmark** run on a completely different vendor platform (a Talention React widget at `jobs.gigroup.de`, with its own API), not the WordPress plugin every market above shares. Covering them would need a separate build.
- **Ireland**'s listed domain (`ei.gigroup.com`) does not resolve (DNS NXDOMAIN) — dead, despite still appearing in Gi Group's own country switcher.
- **Belgium**'s job-search page (`be.gigroup.com/current-vacancies/`) returns HTTP 404 even though the page content renders — broken on Gi Group's own site, not something this actor can work around.
- **Finland** does not appear in Gi Group's country switcher at all and its domain doesn't resolve — Gi Group does not appear to operate a Finnish market site.

### Why use it

- **Pan-European staffing market research** — track what roles Gi Group is placing across 17 markets from one tool instead of 17.
- **Recruitment and sourcing** — build a live feed of temp and permanent positions for a role, industry or region.
- **Market-entry and workforce planning** — see which sectors and locations a major staffing agency is actively hiring for, market by market.

### How to scrape Gi Group data

1. Open the actor and pick a **Country** (e.g. `FR` for France).
2. Set a **Search Query** in the local language (e.g. `magazziniere` for Italy, `comptable` for France, `almacen` for Spain, `magazynier` for Poland, `warehouse` for the UK). Leave it empty to get all current listings for the selected country.
3. Optionally set a **Location filter** to narrow results to a city or region.
4. Set **Max Results** — each result triggers one extra request to fetch its full description, so keep this proportional to how much detail you need. Remember that smaller markets may have far fewer live listings than your cap.
5. Leave the proxy on the default automatic setting (Gi Group showed no anti-bot protection during testing) and click **Start**.

The actor pages through Gi Group's job-search HTML (roughly 20 results per page) until it reaches your Max Results or runs out of listings, fetches the detail page for each selected job to pull the full description and posting date, and writes everything to the dataset.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `country` | string | Market to search. One of `IT`, `FR`, `ES`, `PT`, `NL`, `CH`, `CZ`, `HU`, `PL`, `UK`, `RO`, `NO`, `LU`, `LT`, `BG`, `HR`, `SK`. Default: `IT`. |
| `searchQuery` | string | Keyword in the local language. Empty = all current listings. |
| `location` | string | Optional city/region filter, passed to Gi Group's own location search. |
| `maxResults` | integer | Maximum number of listings to return (max 500). Default: `50`. |
| `proxyConfiguration` | object | Apify proxy settings. Default: automatic (no anti-bot protection found). |

#### Example input

```json
{
    "country": "IT",
    "searchQuery": "magazziniere",
    "location": "",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
```

### Output

Each dataset item looks like this:

```json
{
    "jobTitle": "MAGAZZINIERE CARRELLISTA",
    "company": "Gi Group",
    "codifiedRole": "Magazziniere",
    "industry": "Altro",
    "professionalArea": "Altro",
    "province": "Cremona",
    "locationRaw": "Vailate, CR, Lombardia",
    "workMode": "In presenza",
    "employmentType": "Altro, Contratto a tempo determinato - in somministrazione, Full time",
    "featured": false,
    "postedAtRaw": "Annuncio pubblicato 9 giorni fa",
    "postedAt": "2026-07-30T19:44:07.331Z",
    "descriptionSnippet": "Gi Group, prima Agenzia per il Lavoro Italiana con oltre 200 filiali sul territorio nazionale...",
    "url": "https://www.gigroup.it/offerte-lavoro-dettaglio/vailate-cremona-magazziniere-carrellista/1342457/",
    "applyUrl": "https://it.mygigroup.com/members/jobs/seek/viewoffer/1342457",
    "source": "www.gigroup.it/offerte-lavoro/",
    "scrapedAt": "2026-08-08T19:44:14.441Z",
    "offerNumber": "1342457",
    "country": "Italy"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `jobTitle` | string | Job title, as posted |
| `company` | string | Always `Gi Group` |
| `codifiedRole` | string | Gi Group's internal standardized role name |
| `industry` | string | Industry sector |
| `professionalArea` | string | Broad professional area/category |
| `province` | string | Province/administrative area |
| `locationRaw` | string | Location as shown on the listing |
| `workMode` | string | Work arrangement (e.g. on-site), when disclosed |
| `employmentType` | string | Contract type + shift tags, comma-separated, when disclosed |
| `featured` | boolean | Whether the listing was marked as featured/promoted |
| `postedAtRaw` | string | Original posting-date text or exact date, before parsing |
| `postedAt` | string | Best-effort ISO 8601 posting date |
| `descriptionSnippet` | string | Up to 600-character plain-text excerpt |
| `url` | string | Gi Group's own detail-page link |
| `applyUrl` | string | Gi Group's application link |
| `source` | string | Source domain + path, e.g. `www.gigroup.it/offerte-lavoro/` |
| `scrapedAt` | string | ISO 8601 timestamp of collection |
| `offerNumber` | string | Gi Group's internal offer/job reference number |
| `country` | string | Market this listing was scraped from |

### Cost estimate

Each run makes one listing-page request per ~20 results plus one detail-page request per result. Both are lightweight HTML requests over the automatic Apify proxy — no browser, no residential proxy needed. Usage is only charged after a run finishes with status SUCCEEDED — a failed or aborted run doesn't bill for partial results.

### Limitations

- **Germany, Denmark, Ireland, Belgium and Finland are not covered** — see "Supported countries" above for why each was dropped.
- **`postedAt` is best-effort.** Gi Group runs two different page templates across its markets. Some (UK, Croatia, Czech Republic, Norway, Slovakia, ...) show an exact date; others (Italy, France, Spain, Poland, ...) only show a localized relative string like "32 days ago" or "posted today" — for those, `postedAt` is computed by subtracting that number of days from the scrape time, so it can be off by up to a day. `postedAtRaw` always keeps the original text so nothing is silently lost.
- **`workMode` and `employmentType` are not disclosed on every market.** A handful of markets (UK, Croatia, Czech Republic, ...) don't show a work-mode icon or a structured contract-type chip on their listings at all — those fields are left empty rather than guessed.
- **Location filtering depends on Gi Group's own search.** Results are only as good as what Gi Group's `placeOfWork` parameter matches.
- **Smaller markets have genuinely few live listings.** Switzerland, Norway, Luxembourg, Bulgaria and Croatia typically show single digits to low tens of open roles at any time — that reflects Gi Group's real presence there.

### Related scrapers

Building a European staffing dataset? These sibling actors follow the same clean-JSON approach:

- **Adecco Scraper (Multi-Country)** — Belgium, Netherlands, France, Spain, Italy, Poland
- **Hays Scraper** — UK commercial recruitment
- **Randstad Belgium Scraper** — the world's largest staffing agency, Belgian market
- **VDAB Scraper** — Flemish public employment service
- **StepStone Scraper** — Belgian commercial job board

### Disclaimer

This actor collects publicly available data from Gi Group for legitimate research and aggregation use. Respect Gi Group's terms of service and applicable data protection law when using the output.

# Actor input Schema

## `country` (type: `string`):

Gi Group market to search.

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

Keyword to search for, in the local language (e.g. 'magazziniere' for Italy, 'comptable' for France, 'almacen' for Spain, 'magazynier' for Poland, 'warehouse' for the UK). Leave empty to return all current listings for the selected country.

## `location` (type: `string`):

Optional city or region to filter results by (e.g. 'Milano', 'Lyon', 'Warszawa'). Passed to Gi Group's own location search.

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

Maximum number of job listings to return. Each result triggers one extra request to fetch the full description, so very large values take proportionally longer. Smaller markets (CH, NO, LU, BG, HR) may have far fewer live listings than this cap.

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

Apify proxy settings. Gi Group's job-search pages showed no anti-bot protection during testing, so the automatic default is sufficient.

## Actor input object example

```json
{
  "country": "IT",
  "searchQuery": "magazziniere",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": "magazziniere",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/gigroup-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": "magazziniere",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/gigroup-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/gigroup-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Lrb6zlFeZYPACh77f/builds/e5uhiqN7THAoScBlQ/openapi.json
