# BioSpace Jobs Scraper: Filtered Biotech and Pharma Job Listings (`getascraper/biospace-jobs-scraper`) Actor

Scrape BioSpace biotech and pharma job postings, one row per job. Filter by keyword, location, company, industry, job type, work arrangement, education, biotech hub, posting date, and published pay. Export as spreadsheet or JSON. Pay appears only when the employer published it. $0.05 per 1,000 jobs.

- **URL**: https://apify.com/getascraper/biospace-jobs-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 job postings

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

## 🔬 BioSpace Jobs Scraper: Biotech and Pharma Job Listings

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#F0FAF9;border:1px solid #C9E9E5;border-top:4px solid #0F766E;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Biotech and pharma job listings from BioSpace, ready for your spreadsheet</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Pull the newest BioSpace postings with title, company, location, posting date, job type, work arrangement, and published pay. Filter by keyword, location, employer, industry, education, job type, work style, posting date, and pay.</span>
</td>
</tr>
</table>
<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9E9E5;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B5F58">🧬 Life-science roles</span><br>
<span style="font-size:12px;color:#57534E">Pharma, biotech, and nonprofit postings in one clean list.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9E9E5;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B5F58">💰 Pay as published</span><br>
<span style="font-size:12px;color:#57534E">Salary appears only when the employer wrote it in the posting.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9E9E5;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B5F58">🎯 Filter before you save</span><br>
<span style="font-size:12px;color:#57534E">Narrow by keyword, location, employer, industry, job type, work style, education, posting date, or published pay.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9E9E5;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B5F58">📋 Consistent fields</span><br>
<span style="font-size:12px;color:#57534E">The same columns on every row, with missing values left blank.</span>
</td>
</tr>
</table>

BioSpace is a major hub for life-science jobs. This Actor reads its newest postings and returns each one as a structured row. Use it to build a job feed, track hiring in one niche, or compare published pay across employers.

### 🔍 What does the BioSpace Jobs Scraper do?

The Actor reads the newest BioSpace job listings, one page of 20 postings at a time. It saves each posting as one row with the details the employer published. It keeps only the postings that match your filters.

It fits three common jobs:

- Recruiters and staffing teams watching openings in a specific therapeutic area or city.
- Market analysts tracking hiring volume, job types, and published pay across biotech and pharma.
- HR-tech and job-board teams that need a clean, repeatable feed of life-science roles.

### 👥 Who uses it

For example:

- **A recruiter** searches for "regulatory affairs" in Massachusetts each week and sends the new rows to the hiring managers.
- **A compensation analyst** keeps only postings with published pay and compares salary ranges by job title.
- **A job-board editor** pulls full-time, on-site postings with the full description to fill a niche board.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F0FAF9;border:1px solid #C9E9E5;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Set your filters</span><br>
<span style="font-size:12px;color:#57534E">Pick the filters you need, such as job type, work style, or posting date. Leave them empty for all postings.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FAF9;border:1px solid #C9E9E5;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose how many jobs</span><br>
<span style="font-size:12px;color:#57534E">Set the number of jobs to save and the number of pages to scan.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FAF9;border:1px solid #C9E9E5;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run and download</span><br>
<span style="font-size:12px;color:#57534E">Start the run, then export the results as a spreadsheet or JSON from the Output tab.</span>
</td>
</tr>
</table>

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Pages to scan | integer | No | Pages of 20 newest postings to read. Default 10, up to 200. |
| Keyword | text | No | Keep postings whose title or description contains this text. Leave empty for all postings. |
| Location | text | No | Keep postings whose city, state, country, or location text contains this value. |
| Job type | enum | No | Any, Full-time, Part-time, Contract, or Consultant. Default: Any. |
| Work arrangement | enum | No | Any, On-site, Hybrid, or Remote. Default: Any. |
| Education required | enum | No | Keep postings that ask for one education level, from high school to doctorate. Default: Any. |
| Biotech hub | enum | No | Keep postings BioSpace tags with one biotech hub, such as Genetown or Biotech Bay. Default: Any. |
| Posted within (days) | integer | No | Keep postings published in the last N days. 0 keeps every date. Default: 0. |
| Only postings with published pay | yes or no | No | Keep only postings where the employer wrote a pay amount. Default: off. |
| Company name | text | No | Keep postings from employers whose name contains this text. Leave empty for all employers. |
| Industry | enum | No | Keep postings from one employer industry, such as Pharmaceutical or Biotechnology. Default: Any. |
| Maximum jobs to save | integer | No | The most jobs saved in one run. Default 20, up to 500. |
| Include full job description | yes or no | No | Adds the full posting text to each row. Default: off. |
| Proxy configuration | proxy settings | No | Network setting for the run. Default: Apify proxy. |

