# BioSpace Jobs Scraper (`maximedupre/biospace-jobs`) Actor

Find public BioSpace job listings with one search query or public job URLs. Save structured titles, employers, locations, descriptions, posting dates, and hiring-demand fields in a dataset.

- **URL**: https://apify.com/maximedupre/biospace-jobs.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Jobs, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 job listings

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?

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

### 🧬 BioSpace Jobs for Biotech Hiring Research

Recruiters, biotech sales teams, and market researchers can use BioSpace Jobs to find public life-sciences openings. It returns job titles, employers, locations, summaries, descriptions, links, posting dates, classifications, listing age, hiring urgency, and a hiring-demand signal in a structured dataset. Use the records to review specialized hiring activity and plan your next research step.

- Find **[Biotechnology Management Salary](https://apify.com/maximedupre/biospace-jobs/examples/biotechnology-management-salary)** listings for management roles in biotechnology.
- Review **[Entry Level Biotech Jobs Salary](https://apify.com/maximedupre/biospace-jobs/examples/entry-level-biotech-jobs-salary)** listings and their published salary details.
- Search **[Entry Level Biotech Jobs NYC](https://apify.com/maximedupre/biospace-jobs/examples/entry-level-biotech-jobs-nyc)** listings for New York City.
- Find **[Biotechnology Jobs In USA Salary](https://apify.com/maximedupre/biospace-jobs/examples/biotechnology-jobs-in-usa-salary)** listings with published compensation details.
- Search **[Medical Biotechnology Salary](https://apify.com/maximedupre/biospace-jobs/examples/medical-biotechnology-salary)** listings and review their pay fields.
- Explore **[Entry Level Biotech Jobs Boston](https://apify.com/maximedupre/biospace-jobs/examples/entry-level-biotech-jobs-boston)** listings for Boston searches.
- Search **[Biotech Jobs Entry Level](https://apify.com/maximedupre/biospace-jobs/examples/biotech-jobs-entry-level)** listings with a focused query.
- Start with the broad **[Biotechnology](https://apify.com/maximedupre/biospace-jobs/examples/biotechnology)** example for a life-sciences search.

#### 📋 BioSpace job records and hiring signals

Each saved record represents one eligible public BioSpace job listing. The dataset keeps the job identity, employer, location, public content, source links, dates, and classifications from the listing. It also includes listing age, age-based hiring urgency, and a hiring-demand signal built from the available job facts. Optional salary fields are saved when available in the public job content.

#### 🧭 Run a BioSpace job search

**Run steps**

1. Set `Target` to `Search jobs` for one BioSpace search query, or set it to `Job URLs` for public job and detail page URLs.
2. For `Search jobs`, enter one query and add any recency, therapeutic-area, modality, or job-function filters.
3. For `Job URLs`, add one or more public BioSpace job or detail page URLs. Values in the other target section are ignored.
4. Set `Maximum jobs` to a positive limit for a bounded run. Leave it empty to return all available results until the source is exhausted.
5. Run the Actor and open the dataset link in the run output.

Use a small `Maximum jobs` value for a bounded first check. If you already know the public pages you need, use `Job URLs` so you do not need to build a search query. The Actor saves the first eligible occurrence of each job it finds. If the same job appears again through another query or URL, the later match is ignored.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Choose `search` to use one BioSpace query or `urls` to use public job and detail page URLs. |
| `searchQuery` | string | One BioSpace search query. Used only when `target` is `search`. |
| `recencyDays` | integer | Includes search listings no older than this many days. Leave it empty to include all available listings. Ignored when `target` is `urls`. |
| `therapeuticAreas` | array of strings | Narrows search results to the listed therapeutic areas. An empty list includes jobs from all areas. Ignored when `target` is `urls`. |
| `modalities` | array of strings | Narrows search results to the listed drug or product modalities. An empty list includes jobs from all modalities. Ignored when `target` is `urls`. |
| `jobFunctions` | array of strings | Narrows search results to the listed job functions. An empty list includes jobs from all functions. Ignored when `target` is `urls`. |
| `jobUrls` | array of objects | Public BioSpace job or detail page URL objects used when `target` is `urls`. |
| `jobUrls[].url` | string | A public BioSpace job or detail page URL. |
| `maxItems` | integer | Actor Work Limit for saved jobs. Leave it empty to return all available results until the source is exhausted. |

**Example input**

This is a successful current-beta default-style input from a common search run.

```json
{
  "target": "search",
  "searchQuery": "biotech",
  "recencyDays": 30,
  "maxItems": 25
}
```

#### 🧾 Output

**Run output**

A successful run returns one output object with a link to the dataset.

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | URL of the run dataset and its `overview` view. |

**Dataset row fields**

Optional fields appear when BioSpace exposes the matching value. The required identity fields are `jobId`, `title`, `employer`, and `location.text`.

| Field | Type | What it does |
| --- | --- | --- |
| `jobId` | string | Stable public identifier for the job. |
| `title` | string | Public job title. |
| `employer` | string | Employer named on the public listing. |
| `location` | object | Public location details for the job. |
| `location.text` | string | Full public location text. |
| `location.city` | string | City named in the location, when available. |
| `location.region` | string | State, province, or other region, when available. |
| `location.country` | string | Country named in the location, when available. |
| `location.remoteStatus` | string | Public remote, hybrid, or on-site status, when available. |
| `employmentType` | string | Public employment type, such as full-time or contract, when available. |
| `summary` | string | Short public job summary, when available. |
| `description` | string | Full public job description, when available. |
| `jobUrl` | string | Public BioSpace URL for the job, when available. |
| `applicationUrl` | string | Public application URL, when available. |
| `employerUrl` | string | Public employer URL, when available. |
| `logoUrl` | string | Public employer logo URL, when available. |
| `postedDate` | string | Date when the job was posted, when available. |
| `expirationDate` | string | Date when the job expires, when available. |
| `therapeuticAreas` | array of strings | Therapeutic areas supported by the public job content. |
| `modalities` | array of strings | Drug or product modalities supported by the public job content. |
| `jobFunctions` | array of strings | Job functions supported by the public job content. |
| `listingAgeDays` | integer | Number of days since the posting date when the record was extracted. |
| `hiringUrgency` | string | Age-based hiring urgency category for the job. |
| `hiringDemandSignal` | string | Short hiring-demand signal based on the employer, role, classifications, and listing age. |
| `salary` | object | Published salary details, when available. |
| `salary.minAmount` | number | Published minimum salary amount, when available. |
| `salary.maxAmount` | number | Published maximum salary amount, when available. |
| `salary.currency` | string | Currency for the published salary amount, when available. |
| `salary.period` | string | Pay period for the published salary, such as year or hour, when available. |
| `sourceUrl` | string | BioSpace page used to get the record, when available. |
| `extractedAt` | string | UTC time when the record was extracted, when available. |

**Example dataset row**

This genuine row comes from a successful current-beta search run. The `description` value is shortened to keep the example small. The live dataset can include the full public description.

```json
{
  "jobId": "3068039",
  "title": "Managing Director, Waisman Biomanufacturing",
  "employer": "Waisman Biomanufacturing",
  "location": {
    "text": "Madison, Wisconsin, US",
    "city": "Madison",
    "region": "Wisconsin",
    "country": "US"
  },
  "employmentType": "FULL_TIME",
  "summary": "Managing Director, Waisman Biomanufacturing job in 53705, Madison with Waisman Biomanufacturing. Apply Today.",
  "description": "...",
  "jobUrl": "https://jobs.biospace.com/job/3068039",
  "applicationUrl": "https://jobs.wisc.edu/jobs/managing-director-waisman-biomanufacturing-madison-wisconsin-united-states",
  "employerUrl": "https://jobs.biospace.com/employer/1c4ec479-753a-4f03-b7f1-4c6df79bc1b5/waisman-biomanufacturing",
  "logoUrl": "https://jobs.biospace.com/_/jobseekers-frontend/image/08ad2623-055b-4064-8742-9e182ef959ad",
  "postedDate": "2026-08-12T18:16:00.000Z",
  "expirationDate": "2026-09-12T03:59:00.000Z",
  "therapeuticAreas": [
    "infectious"
  ],
  "modalities": [
    "gene_therapy",
    "cell_therapy",
    "antibody_biologic",
    "vaccine"
  ],
  "jobFunctions": [
    "clinical_operations",
    "quality",
    "manufacturing_cmc",
    "research"
  ],
  "listingAgeDays": 0,
  "hiringUrgency": "fresh",
  "hiringDemandSignal": "Waisman Biomanufacturing is hiring Managing Director, Waisman Biomanufacturing. Tags: infectious, gene_therapy, cell_therapy, antibody_biologic, vaccine, clinical_operations, quality, manufacturing_cmc, research. The listing is 0 days old.",
  "sourceUrl": "https://jobs.biospace.com/job/3068039",
  "extractedAt": "2026-08-13T00:53:51.579Z"
}
```

#### 💳 Pricing

**Charged event**

Pricing uses pay-per-event billing. The `Job listing` event is charged for each job listing saved to the dataset. Only saved job listings create this event, and the tiered price is shown on the Store page.

#### 🔌 Integrations

**Dataset handoff**

Use the dataset URL from the run output with Apify exports and dataset tools. It gives your workflow the structured job records described above.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens if a job URL is not public?

The Actor handles publicly accessible BioSpace job and detail pages. Private, login-gated, removed, or otherwise inaccessible content is outside its scope.

##### Can I use search and job URLs in the same run?

Choose one target for each run. Values in the other target section are ignored, so use separate runs for a query and a list of job URLs.

##### What happens when I leave Maximum jobs empty?

The Actor returns all available results until the source is exhausted. Set a positive number when you want a bounded run.

##### How can I narrow a BioSpace search?

Use one search query with optional recency, therapeutic-area, modality, and job-function filters. These filters apply only when `target` is `search`.

##### Are salary fields present for every job?

No. The `salary` object and its fields are optional. They are saved when BioSpace exposes published salary details.

##### How is hiring urgency determined?

It is an age-based category derived from the listing age. It describes the age signal in the record and does not replace your own hiring review.

##### How are duplicate jobs handled?

The first eligible occurrence of a job is saved. If the same job appears again through another query or URL in the run, the later match is ignored.

##### Does the Actor apply to jobs or contact employers?

No. It collects public job data and does not submit applications, contact employers, or manage recruiting workflows.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~biospace-jobs/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Handshake Jobs Scraper](https://apify.com/maximedupre/handshake-jobs-scraper): compare public job identity, employers, locations, compensation, and dates from another job board.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/maximedupre/welcometothejungle-jobs-extractor): review public jobs with salary, remote policy, contract type, and company details.
- [Jobsite Scraper](https://apify.com/maximedupre/jobsite-scraper): collect UK job listings with employers, salaries, descriptions, apply links, and listing context.
- [CWjobs Scraper](https://apify.com/maximedupre/cwjobs-scraper): search public UK technology jobs with titles, employers, locations, salaries, and source links.
- [Startup Scraper](https://apify.com/maximedupre/startup-scraper): review startup profiles with linked jobs and public hiring information.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose the source for this run: Search jobs or Job URLs.

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

Enter one BioSpace search query. Use this field only when Target is Search jobs.

## `recencyDays` (type: `integer`):

Enter the oldest listing age to include, in days. Leave it empty to include all available listings. This field is ignored when Target is Job URLs.

## `therapeuticAreas` (type: `array`):

Add one or more areas to narrow Search jobs, such as oncology or immunology. Leave it empty to include jobs from all areas. This field is ignored when Target is Job URLs.

## `modalities` (type: `array`):

Add one or more modalities to narrow Search jobs, such as antibodies or gene therapy. Leave it empty to include jobs from all modalities. This field is ignored when Target is Job URLs.

## `jobFunctions` (type: `array`):

Add one or more functions to narrow Search jobs, such as research or regulatory work. Leave it empty to include jobs from all functions. This field is ignored when Target is Job URLs.

## `jobUrls` (type: `array`):

Add one or more public BioSpace job or detail page URLs. Use this field only when Target is Job URLs.

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

Limit the number of jobs saved. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "target": "search",
  "searchQuery": "biotech",
  "recencyDays": 30,
  "maxItems": 25
}
```

# Actor output Schema

## `dataset` (type: `string`):

URL of the dataset with saved public BioSpace job records.

# 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 = {
    "target": "search",
    "searchQuery": "biotech",
    "recencyDays": 30,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/biospace-jobs").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 = {
    "target": "search",
    "searchQuery": "biotech",
    "recencyDays": 30,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/biospace-jobs").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 '{
  "target": "search",
  "searchQuery": "biotech",
  "recencyDays": 30,
  "maxItems": 25
}' |
apify call maximedupre/biospace-jobs --silent --output-dataset

```

## MCP server setup

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

```

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/1tW9HUubrbdIpEMHh/builds/EzkJFC2jcShyNNPkV/openapi.json
