# Dynamite Jobs Scraper (`steadyscrape/dynamite-jobs-scraper`) Actor

Scrape Dynamite Jobs (dynamitejobs.com) remote job data: title, company and website, salary, category, skills, the countries a candidate may live in, full description and dates, plus company profiles with LinkedIn. Search by keyword, category or country. Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/dynamite-jobs-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 remote jobs

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?

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

## Dynamite Jobs Scraper

Scrape remote jobs from **[Dynamite Jobs](https://dynamitejobs.com)** (dynamitejobs.com), the job board for remote-first
companies. This Dynamite Jobs scraper searches the site the way its own search box does — by **keyword**, **category**,
**subcategory**, **job type**, **skill** and **where the candidate lives** — and gives every job with its **employer and
website**, **salary range and period**, **category**, **skills**, the **regions and every country a candidate may live in**,
**posted and expiry dates**, **how to apply** and the **full description** (text and HTML).

It can also add a **company profile row** for each employer: **about text**, **website**, **LinkedIn**, **X/Twitter**,
**Facebook**, **Instagram** and **YouTube** links, and how many jobs it has open — and it can search the site's **archive of
about 70,000 closed jobs** for salary and hiring research.

No login, no browser, no proxy. Pay only for the rows you get.

### What you can do with this Dynamite Jobs scraper

- **Remote job feeds and newsletters**: every new remote job by category or skill, scheduled daily with **Posted within** and
  **Only new jobs** to receive just the jobs posted since the last run.
- **Job search from a country**: "jobs someone in Mexico (or the Philippines, or Europe) can take" — Dynamite Jobs lists, for
  each job, the countries its candidates may live in.
- **Sales prospecting on hiring signals**: companies hiring remote workers right now, with their website and LinkedIn.
- **Salary benchmarking for remote work**: published ranges by role, category and region, hourly, monthly or yearly; add the
  closed jobs for years of history.
- **Labour-market research**: which skills remote-first companies ask for, and which regions they hire from.

### Input

| Field | What it does |
| --- | --- |
| **Keywords** | Words as you would type them in the site's search box (`react developer`, `virtual assistant`, `SEO`): each keyword is one search over title, company, skills and description. Empty lists every job of the filters. |
| **Categories** | The site's 20 categories: Developer / Engineer, Marketing, Business Development / Sales, Design, Product, Management and Operations, Customer Support, Finance / Accounting, Admin / Virtual Assistant, SEO / Content Marketing, Paid Ads / PPC… |
| **Subcategories** | The 53 narrower ones of its filter panel: Full-Stack, Back-end, Front-end, DevOps, Graphic Design, Social Media, Account Management, Executive Assistant… |
| **Where the candidate lives** | Countries or regions by name or code: `Mexico`, `MX`, `Philippines`, `Latin America`, `Europe`, `APAC`. A job is kept when someone living there may take it — open to that country, to a region it belongs to, or worldwide. `Worldwide` keeps only jobs open worldwide. |
| **Job types** | Full Time, Part Time, Short-Term Project. |
| **Skills** | Jobs tagged with one of these skills: `React`, `Python`, `Google Ads`, `Shopify`… |
| **Job links / Company links** | Dynamite Jobs job pages (one row each) or company pages (every open job the page lists). Links are read as they are; the filters narrow only the searches. |
| **Posted within (days)** | Only jobs posted in the last N days. |
| **Only jobs with a salary** / **Minimum yearly salary** | Leave out jobs with no salary, or whose range does not reach the minimum a year (hourly × 2,080, monthly × 12). |
| **Include closed jobs** | Also search finished, expired and filled jobs, the way the site's search shows them. Each row says whether it is still open. |
| **Company profiles** | One row per employer of the jobs found (charged as a company, once per run). |
| **Maximum jobs per search** | 100 by default; 0 for every job a search matches — over 1,000 matches are read by posting date, past the search's 1,000-result cap. |
| **Only new jobs** | Skip jobs an earlier run with the same input delivered (for scheduled runs). |

Example — remote sales jobs someone in Mexico can take, posted this week:

```json
{
    "keywords": ["sales"],
    "locations": ["Mexico"],
    "postedWithinDays": 7,
    "maxJobsPerSearch": 50
}
```

### Output: Dynamite Jobs data

One row per job (and, with **Company profiles**, one per employer). A search or link that gives nothing leaves one free row
with `rowType: "status"`, its `status` (`no_results`, `not_found`, `invalid`, `blocked`, `disallowed`), the `url` asked and
a plain-English `reason`.

```json
{
    "jobId": "fALCDA4Kni0JtnzNr2IH",
    "url": "https://dynamitejobs.com/company/kcpowerclean/remote-job/digital-marketing-advertising-specialist",
    "title": "Head of Marketing | Paid Acquisition & Growth",
    "companyName": "KC Power Clean",
    "companySlug": "kcpowerclean",
    "companyPageUrl": "https://dynamitejobs.com/company/kcpowerclean",
    "companyWebsite": "https://kcpowerclean.com",
    "companyLogo": "https://cdn.dynamitejobs.com/companies/…/icon_256x256.png",
    "category": "Marketing",
    "subcategory": "General Digital Marketing",
    "categories": ["Marketing › General Digital Marketing"],
    "jobType": "Full Time",
    "locations": ["Latin America"],
    "openWorldwide": false,
    "eligibleCountries": ["Anguilla", "Antigua and Barbuda", "Argentina", "…"],
    "eligibleCountryCodes": ["AI", "AG", "AR", "…"],
    "skills": ["Digital Marketing", "Marketing", "SEO", "Growth Marketing", "Campaign Management", "Leadership", "Google ads", "Content Marketing"],
    "salaryMin": 3000,
    "salaryMax": 5000,
    "salaryCurrency": "USD",
    "salaryPeriod": "month",
    "description": "Lead the growth. Know the numbers.\nMore qualified leads. Lower acquisition costs. …",
    "descriptionHtml": "<h3>Lead the growth. Know the numbers.</h3><p>More qualified leads. …",
    "postedAt": "2026-10-20T17:44:56.679Z",
    "expiresAt": "2026-11-19T17:44:56.679Z",
    "isOpen": true,
    "jobStatus": "published",
    "applyMethod": "dynamite_jobs_form",
    "postedByEmployer": true,
    "promoted": true,
    "rowType": "job",
    "search": "Marketing",
    "position": 3
}
```

A company row:

```json
{
    "rowType": "company",
    "name": "Blackbird e-Solutions",
    "url": "https://dynamitejobs.com/company/blackbirdesolutions",
    "website": "https://blackbirdesolutions.com/",
    "domain": "blackbirdesolutions.com",
    "description": "We help soccer brands grow with SEO, paid ads, content, and analytics. …",
    "linkedin": "https://linkedin.com/company/blackbird-e-solutions",
    "twitter": "https://twitter.com/bbesllc",
    "facebook": "https://facebook.com/blackbird.esolutions",
    "instagram": null,
    "youtube": null,
    "openJobs": 0
}
```

### Dynamite Jobs job fields

| Field | Meaning |
| --- | --- |
| `rowType`, `status` | `job` and `ok` on every job row. |
| `jobId`, `url`, `title` | The site's job id, the job page and its title. |
| `companyName`, `companyId`, `companySlug`, `companyPageUrl`, `companyWebsite`, `companyLogo` | The employer, its id and Dynamite Jobs page, its own site and logo. |
| `category`, `categorySlug`, `subcategory`, `subcategorySlug`, `categories` | The main category and subcategory (name and slug) and every category the job is filed under. |
| `jobType`, `jobTypeSlug` | Full Time, Part Time or Short-Term Project (`full-time`, `part-time`, `freelance`). |
| `locations`, `locationSlugs`, `openWorldwide` | The regions and countries the employer opened the job to. |
| `eligibleCountries`, `eligibleCountryCodes` | Every country a candidate may live in, regions expanded — the same list the job page gives Google. |
| `skills` | The skills the job is tagged with. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | The range the job page shows (`hour`, `month` or `year`); `salaryMax` is null for "from" ranges. `salaryMarkedPublic` is the employer's own "public salary" mark, which the site's salary filter uses. |
| `summary`, `description`, `descriptionHtml` | The site's one-line summary when it has one, and the full description. |
| `postedAt`, `updatedAt`, `expiresAt` | ISO 8601 UTC. |
| `isOpen`, `jobStatus` | Whether the site still lists it, and its status (`published`, `finished`, `expired`, `fulfilled`). |
| `applyMethod` | `employer_site` (the Apply button leads to the employer's own page) or `dynamite_jobs_form` (the site's own application form). |
| `postedByEmployer`, `featured`, `promoted` | Posted by the employer itself (otherwise listed by the site's team from the employer's own posting), and the paid placements. |
| `search`, `position`, `scrapedAt` | The search or link that found the job, its place in that search's results, and when it was read (ISO 8601 UTC). |

### Company profile fields

| Field | Meaning |
| --- | --- |
| `rowType`, `status` | `company` and `ok`. |
| `companyId`, `companySlug`, `name`, `url` | The employer's id, slug and name, and its Dynamite Jobs page. |
| `website`, `domain`, `logo` | Its own site, that site's domain, and its logo. |
| `description` | The "about" text of its Dynamite Jobs page. |
| `linkedin`, `twitter`, `facebook`, `instagram`, `youtube` | Its social profiles, when it set them; `otherLinks` holds links of any other kind, by name. |
| `openJobs` | How many open jobs its page lists. |
| `search`, `scrapedAt` | The search or link whose job led to it, and when it was read. |

### Pricing

Pay per event, no start fee:

- **US$0.001 per job** — everything above, description included.
- **US$0.002 per company profile**, only with **Company profiles** on, once per company per run.

Status rows are free. 1,000 remote jobs cost US$1.

### Limits

- The site's search lists at most 1,000 results per query; with **Maximum jobs per search** at 0 (or above 1,000) the Actor
  splits a larger search by posting date so every job comes once.
- The apply link is the job page: its **Apply** button sends candidates on through a redirect the site's robots.txt keeps
  away from crawlers, so the employer's own application address is not collected.
- Company links give the open jobs the company's page lists; closed jobs come only through searches.
- Salaries are in US dollars as the employers give them.

### Is it legal to scrape Dynamite Jobs?

This Actor reads only what any visitor sees without an account: the site's own job search and its public job and company
pages, following dynamitejobs.com's robots.txt on every request and asking at a gentle pace. It collects job postings and
company profiles, not personal data about candidates. You are responsible for how you use the data and for complying with
the laws and terms that apply to you. This Actor is not affiliated with, endorsed by, or sponsored by Dynamite Jobs.

# Actor input Schema

## `keywords` (type: `array`):

Words as you would type them in the Dynamite Jobs search box, e.g. <code>react developer</code>, <code>virtual assistant</code>, <code>SEO</code>, <code>account executive</code>. Each keyword is one search through the site's own search index (title, company, skills and description). Leave empty to list every job of the categories and filters below.

## `categories` (type: `array`):

Dynamite Jobs' job categories. A job in any of the chosen categories or subcategories is kept.

## `subcategories` (type: `array`):

Narrower categories, as the site's filter panel offers them.

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

Countries or regions, by name or code: <code>Mexico</code>, <code>MX</code>, <code>United Kingdom</code>, <code>Latin America</code>, <code>Europe</code>, <code>APAC</code>. A job is kept when someone living there may take it: jobs open to that country, or to any region it belongs to, or worldwide. <code>Worldwide</code> keeps only the jobs open worldwide. Leave empty for every job.

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

Keep only these job types. Empty keeps all.

## `skills` (type: `array`):

Keep only jobs tagged with one of these skills, e.g. <code>React</code>, <code>Python</code>, <code>Google Ads</code>, <code>Shopify</code>, <code>Copywriting</code>.

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

Job pages, e.g. <code>https://dynamitejobs.com/company/lemonio/remote-job/senior-angular-developer</code>: one row each. Pasted links are read as they are; the filters narrow only the searches.

## `companyUrls` (type: `array`):

Company pages, e.g. <code>https://dynamitejobs.com/company/tekmetric</code>: every open job the page lists.

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

Only jobs posted in the last N days. 0 for any time. Combine with a schedule and Only new jobs for a daily feed.

## `onlyWithSalary` (type: `boolean`):

Leave out jobs that show no salary range.

## `minYearlySalary` (type: `integer`):

Only jobs whose salary range reaches this much a year (hourly pay counted at 2,080 hours, monthly times twelve). 0 for no minimum.

## `includeClosedJobs` (type: `boolean`):

Also search the site's archive of finished, expired and filled jobs (about 70,000), the way its search shows them when closed jobs are not hidden. Useful for salary and hiring research. Each row says whether the job is still open.

## `includeCompanies` (type: `boolean`):

Add one row per employer of the jobs found, read from its Dynamite Jobs page: about text, website, LinkedIn, X/Twitter, Facebook, Instagram and YouTube links, and open jobs. Charged as a company, once per company per run.

## `maxJobsPerSearch` (type: `integer`):

Stop each keyword search (or each pasted company link) after this many jobs. 0 for every job it matches: searches over 1,000 jobs are read by posting date to get past the search index's 1,000-result cap.

## `onlyNewJobs` (type: `boolean`):

Skip jobs an earlier run with the same searches and filters already delivered (remembered in a key-value store of your account named steadyscrape-dynamite-jobs-state). For scheduled runs.

## Actor input object example

```json
{
  "keywords": [],
  "categories": [
    "development"
  ],
  "subcategories": [],
  "locations": [],
  "jobTypes": [],
  "skills": [],
  "jobUrls": [],
  "companyUrls": [],
  "postedWithinDays": 0,
  "onlyWithSalary": false,
  "minYearlySalary": 0,
  "includeClosedJobs": false,
  "includeCompanies": false,
  "maxJobsPerSearch": 10,
  "onlyNewJobs": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (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 = {
    "categories": [
        "development"
    ],
    "maxJobsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/dynamite-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 = {
    "categories": ["development"],
    "maxJobsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/dynamite-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 '{
  "categories": [
    "development"
  ],
  "maxJobsPerSearch": 10
}' |
apify call steadyscrape/dynamite-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/dynamite-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/qTezIhEjm779FbX9Z/builds/HObcl7T1uaulWemNP/openapi.json
