# Welcome to the Jungle Gender Equality Index Scores (`gubidonius/wttj-equality-index`) Actor

Every French professional equality index published on Welcome to the Jungle, with all five indicators split out. The indicator fields are POINTS SCORED and not the size of a gap, so a pay gap field of 40 is a full mark. No filter exists for the score, so profiles are read to find it.

- **URL**: https://apify.com/gubidonius/wttj-equality-index.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** Business, Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Welcome to the Jungle Gender Equality Index Scores

Every French professional equality index published on Welcome to the Jungle, with the overall
score out of 100 and each indicator split out. No key and no login.

### The numbers are points scored, not gaps

This is the thing to get right. `genderPayGapScore` of 40 does not mean a 40 percent pay gap.
It means the company scored the full 40 points on the pay gap indicator. Algolia scores 40 on
that indicator and 95 overall. Read every score field as points earned out of a maximum.

The maximum depends on how many people the company employs. French law scores an employer of
50 to 250 people on four indicators and a larger one on five, and the pay rises indicator is
worth 35 points to the small employer and 20 to the large one.

The site keeps those two cases in two differently named fields, and the names are the wrong
way round. `gap_in_annual_raises` sounds like the general one and appears only for employers
of 50 to 250, reaching 35. `gap_in_annual_raises_excluding_promotions` sounds like the special
case and appears only above 250, reaching 20. We measured this on 370 profiles on 9 September
2026\. Trusting the names puts a score out of 35 in a column labelled out of 20.

So there is one column, `raisesScore`, with `raisesScoreOutOf` beside it saying whether it was
35 or 20. You can compare two companies without knowing any of the above.

### Finding a company that publishes one

The score is not in the search index and there is no filter for it. The only way to know is to
read the company profile, one request each, and most companies publish nothing.

Measured 9 September 2026 on 200 profiles of each group: 3.1 percent of all companies publish
an index, 43.5 percent of French employers over 50 people, and 70.5 percent of French
employers over 250 who are hiring. That last group is the default input for this reason.
`maxCompaniesRead` caps how many profiles a run will open, so a broad search cannot quietly
spend thousands of requests.

### What one row is

One company that publishes an index. A company indexed on several storefronts is read once and
charged once.

`indicatorScoreSum` is the reported indicators added up, published beside `equalityIndex` and
never instead of it. They often differ. An indicator a company cannot compute is left out by
law rather than scored zero, so a short sum is real. `indicatorsAccountForIndex` tells you
which rows add up.

### What a run admits

`RUN_SUMMARY` in the key-value store holds how many profiles were read, how many published
nothing, the hit rate, every cell with why it stopped, and `complete` with `limitedBy`.

### Billing

Two events: a start fee charged only once rows are returned, and a per-row fee charged after
each row is written. Profiles read that publish no index are never charged. A run that finds
nothing costs nothing.

# Actor input Schema

## `query` (type: `string`):

Words to look for in company names and descriptions. Leave empty to walk every company that matches your filters.

## `countries` (type: `array`):

Two-letter ISO codes of countries the company has an office in. The index is French law, so FR is the default and other countries return very little.

## `minEmployees` (type: `integer`):

The law covers French employers of 50 people and up, and the score is a legal obligation above 250. Of the companies read, 70.5 percent of French employers over 250 that are hiring publish an index, against 43.5 percent over 50 and 3.1 percent of all companies. Measured 9 September 2026.

## `hiringOnly` (type: `boolean`):

Keep only companies advertising a job right now. These are the ones whose profiles are kept up to date, so they publish an index far more often.

## `sectors` (type: `array`):

Sectors as the site writes them in English. There are 100 of them, measured 9 September 2026, and every value is checked against the live list before the search runs, so a misspelling is reported with the real spelling.

## `sizes` (type: `array`):

The five bands the site uses, written exactly as it writes them: "< 15 employees", "Between 15 and 50 employees", "Between 50 and 250 employees", "Between 250 and 2,000 employees", "> 2,000 employees".

## `labels` (type: `array`):

Certification slugs the company declares, for example bcorp, professional-equality, great-place-to-work.

## `minIndex` (type: `integer`):

Keep only companies scoring at least this out of 100. A score of 0 is a real score and is kept unless you set this. Companies scoring under 75 have three years to fix it under French law.

## `fromYear` (type: `integer`):

Keep only indexes published for this reference year or later. Most are 2025, but some companies still show 2019 or 2020, so this is how you drop a stale one.

## `language` (type: `string`):

The language for sector names and size bands, which the site holds in five languages at once. A company with no text in your language falls back to English and then to whatever it has.

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

The most rows to return, and what you are charged for. Only companies that publish an index become rows.

## `maxCompaniesRead` (type: `integer`):

The score is not in the search index and there is no filter for it, so finding a company that publishes one means reading its profile. This caps how many profiles a run will read. At the default filters about 7 profiles in 10 give a row. With no filters it is 3 in 100, and a run would read thousands of profiles for very few rows.

## Actor input object example

```json
{
  "query": "",
  "countries": [
    "FR"
  ],
  "minEmployees": 250,
  "hiringOnly": true,
  "sectors": [],
  "sizes": [],
  "labels": [],
  "language": "en",
  "maxResults": 100,
  "maxCompaniesRead": 2000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "query": "",
    "countries": [
        "FR"
    ],
    "minEmployees": 250,
    "hiringOnly": true,
    "sectors": [],
    "sizes": [],
    "labels": [],
    "language": "en",
    "maxResults": 100,
    "maxCompaniesRead": 2000
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/wttj-equality-index").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 = {
    "query": "",
    "countries": ["FR"],
    "minEmployees": 250,
    "hiringOnly": True,
    "sectors": [],
    "sizes": [],
    "labels": [],
    "language": "en",
    "maxResults": 100,
    "maxCompaniesRead": 2000,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/wttj-equality-index").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 '{
  "query": "",
  "countries": [
    "FR"
  ],
  "minEmployees": 250,
  "hiringOnly": true,
  "sectors": [],
  "sizes": [],
  "labels": [],
  "language": "en",
  "maxResults": 100,
  "maxCompaniesRead": 2000
}' |
apify call gubidonius/wttj-equality-index --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gubidonius/wttj-equality-index"
        }
    }
}
```

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/v2stc9tnQzb4KiVGH/builds/P2fcIQ8rQpEzCJFEX/openapi.json
