# Climatebase Climate Jobs Scraper (`automation-lab/climatebase-climate-jobs-scraper`) Actor

Search public Climatebase climate jobs and export structured employer, salary, location, remote-work, job-type, and climate-sector data.

- **URL**: https://apify.com/automation-lab/climatebase-climate-jobs-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** 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.
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

## Climatebase Climate Jobs Scraper

Collect public climate-tech and sustainability job listings from Climatebase as structured records.
Search by keyword, sector, workplace preference, and job type, or reuse a public Climatebase jobs URL.
Each result includes job and employer IDs, title, employer details, locations, salary fields, remote preference, job type, climate sectors, posting time, and source metadata.

### What does Climatebase Climate Jobs Scraper do?

Climatebase Climate Jobs Scraper turns Climatebase's public jobs search into an integration-ready dataset.
It uses the structured search data loaded by the anonymous Climatebase jobs page rather than opening every job detail page.
This keeps runs lightweight while preserving the fields needed for recruiting, aggregation, lead generation, and market analysis.

You can:

- search one or more phrases;
- run a saved public `/jobs` URL;
- filter by exact Climatebase sector names;
- select Remote, Hybrid, or In-person roles;
- select job engagement types;
- cap the combined output;
- schedule the same input for vacancy monitoring;
- export results to JSON, CSV, Excel, or another Apify integration.

### Who is it for?

**Recruiters and sourcers** can build shortlists of employers hiring for climate-related skills.

**Climate-tech talent teams** can monitor adjacent employers, job titles, workplace patterns, and disclosed salaries.

**Job aggregators** can add source URLs and stable IDs to a climate-jobs feed.

**Employer lead-generation teams** can identify organizations with active hiring demand and useful public context.

**Labor-market analysts** can compare role, location, sector, remote-work, and salary signals over time.

**Developers and data teams** can deliver the records to databases, dashboards, spreadsheets, or automation workflows.

### Why use this Actor?

- **Climate-specific labels:** results retain Climatebase climate sectors.
- **Listing-first extraction:** v1 does not depend on detail pages that may be protected.
- **Stable deduplication:** records are deduplicated by Climatebase search object ID.
- **Bounded pagination:** the Actor stops after `maxItems` instead of crawling indefinitely.
- **Lightweight runtime:** the Actor uses HTTP and 256 MB memory, without a browser or automatic paid proxy.
- **Multiple searches:** combine several URLs and keyword searches in one run.
- **Integration ready:** the default dataset is available through Apify API and integrations.

### What climate job data is extracted?

| Field | Meaning |
| --- | --- |
| `jobId` | Climatebase job ID |
| `objectId` | Stable search object ID used for deduplication |
| `title` | Public job title |
| `featured` | Whether Climatebase marks the listing as featured |
| `postedAt` | Listing activation timestamp |
| `employerId` | Climatebase employer ID |
| `employerName` | Employer name |
| `employerLogoUrl` | Public employer logo URL, when present |
| `employerMembershipStatus` | Public employer membership status |
| `employerSummary` | Short public employer description |
| `locations` | Location labels attached to the job |
| `salaryFrom` | Lower disclosed salary bound, or `null` |
| `salaryTo` | Upper disclosed salary bound, or `null` |
| `salaryPeriod` | Salary period, or `null` |
| `remotePreferences` | Remote, Hybrid, or In-person labels |
| `jobTypes` | Full-time, part-time, contract, internship, or other labels |
| `climateSectors` | Climatebase sector labels |
| `url` | Canonical Climatebase job URL |
| `sourceSearchUrl` | Search URL that produced the record |
| `scrapedAt` | Collection timestamp |

Upstream fields can be absent.
Nullable salary and employer fields remain `null`; list fields are emitted as arrays.

### How to scrape Climatebase jobs

1. Open the Actor in Apify Console.
2. Enter one or more phrases in **Search queries**, or add Climatebase `/jobs` URLs.
3. Optionally add exact sector, workplace, or job-type values.
4. Choose a reasonable **Maximum jobs** value.
5. Click **Start**.
6. Inspect the **Climate jobs** dataset view.
7. Export the dataset or connect an integration.
8. Save or schedule the task if you need recurring monitoring.

A small first run such as `maxItems: 20` is useful for checking whether a query matches your workflow.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | empty | Public `https://climatebase.org/jobs` URLs with supported query parameters |
| `queries` | string array | empty | One or more keyword searches |
| `sectors` | string array | empty | Exact Climatebase sector names applied to every source |
| `remotePreferences` | string array | empty | Exact workplace labels applied to every source |
| `jobTypes` | string array | empty | Exact job-type labels applied to every source |
| `maxItems` | integer | `100` | Combined unique-result limit from 1 to 10,000 |

If both `startUrls` and `queries` are omitted, the Actor collects current jobs using the optional filters.
Filters supplied as Actor fields are combined with filters already present in each URL.
Unknown URL parameters fail clearly instead of being silently ignored.

