# Salary Data API: Pay Ranges by Job Title & Level (`redomic/salary-data`) Actor

Get salary benchmarks (p10-p90, annualised, with n) and pay ranges from 150,000+ employer-posted jobs across 11,000+ companies, updated daily. Filter by title, seniority, country and currency. No scraping at run time.

- **URL**: https://apify.com/redomic/salary-data.md
- **Developed by:** [Redomic](https://apify.com/redomic) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 benchmarks

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Salary Data API: Pay Ranges by Job Title, Level and Location

What do US companies pay a mid-level software engineer right now? This Actor answers from the pay ranges employers publish in their own job ads: about 150,000 salary-bearing postings at more than 11,000 companies, refreshed every day. You get percentiles (p10 to p90) by job title, level and country, or the individual postings behind them, each with a link to the ad.

### Who uses it

- **Recruiters and hiring managers** checking an offer against what other companies advertise for the same role.
- **Compensation teams** building or reviewing pay bands by level and location.
- **HR tech products and job sites** that show salary estimates and want fresh numbers through an API.

### What you get

A run on 15 November 2026 for `software engineer` in the United States returned these benchmarks (yearly pay, USD):

| Level | 25th percentile | Median | 75th percentile | Job ads | Companies |
|---|---|---|---|---|---|
| Intern | $90,900 | $101,367 | $114,400 | 54 | 37 |
| Junior | $122,500 | $140,000 | $150,000 | 85 | 54 |
| Mid | $152,500 | $190,000 | $225,000 | 2,418 | 740 |
| Senior | $180,521 | $200,000 | $222,500 | 2,229 | 783 |
| Lead/Principal | $213,688 | $239,200 | $276,498 | 1,504 | 541 |
| Manager | $167,500 | $200,000 | $251,125 | 11 | 9 |

Each benchmark row also carries p10 and p90, the currency, the data date, and up to five sample employers with links to their postings, so you can check where a number comes from.

Ask for the postings themselves and you get one row per job ad. Data engineer jobs in the US posted in the last two weeks, from the same day:

| Company | Role | Level | Location | Posted range (USD per year) | Posted |
|---|---|---|---|---|---|
| Triumph | Data Engineer | Mid | San Francisco | 200,000 to 400,000 | 13 Nov |
| Superhuman | Data Engineer, Foundations | Mid | San Francisco | 206,000 to 290,000 | 13 Nov |
| Gatik AI | Senior Data Engineer | Senior | Santa Clara, CA | 180,000 to 260,000 | 13 Nov |
| Wayve | Data Engineer, Security Analytics | Mid | Sunnyvale, CA | 186,100 to 243,300 | 13 Nov |
| Block | Staff Data Engineer | Lead/Principal | Bay Area, CA | 239,600 to 359,400 | 12 Nov |

### Where the numbers come from

Several US states, including California, New York, Colorado and Washington, require employers to post a pay range in job ads, and more EU countries are following. We collect the open jobs on more than 11,000 company career sites (Greenhouse, Lever and Ashby boards) every day and keep the ads that include a range.

Each ad counts once, at the midpoint of its range, converted to a yearly figure. A level with fewer than 5 ads or fewer than 5 different employers is left out, so you never quote a median that rests on one company.

Coverage is strongest in the US, and in tech hubs in particular. Europe and Canada have fewer ads with posted pay, so their benchmarks rest on smaller samples. Check the job ad count (`n`) and the company count (`companies`) before you quote a number.

### Modes

| Mode | What you get |
|---|---|
| `benchmark` (default) | Percentiles by title, level, country and currency. Set `cells: true` to split them by city as well. Set `benchmarkByCompany: true` to see one row per company. |
| `jobs` | The individual ads with posted range, yearly range, level, location, posting date and URL. |
| `closed` | Pay from ads that closed recently: the roles that were actually filled, not ads that stay up for months. |

### Price

$5 per 1,000 benchmark rows and $1 per 1,000 job rows. There's no start fee. The software engineer query above returned 6 benchmark rows and cost $0.03.

### How to run it

Benchmarks for one role in one country:

```json
{
  "mode": "benchmark",
  "jobTitles": ["product manager"],
  "countries": ["United States"]
}
```

Fresh job ads in a pay band, for sourcing or a quick market check:

```json
{
  "mode": "jobs",
  "jobTitles": ["data engineer"],
  "countries": ["United States"],
  "minSalaryAnnual": 150000,
  "postedWithinDays": 14,
  "maxItems": 100
}
```

What recently filled roles paid:

```json
{
  "mode": "closed",
  "jobTitles": ["software engineer"],
  "countries": ["United States"]
}
```

Ready-made searches, each with sample results on its own page:

- [Software engineer salary in the US](https://apify.com/redomic/salary-data/examples/software-engineer-salary-us)
- [Data engineer salary in the US](https://apify.com/redomic/salary-data/examples/data-engineer-salary-us)
- [Machine learning engineer salary in the US](https://apify.com/redomic/salary-data/examples/machine-learning-engineer-salary-us)
- [Product manager salary in the US](https://apify.com/redomic/salary-data/examples/product-manager-salary-us)
- [Registered nurse salary in the US](https://apify.com/redomic/salary-data/examples/registered-nurse-salary-us)
- [UX designer salary in the US](https://apify.com/redomic/salary-data/examples/ux-designer-salary-us)
- [Accountant salary in the US](https://apify.com/redomic/salary-data/examples/accountant-salary-us)
- [Senior software engineer salary in Canada](https://apify.com/redomic/salary-data/examples/senior-software-engineer-salary-ca)

### Track pay over time

Set `monitor: true` and schedule the Actor daily. The first run returns everything as `new`. After that you get only rows that are `new`, `changed` (a pay range or level moved) or `removed`. You pay only for new and changed rows, so a quiet day costs nothing.

For benchmarks, `output: "events"` returns a row only when the 25th percentile, median or 75th percentile moves by more than `changeBand` (5% by default). Connect the run to Slack, email or Google Sheets through Apify integrations and you get an alert when the market moves.

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `benchmark` | `benchmark`, `jobs` or `closed`. |
| `jobTitles` | `["software engineer"]` | Matches whole words in the job title. Leave it empty to group benchmarks by role family instead. |
| `roleFamilies` | all | For example `Engineering - Data`, `Product Management`, `Sales`, `Healthcare/Clinical`. |
| `seniority` | all | `Intern`, `Junior`, `Mid`, `Senior`, `Lead/Principal`, `Manager`, `Director`, `Executive`. |
| `countries` | all | A name or ISO code: `United States`, `US`, `Germany`. |
| `locations` | all | Any part of the location text: a city, state or region. |
| `remoteOnly` | `false` | Remote jobs only. |
| `companies` | all | Company names or board tokens. |
| `currency` | as posted | Convert to `USD`, `EUR`, `GBP`, `CAD` or `AUD` at the fixed rates below. |
| `minSalaryAnnual`, `maxSalaryAnnual` | none | Keep ads whose yearly range overlaps this band. |
| `postedWithinDays` | none | Keep ads posted in the last N days. |
| `minDaysOpen`, `maxDaysOpen` | none | Keep ads open at least or at most N days. |
| `excludeEvergreen` | `false` | Drop ads open for 180 days or more. |
| `minSample` | `5` | The fewest ads a benchmark needs before it's returned. |
| `cells` | `false` | Split benchmarks by city. |
| `benchmarkByCompany` | `false` | In benchmark mode, return one row per company with `company`, percentiles and `n`. Single-employer groups are allowed in this mode. |
| `includeAggregators` | `false` | Include job boards that repost other companies' ads. |
| `maxItems` | `20` | The most rows to return. |
| `monitor`, `stateKey` | off | Return only changes since the last run (see above). |
| `output`, `changeBand` | `rows`, `0.05` | `events` returns only benchmark moves bigger than `changeBand`. |

### Output fields

**Benchmark row:** `query`, `roleFamily`, `seniority`, `country`, `city` (cells only), `company` (company benchmarks only), `currency`, `period`, `p10`, `p25`, `p50`, `p75`, `p90`, `n`, `companies`, `sampleCompanies`, `sampleJobUrl1` to `sampleJobUrl3`, `dataAsOf`.

**Job row:** `company`, `title`, `roleFamily`, `seniority`, `location`, `country`, `remote`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryAnnualMin`, `salaryAnnualMax`, `url`, `postedAt`, `firstSeen`, `ageDays`, `daysOpen`, `dataAsOf`.

Every column is flat, so the results open cleanly in Excel or Google Sheets.

### Currency conversion

Leave `currency` empty to keep each ad's own currency. If you set one, the Actor converts with these fixed rates from 8 November 2026 (value of one unit in USD): EUR 1.08, GBP 1.29, CAD 0.73, AUD 0.65, CHF 1.13, SEK 0.096, NOK 0.094, DKK 0.145, PLN 0.26, INR 0.012, JPY 0.0064, SGD 0.78, NZD 0.60, HKD 0.128, BRL 0.19, MXN 0.055, ZAR 0.058, ILS 0.27.

### FAQ

**Is this survey data?**
No. Every number comes from a pay range an employer published in a job ad. Nobody self-reports anything.

**Are posted ranges what people actually earn?**
They're what the employer advertised. Final offers can land anywhere in the range, and bonuses and equity usually aren't included.

**Why is a level or city missing?**
It had fewer than 5 ads or fewer than 5 employers. Lower `minSample` if you want thinner samples, and check `n` and `companies` before you rely on them. With `benchmarkByCompany: true`, single-employer groups are returned when they meet `minSample`.

**How do you compute the median?**
Each ad contributes the midpoint of its range, converted to a yearly amount (hourly × 2,080, daily × 260, weekly × 52, monthly × 12). Percentiles use linear interpolation over those midpoints.

**How fresh is it?**
We collect the jobs every day. `dataAsOf` on each row tells you the date of the data behind it.

**Can I use it from my own code?**
Yes. Call the Actor through the Apify API or a client library and read the dataset as JSON or CSV.

### En español

Benchmarks salariales a partir de los rangos de pago que publican las empresas en sus ofertas: percentiles por puesto, nivel y país, o las ofertas individuales con su enlace. Datos actualizados cada día.

### Auf Deutsch

Gehaltsdaten aus den Gehaltsspannen, die Arbeitgeber in ihren Stellenanzeigen veröffentlichen: Perzentile nach Jobtitel, Level und Land oder die einzelnen Anzeigen mit Link. Täglich aktualisiert.

### Ready-made examples

Each one opens a saved run you can copy and start with one click.

- [Software engineer salary in the US](https://apify.com/redomic/salary-data/examples/software-engineer-salary-us): Software engineer pay percentiles (p10, p25, median, p75, p90) in the United States by seniority, computed from salary ranges that employers publish in their own job posts, with the sample size and company count behind every number
- [Data Engineer salary in the US](https://apify.com/redomic/salary-data/examples/data-engineer-salary-us): Data Engineer salary in the United States
- [Machine Learning Engineer salary in the US](https://apify.com/redomic/salary-data/examples/machine-learning-engineer-salary-us): Machine Learning Engineer salary in the United States
- [Product Manager salary in the US](https://apify.com/redomic/salary-data/examples/product-manager-salary-us): Product Manager salary in the United States
- [Registered Nurse salary in the US](https://apify.com/redomic/salary-data/examples/registered-nurse-salary-us): Registered Nurse salary in the United States
- [UX Designer salary in the US](https://apify.com/redomic/salary-data/examples/ux-designer-salary-us): UX Designer salary in the United States
- [Accountant salary in the US](https://apify.com/redomic/salary-data/examples/accountant-salary-us): Accountant salary in the United States
- [Senior Software Engineer salary in Canada](https://apify.com/redomic/salary-data/examples/senior-software-engineer-salary-ca)

### Use it from AI agents (MCP) and Python

**AI agents.** Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client through the Apify MCP server. The agent reads the input schema, so a plain request is enough.

```json
{
  "mcpServers": {
    "salary-data": {
      "url": "https://mcp.apify.com?tools=redomic/salary-data",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

**Python.** `pip install apify-client`, then:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("redomic/salary-data").call(run_input={"mode": "benchmark", "jobTitles": ["software engineer"], "maxItems": 5})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### More from us

- [Allabolag Scraper - Swedish Company Data](https://apify.com/redomic/allabolag-company-scraper): Scrape allabolag.se for Swedish company financials, industry, status and board role titles by search, org number or URL
- [Ashby Jobs Scraper with Salaries](https://apify.com/redomic/ashby-jobs-monitor): Ashby jobs scraper for any startup careers board (OpenAI, Ramp, Notion and thousands more), with salary ranges as numbers: min, max, currency, period, plus equity and bonus flags
- [ATS Jobs Search: Greenhouse, Lever & Ashby Jobs API](https://apify.com/redomic/ats-jobs-search): Search 300,000+ open jobs from 11,000+ companies on Greenhouse, Lever and Ashby in one run
- [Blocket Scraper: Car Monitor](https://apify.com/redomic/blocket-se-scraper): Blocket scraper: each run returns up to 2,500 Blocket Bil and Torget listings as flat rows with price, make, model, year, mileage, VIN, inspections and seller
- [Closed Jobs Tracker: Filled Roles & Time-to-Fill](https://apify.com/redomic/closed-jobs-tracker): Search closed jobs from 11,000+ companies with closedOn, daysOpen and time-to-fill signals
- [Google Jobs Scraper - Job Postings API](https://apify.com/redomic/google-jobs): Google Jobs and job postings scraper: get job title, company, location, posted date, salary, full description and every apply link for any search
- [Google Trends API: Trending Now & Interest Over Time](https://apify.com/redomic/google-trends): Trending-now searches and new-trends alerts/monitoring per country with the news behind them, plus interest over time, interest by region, and related and rising queries for any keyword
- [GovDeals Scraper](https://apify.com/redomic/govdeals-scraper): Search and monitor GovDeals government surplus auctions
- [Greenhouse Jobs Monitor & Scraper](https://apify.com/redomic/greenhouse-jobs-monitor): Monitor Greenhouse jobs from any company careers board (Airbnb, Stripe, Discord and thousands more)
- [Job Postings Dataset: 320k+ Open Jobs, Updated Daily](https://apify.com/redomic/job-postings-dataset): 320,000+ open jobs from 10,000+ company career sites (Greenhouse, Lever, Ashby), updated daily with first-seen and closed dates
- [Lever Jobs Scraper with Salaries](https://apify.com/redomic/lever-jobs-monitor): Lever jobs scraper for any company's careers page (Palantir, Spotify, Zoox, Shield AI and thousands more): flat rows with title, team, location, workplace, commitment, apply link, salary as numbers and the full description merged
- [Marktplaats.nl Scraper](https://apify.com/redomic/marktplaats-nl): Scrape Marktplaats.nl listings into clean rows: title, price in EUR, condition, seller, location, images
- [Otodom Scraper: Poland Property Listings & Price Monitor](https://apify.com/redomic/otodom-scraper): Scrape Otodom.pl property listings in Poland
- [Otomoto.pl Scraper](https://apify.com/redomic/otomoto-scraper): Scrape Otomoto.pl Polish car listings: one run returns used-car rows with price, make, model, year, mileage, fuel, gearbox, seller and URL
- [Personio Jobs Scraper](https://apify.com/redomic/personio-jobs): Scrape open jobs from Personio company career pages (jobs.personio.de/.com XML feeds)
- [SIRET Company Scraper](https://apify.com/redomic/siret-company-scraper): Search French companies by name, SIREN or SIRET
- [SUUMO Scraper - Japan Property Listings](https://apify.com/redomic/suumo-scraper): Scrape SUUMO Japan property listings from search URLs for rentals and sales
- [Talabat Scraper — Menus, Prices & Delivery Fees](https://apify.com/redomic/talabat-scraper): Talabat menus, prices and delivery fees as flat rows in 8 MENA markets
- [Workday Jobs Scraper](https://apify.com/redomic/workday-jobs): Search and monitor public Workday (myworkdayjobs.com) job postings

# Changelog

This Actor's version history is a separate document: https://apify.com/redomic/salary-data/changelog.md

# Actor input Schema

## `mode` (type: `string`):

"benchmark" returns percentile pay summaries (default). "jobs" returns individual salary-bearing job rows. "closed" returns pay benchmarks and rows from postings that closed (what those roles actually paid).

## `jobTitles` (type: `array`):

Any-of match on the job title (whole words, case-insensitive). Empty = all titles; when empty, benchmarks group by role family instead of title query.

## `roleFamilies` (type: `array`):

Filter to these role families. Empty = all.

## `seniority` (type: `array`):

Empty = all.

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

Keep jobs whose location or country text contains any of these (e.g. United States, Germany). Empty = all.

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

Keep jobs whose location contains any of these substrings (city, region, country text). Empty = all.

## `remoteOnly` (type: `boolean`):

Only remote jobs.

## `companies` (type: `array`):

Limit to these companies (board token or company name). Empty = all.

## `currency` (type: `string`):

Leave empty to report salaries as posted. Set a target ISO 4217 code (USD, EUR, GBP, CAD, AUD) to convert using fixed rates listed in the README.

## `minSample` (type: `integer`):

Benchmark cells with fewer matching jobs are not returned. The summary row reports how many were skipped.

## `maxItems` (type: `integer`):

Maximum benchmark or job rows returned (and billed).

## `includeAggregators` (type: `boolean`):

Aggregator boards re-post other companies' jobs. They are excluded by default.

## `cells` (type: `boolean`):

When true, benchmark mode returns role x city x seniority cells with n, p25/p50/p75, asOf and sampleSize. Cells with n < 5 return \_status insufficient_sample with no percentiles. Current posted salaries only.

## `benchmarkByCompany` (type: `boolean`):

When true, benchmark mode groups rows by company as well as query/role family, seniority and country/currency, returning one row per company with company, percentiles, n and sample links. A single-employer cell is allowed only in this mode.

## `minSalaryAnnual` (type: `integer`):

Keep only jobs whose annualised posted range (in report currency) overlaps this minimum or above. 0 = no filter.

## `maxSalaryAnnual` (type: `integer`):

Keep only jobs whose annualised posted range (in report currency) overlaps this maximum or below. 0 = no filter.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted (or first seen) within this many days of the snapshot date (dataAsOf). 0 = no filter. Job rows carry ageDays so you can see posting age.

## `minDaysOpen` (type: `integer`):

Keep only jobs that have been open at least this many days (dataAsOf minus firstSeen/trackedSince). 0 = no filter. Job rows carry daysOpen.

## `maxDaysOpen` (type: `integer`):

Keep only jobs that have been open at most this many days (dataAsOf minus firstSeen/trackedSince). 0 = no filter. Job rows carry daysOpen.

## `excludeEvergreen` (type: `boolean`):

When true, exclude jobs open 180 days or more since firstSeen/trackedSince. Job rows carry evergreen so you can see posting staleness.

## `monitor` (type: `boolean`):

When true, keep a named key-value state per filter set and return only rows that are new, changed or removed since the previous run, each with changeType. Removed rows are free; only new and changed rows are billed, so a quiet scheduled run ends SUCCEEDED with 0 billed rows.

## `stateKey` (type: `string`):

Optional stable name for the monitor history. Leave empty to derive one from the filters (each distinct filter set keeps its own history). Set it to share one history across runs with different filters.

## `output` (type: `string`):

"rows" returns the full snapshot (default). "events" returns only material benchmark changes (p25/p50/p75 shifts beyond changeBand) with n, window, asOf and confidence; an unchanged run ends SUCCEEDED with 0 events.

## `changeBand` (type: `number`):

Minimum relative shift in p25, p50 or p75 (e.g. 0.05 = 5%) required to emit a benchmark change event when output=events. Ignored for output=rows.

## Actor input object example

```json
{
  "mode": "benchmark",
  "jobTitles": [
    "software engineer"
  ],
  "roleFamilies": [],
  "seniority": [],
  "countries": [],
  "locations": [],
  "remoteOnly": false,
  "companies": [],
  "currency": "",
  "minSample": 5,
  "maxItems": 20,
  "includeAggregators": false,
  "cells": false,
  "benchmarkByCompany": false,
  "minSalaryAnnual": 0,
  "maxSalaryAnnual": 0,
  "postedWithinDays": 0,
  "minDaysOpen": 0,
  "maxDaysOpen": 0,
  "excludeEvergreen": false,
  "monitor": false,
  "stateKey": "",
  "output": "rows",
  "changeBand": 0.05
}
```

# Actor output Schema

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

All result rows from the default dataset.

# 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 = {
    "jobTitles": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("redomic/salary-data").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 = { "jobTitles": ["software engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("redomic/salary-data").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 '{
  "jobTitles": [
    "software engineer"
  ]
}' |
apify call redomic/salary-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,redomic/salary-data"
        }
    }
}
```

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/6ozFowbYx3hGleF3F/builds/Z5QEbORiv8OpVGMhd/openapi.json