Filters apply to the newest postings the run reads. A narrow keyword can need more pages to fill your job count.

### 📊 Output data

Each saved job is one row. Fields the employer did not publish are left out of that row.

| Field | Type | Description |
| --- | --- | --- |
| id | text | BioSpace job number. |
| jobUrl | text | Link to the posting on BioSpace. |
| title | text | Job title. |
| company | text | Employer name. |
| location | text | Location as written on the posting. |
| city | text | City. |
| state | text | State or region. |
| country | text | Country code. |
| postedAt | text | Posting date in ISO format. |
| positionType | text | full-time, part-time, contract, or consultant. |
| workArrangement | text | on-site, hybrid, or remote. |
| requiredEducation | text | Education level the posting asks for. |
| industry | text | Industry label, such as pharmaceutical or biotechnology. |
| disciplines | list | Job function labels. |
| salaryAsPublished | text | The pay sentence exactly as the employer wrote it. Only present when the posting states pay. |
| description | text | Full posting text. Only present when Include full job description is on. |

Example row:

```json
{
  "id": "3081874",
  "jobUrl": "https://jobs.biospace.com/job/3081874/associate-director-of-respiratory-provider-experience",
  "title": "Associate Director of Respiratory Provider Experience",
  "company": "Sanofi US",
  "location": "Cambridge, Massachusetts",
  "city": "Cambridge",
  "state": "Massachusetts",
  "country": "US",
  "postedAt": "2026-10-06T16:27:13.524Z",
  "positionType": "full-time",
  "workArrangement": "on-site",
  "requiredEducation": "associate-degree",
  "industry": "pharmaceutical",
  "disciplines": ["marketing", "strategic-marketing", "sales-and-service", "market-access"]
}
```

### 💰 Pricing

Pricing is set in the Apify Console. The Free plan limits below apply to Free plan runs.

**Free plan limits:** 25 jobs per run, 3 runs per day, and a 30-minute wait between runs. Upgrade to a paid plan to remove these limits.

### ⭐ Enjoying BioSpace Jobs Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F0FAF9;border:1px solid #C9E9E5;border-left:5px solid #0F766E;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you a manual search of BioSpace, a rating helps the next recruiter or analyst find it.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds. Your feedback also tells us which filters to add next.</span>
</td>
</tr>
</table>
<table width="100%">
<tr>
<td style="padding:0;background:#0F766E;border:1px solid #C9E9E5;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/biospace-jobs-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

**Does the Actor show salaries for every job?**
No. It returns pay only when the employer wrote it in the posting. Many postings do not state pay, so many rows will leave this field empty. Turn on Only postings with published pay to skip them.

**Why did my run return fewer jobs than I asked for?**
The Actor reads the newest postings first, then applies your filters. A narrow keyword or location can need more pages. Raise Pages to scan and run again.

**Do I need a BioSpace account?**
No. The Actor reads public job listings and does not log in.

**Can I get the full job description?**
Yes. Turn on Include full job description. It is off by default to keep the dataset lighter.

### 🔗 Other actors