#### Example: software engineering search

```json
{
  "queries": ["software engineer"],
  "remotePreferences": ["Remote"],
  "maxItems": 50
}
```

#### Example: exact Climatebase source URL

```json
{
  "startUrls": [
    { "url": "https://climatebase.org/jobs?q=policy" }
  ],
  "sectors": ["Energy"],
  "maxItems": 100
}
```

#### Example: recurring remote policy monitor

```json
{
  "queries": ["policy"],
  "remotePreferences": ["Remote"],
  "jobTypes": ["Full time role"],
  "maxItems": 200
}
```

### Output example

A current run returns records shaped like this:

```json
{
  "jobId": "74100186",
  "objectId": "74100186",
  "title": "Staff Software Engineer Data - DC Tech Lead",
  "featured": false,
  "postedAt": "2026-07-26T04:06:40.991Z",
  "employerId": "911994",
  "employerName": "Afresh Technologies",
  "employerLogoUrl": "https://climatebaseuserstorage.s3-us-west-1.amazonaws.com/photos/0ba1ecbb-451c-4a3b-841b-419d47f0dfed-employer_logo_153.webp",
  "employerMembershipStatus": "inactive",
  "employerSummary": "AI-driven platform reducing food waste in the fresh food supply chain.",
  "locations": ["Toronto, ON, CA"],
  "salaryFrom": null,
  "salaryTo": null,
  "salaryPeriod": null,
  "remotePreferences": ["Hybrid", "Remote"],
  "jobTypes": ["Full time role"],
  "climateSectors": ["Carbon Removal Tech", "Food, Agriculture, & Land Use", "Climate Adaptation"],
  "url": "https://climatebase.org/job/74100186/staff-software-engineer-data-dc-tech-lead",
  "sourceSearchUrl": "https://climatebase.org/jobs?q=software+engineer",
  "scrapedAt": "2026-07-26T06:17:35.779Z"
}
```

This is public listing metadata, not a copy of the full job-detail description.

### How much does it cost to scrape Climatebase jobs?

The Actor uses pay-per-event pricing.
A run has a small **$0.005 start fee** plus a per-job event.
The current FREE tier is **$0.000041071 per saved job**, with lower unit prices in higher usage tiers.

Examples at the base tier:

| Saved jobs | Approximate price |
| ---: | ---: |
| 20 | $0.0058 |
| 100 | $0.0091 |
| 1,000 | $0.0461 |

These examples combine the start fee and FREE-tier per-result price.
Actual platform pricing shown in Console is authoritative, and higher usage tiers may cost less per item.
No automatic residential proxy or browser mode is enabled.

### Scheduling and deduplication workflows

For daily or weekly monitoring:

1. Save the input as an Apify task.
2. Add a schedule in Apify Console.
3. Export each run to your destination.
4. Upsert records by `objectId`.
5. Compare `postedAt`, employer, salary, or workplace fields between snapshots.

Deduplication happens within a run across all supplied searches.
For deduplication across runs, use `objectId` as the stable source key in your destination.

### Integration ideas

- Send new remote climate roles to Slack or email.
- Append current listings to Google Sheets.
- Load employer IDs and names into a recruiting CRM.
- Build a climate hiring-demand dashboard in BigQuery or Snowflake.
- Monitor disclosed salary ranges by title or location.
- Track which climate sectors are hiring for a particular skill.
- Enrich job-aggregator records with Climatebase sectors and source URLs.

Apify integrations can connect datasets to webhooks, Zapier, Make, Google Drive, GitHub, and cloud data warehouses.

### Use the Actor through the Apify API

Replace `YOUR_TOKEN` with an Apify API token.
The examples start a run and wait for it to finish.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~climatebase-climate-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["carbon accounting"],"maxItems":50}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/climatebase-climate-jobs-scraper').call({
  queries: ['carbon accounting'],
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/climatebase-climate-jobs-scraper').call(
    run_input={'queries': ['carbon accounting'], 'maxItems': 50}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use Climatebase jobs through MCP

#### Claude Code setup

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/climatebase-climate-jobs-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, and VS Code clients can use this HTTP MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/climatebase-climate-jobs-scraper"
    }
  }
}
```

Example prompts:

- “Find 50 remote Climatebase jobs matching software engineer.”
- “Export current Energy sector jobs from Climatebase.”
- “Collect full-time remote climate policy listings for my weekly monitor.”

### Limits and expected behavior

- The Actor covers the public Climatebase listing/search surface.
- Full detail-page descriptions and application-page enrichment are outside v1.
- Climatebase controls record availability, ranking, labels, and freshness.
- Salary fields are frequently absent and remain `null`.
- Filter values must match current Climatebase labels.
- Very broad requests can take longer because results are paginated in batches of 100.
- The Actor retries temporary network, HTTP 429, and server failures with bounded backoff.
- Permanent input and response-shape errors fail the run instead of returning misleading empty data.
- A valid search with no matches succeeds with an empty dataset.
- No login, user cookie, browser, or automatic proxy is required for the current route.

### Responsible use and legality

The Actor extracts publicly available job-listing metadata.
You are responsible for ensuring that your collection and use comply with Climatebase terms, applicable law, and your contractual obligations.
Respect privacy, database rights, and reasonable request rates.
Do not use the data for unlawful discrimination, spam, harassment, or decisions that require consent or regulated safeguards.
Avoid republishing copyrighted descriptions or logos without an appropriate basis.
When handling personal data, apply purpose limitation, retention controls, security, and deletion procedures required in your jurisdiction.

### Troubleshooting

**The run returned no records.**
Check the spelling of the query and exact filter labels.
Try the same input without optional filters to distinguish a valid no-match result from an overly narrow search.

**The run says a URL parameter is unsupported.**
Use a public Climatebase `/jobs` URL containing only `q`, `sectors`, `remote_preferences`, `job_types`, or attribution parameters.
Remove UI state parameters that do not map to supported public search filters.

**A sector or workplace filter returns fewer jobs than expected.**
Use the exact label shown by Climatebase, including capitalization and punctuation.
Several values within one Actor filter are treated as alternatives; different filter groups are combined.

**The upstream response shape changed.**
Inspect the Actor log and retry later once.
If the error persists, report the run ID so the extraction route can be updated without guessing.

### Related Automation Lab actors

- [LinkedIn Jobs Scraper](https://apify.com/automation-lab/linkedin-jobs-scraper) for broader professional-network job coverage.
- [Glassdoor Jobs Scraper](https://apify.com/automation-lab/glassdoor-jobs-scraper) for Glassdoor vacancy research.
- [Google Jobs Scraper](https://apify.com/automation-lab/google-jobs-scraper) for aggregated job-search results.
- [Greenhouse Jobs Scraper](https://apify.com/automation-lab/greenhouse-jobs-scraper) for public Greenhouse career boards.

Use Climatebase Climate Jobs Scraper when climate-sector classification and the Climatebase source are central to the workflow.
Combine sources only when your downstream pipeline can reconcile different IDs and field semantics.

### FAQ

**Does the Actor require a Climatebase account?**

No. It uses the anonymous public jobs search surface.

**Does it visit every job detail page?**

No. v1 intentionally uses listing/search records, which already contain the documented fields.

**Can I scrape multiple keywords in one run?**

Yes. Add them to `queries`; duplicate jobs are saved once per run.

**Can I use a Climatebase URL copied from my browser?**

Yes, when it is a public `/jobs` URL with supported query parameters.

**How do I monitor newly posted roles?**

Schedule a task and upsert each dataset by `objectId`; use `postedAt` for temporal analysis.

**Why are salary values null?**

Many employers do not disclose salary data on the listing surface.

**Can the Actor automatically bypass a challenge with residential proxies?**

No automatic proxy or browser fallback is enabled.
This avoids hidden transfer cost and keeps failure behavior explicit.

**What is the maximum result count?**

`maxItems` accepts values from 1 to 10,000.
The number returned can be smaller when the matching public result set is exhausted.

# Actor input Schema

## `startUrls` (type: `array`):

Public https://climatebase.org/jobs URLs. Supported URL filters are q, sectors, remote\_preferences, and job\_types.

## `queries` (type: `array`):

Keywords to search in Climatebase jobs, such as software engineer, carbon accounting, or policy.

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

Exact Climatebase sector names, such as Energy, Climate Adaptation, or Food, Agriculture, & Land Use.

## `remotePreferences` (type: `array`):

Exact workplace values such as Remote, Hybrid, or In-person.

## `jobTypes` (type: `array`):

Exact Climatebase job type values, such as Full time role, Part time role, Contract, or Internship.

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

Maximum number of unique jobs saved across all URLs and queries.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://climatebase.org/jobs?q=software"
    }
  ],
  "queries": [
    "software engineer"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset view with job, employer, location, salary, workplace, and climate-sector fields.

# 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 = {
    "startUrls": [
        {
            "url": "https://climatebase.org/jobs?q=software"
        }
    ],
    "queries": [
        "software engineer"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/climatebase-climate-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 = {
    "startUrls": [{ "url": "https://climatebase.org/jobs?q=software" }],
    "queries": ["software engineer"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/climatebase-climate-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://climatebase.org/jobs?q=software"
    }
  ],
  "queries": [
    "software engineer"
  ],
  "maxItems": 20
}' |
apify call automation-lab/climatebase-climate-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/climatebase-climate-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/bRWfcoGmh2eU9kNh8/builds/Yvd69nvQ5x0oRcr4f/openapi.json