- [AllJobs.co.il Scraper: משרות ודרושים API](https://apify.com/getascraper/alljobs-scraper) ↗ - Israeli job listings with listed salaries and full descriptions.
- [CutShort Jobs Scraper: India Tech Salaries](https://apify.com/getascraper/cutshort-scraper) ↗ - India tech job postings with salary ranges.
- [BizReach Japan Jobs Scraper: ビズリーチ Salary and Company Records](https://apify.com/getascraper/bizreach-scraper) ↗ - Japanese executive and professional job listings.
- [Ashby Jobs Scraper: Hiring Change Monitor](https://apify.com/getascraper/ashby-jobs-monitor) ↗ - Track openings and hiring changes at companies on Ashby.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/biospace-jobs-scraper/changelog.md

# Actor input Schema

## `maxPagesToScan` (type: `integer`):

How many pages of 20 of the newest BioSpace postings to read. Each page holds 20 postings, so 10 pages reads the newest 200. Raise it when a narrow filter needs a deeper scan.

## `keyword` (type: `string`):

Only keep postings whose job title or description contains this text, for example 'clinical research' or 'regulatory affairs'. Leave empty to keep every posting.

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

Only keep postings whose city, state, country, or location text contains this value, for example 'Massachusetts', 'Cambridge', or 'US'. Leave empty for all locations.

## `positionType` (type: `string`):

Keep only postings of one job type, such as full-time, part-time, contract, or consultant. Choose Any to keep every type.

## `workArrangement` (type: `string`):

Keep only on-site, hybrid, or remote postings. Choose Any to keep every arrangement.

## `requiredEducation` (type: `string`):

Keep only postings that ask for this education level, as BioSpace records it. Postings that name no level are excluded when you pick one.

## `biotechHub` (type: `string`):

Keep only postings that BioSpace tags with this biotech hub, such as Genetown or Biotech Bay. Many postings carry no hub tag, and those are excluded when you pick one.

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

Keep only postings published in the last this many days. Set 0 to keep postings from any date. Postings with no posting date are excluded when this is set above 0.

## `payPublishedOnly` (type: `boolean`):

Keep only postings where the employer wrote a pay amount in the posting. Leave this off to keep postings with and without pay.

## `company` (type: `string`):

Only keep postings from employers whose name contains this text, for example 'Sanofi' or 'Pfizer'. Leave empty for all employers.

## `industry` (type: `string`):

Keep only postings from employers in this industry, as BioSpace classifies them. Choose Any to keep every industry.

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

The most job postings to save in one run. Raise it for larger pulls; the run stops once this many matching postings are saved.

## `includeFullDescription` (type: `boolean`):

Add the full posting text to every saved job. Leave this off for a lighter dataset that still includes the title, company, location, pay, and posting date.

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

Proxy settings for the requests. The default Apify datacenter proxy is recommended for this site.

## Actor input object example

```json
{
  "maxPagesToScan": 10,
  "keyword": "",
  "location": "",
  "positionType": "any",
  "workArrangement": "any",
  "requiredEducation": "any",
  "biotechHub": "any",
  "postedWithinDays": 0,
  "payPublishedOnly": false,
  "company": "",
  "industry": "any",
  "maxItems": 20,
  "includeFullDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Job title, company, location, published pay, posting date, job type, and work arrangement.

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

Adds education, industry, disciplines, and the full description when the run included it.

# 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 = {
    "maxPagesToScan": 10,
    "keyword": "",
    "location": "",
    "positionType": "any",
    "workArrangement": "any",
    "requiredEducation": "any",
    "biotechHub": "any",
    "postedWithinDays": 0,
    "payPublishedOnly": false,
    "company": "",
    "industry": "any",
    "maxItems": 20,
    "includeFullDescription": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/biospace-jobs-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 = {
    "maxPagesToScan": 10,
    "keyword": "",
    "location": "",
    "positionType": "any",
    "workArrangement": "any",
    "requiredEducation": "any",
    "biotechHub": "any",
    "postedWithinDays": 0,
    "payPublishedOnly": False,
    "company": "",
    "industry": "any",
    "maxItems": 20,
    "includeFullDescription": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/biospace-jobs-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 '{
  "maxPagesToScan": 10,
  "keyword": "",
  "location": "",
  "positionType": "any",
  "workArrangement": "any",
  "requiredEducation": "any",
  "biotechHub": "any",
  "postedWithinDays": 0,
  "payPublishedOnly": false,
  "company": "",
  "industry": "any",
  "maxItems": 20,
  "includeFullDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/biospace-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/biospace-jobs-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/VdLjE2RnSyH3QhddT/builds/RSHl18XN1rIcPnIxp/openapi.json
