# Tech Jobs Search: Startup, AI & Remote Jobs (`conserving_celerytop/tech-jobs-search`) Actor

$1 per 1,000 matching jobs. Search the open jobs of 574 tech, AI, remote-first and European companies by title, place, remote, seniority, salary and date, read live from their career pages when you run it. No API key or login. Companies with no match cost nothing.

- **URL**: https://apify.com/conserving\_celerytop/tech-jobs-search.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 matching jobs

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

## Tech Jobs Search: startup, AI and remote jobs

Search AI jobs, startup jobs and remote tech jobs at 574 tech, AI, remote-first and European companies, by title, place, remote work, seniority, salary and posted date. The jobs are read live from each company's career page when you run it, so every result is open today. You pay $1 per 1,000 matching jobs you receive, with no platform usage fees. Companies with no matching job cost nothing. No API key or login.

**Try it now:** click Start. The form is filled in for engineer jobs posted in the last 7 days, at most 200 jobs, so the first run costs at most $0.20.

### What you get

One row per matching job: title, company, department, location with city and country, remote or hybrid, employment type, seniority, job function, salary when the company publishes it, posted date and the link to apply. The rows are the same as in the Actor "ATS Jobs API", so a workflow built for one reads the other.

### Which companies

Four ready-made lists, picked by default:

- AI companies
- Tech companies
- Remote-first companies
- Tech companies hiring in Europe

A company in two lists is read once. The lists are refreshed monthly.

### How to search

- **Title includes:** words such as engineer, designer or product manager.
- **Location:** a city, a country or a region, and **Only remote jobs** for remote roles.
- **Seniority**, **Job function** and **Employment type** narrow the results further.
- **Posted since:** a date or a period such as 7 days.
- **Max matching jobs:** the most jobs one run returns, at most 10,000. It caps the price of the run.

Every search reads all the companies in the lists you pick. You receive the newest matching jobs first, from all of them, and jobs without a posted date come last.

### Pricing

Pay per event:

- `matching-job`: $0.001 per matching job you receive, so $1 per 1,000.

A run that finds nothing costs nothing beyond the platform's start event. When your spending limit is reached, the run stops and you receive only the jobs you paid for.

### Get new jobs every day

Save your search as a task with Posted since set to 24 hours and schedule it daily. Each morning you receive the jobs posted since the day before.

### When to use the other Actor

This Actor searches its own lists. To read every open job at the companies you name, use the Actor "ATS Jobs API", which reads 22 job boards for $0.01 per company.

**Related Actors:** [ATS Jobs API](https://apify.com/conserving_celerytop/live-career-page-jobs-api) for the companies you name, and [Live Jobs HTTP API](https://apify.com/conserving_celerytop/live-jobs-http-api) for the same data in one GET or POST request.

### FAQ

#### How is this different from a job board?

A job board shows the jobs that employers post on it. This Actor reads the career pages of 574 tech, AI, remote-first and European companies live when you run it, so every result is open today. It covers only those companies. You get one row per matching job and pay $1 per 1,000 of them.

#### Which companies are included?

The four lists hold 179 AI companies, 311 tech companies, 90 remote-first companies and 65 tech companies hiring in Europe. Some are in two lists, so there are 574 different companies. Each has a public career page on a job board we read. We refresh the lists monthly, so tell us which company you miss.

#### How fresh are the jobs?

Every search reads each company's career page live, so every result is open on the day you run it. Results come newest first. To keep only recent jobs, set **Posted since** to a period such as 7 days. With 24 hours and a daily schedule, each run brings the jobs posted since the day before.

#### How long does a search take?

Searching all four lists takes about two minutes, whatever the number of jobs you ask for. Picking one list is faster.

#### Is the data complete?

Each company's career page is read in full at run time, including jobs posted months ago that are still open. Filters then decide which jobs match.

# Actor input Schema

## `companyLists` (type: `array`):

The lists of companies to search. Their career pages are read live when you run it: 574 companies in the four lists together, each read once. Pick fewer lists for a faster search. Leave empty to search all four. API value: a list such as \["ai-companies"].

## `titleIncludes` (type: `array`):

Keep only jobs whose title contains one of these words or phrases, ignoring case, for example engineer or product manager. Whole words only, so engineer matches Software Engineer but not Engineering Manager. A list of up to 100. Leave empty for all titles.

## `titleExcludes` (type: `array`):

Leave out jobs whose title contains any of these words or phrases, ignoring case. Whole words only, so intern does not match International. A list of up to 100, for example senior and intern. An excluded word wins over Title includes. Leave empty to keep every title.

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

Keep only jobs in this place, such as London, California or Germany. A country name or code (Germany, DE) keeps jobs in that country, so DE does not keep Rio de Janeiro. A US state or Canadian province keeps its region, so California keeps San Mateo, CA. Other text matches whole words, so York keeps New York, not Yorkshire. For several, put one per line. Any match keeps a job. In API input, put a line break between values. For remote jobs use Remote only. Leave empty for all.

## `locationExcludes` (type: `array`):

Leave out jobs in any of these places, matched like Location: India or IN also leaves out jobs in Bangalore, and California leaves out San Mateo, CA. A job with several places is left out when any of them matches. Jobs with no location are kept. A list of up to 100, for example India and Brazil. Leave empty to keep every location.

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

true: keep only jobs that can be done fully remote. Hybrid and on-site jobs are left out. Default false.

## `workplaceTypes` (type: `array`):

Keep only jobs with one of these workplace types: remote, hybrid or onsite (field workplaceType), from the board's own field or the location text. Jobs whose workplace type is unknown are left out, and the company's warning says how many; Greenhouse marks only remote and hybrid jobs, so its on-site jobs are unknown. Leave empty for all jobs.

## `seniorities` (type: `array`):

Keep only jobs at one of these levels (field seniority), read from the title: Senior Engineer is senior, Head of Sales is director. A title without a level word, such as Software Engineer, has no seniority: those jobs are left out, and the company's warning says how many. Leave empty for all levels.

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

Keep only jobs in these functions, read from each job's title, then its department and team (output field jobFunction). Pick one or more, for example Engineering and Data. English and German titles are read, and basic French, Spanish, Dutch and Swedish ones. In our tests about 9 in 10 jobs got the right function. API value: a list such as \["engineering", "data"]. Leave empty for all functions.

## `employmentTypes` (type: `array`):

Keep only jobs with one of these job types (field employmentTypeNormalized), from the board's job type or the title. Jobs whose type is unknown are left out, and the company's warning says how many. Teamtailor gives no job type and Greenhouse only when the company sets one, so there mostly titles like Intern or Part-time tell. Leave empty for all.

## `department` (type: `string`):

Keep only jobs whose department, team or department path contains this text, ignoring case, for example engineering. For several, put one per line. A job that matches any of them is kept. In API input, put a line break between values, as in "engineering\nsales". Up to 100. Leave empty for all departments.

## `hasSalary` (type: `boolean`):

Keep only jobs that show a salary, from the job board or written in the job description. Default false.

## `minAnnualSalary` (type: `integer`):

Keep jobs whose yearly salary reaches this amount, such as 120000, in the currency below. The top of the range counts, and pay written in the job description counts too. No exchange rates: jobs paid in another currency, and jobs with no yearly salary, are left out. Empty for no minimum.

## `minAnnualSalaryCurrency` (type: `string`):

Currency of Minimum yearly salary, as a three-letter code such as USD, EUR or GBP. Only jobs whose salary is in this currency can pass. Used only with Minimum yearly salary. Default USD.

## `postedSince` (type: `string`):

Keep only jobs posted on or after this date. Use a date as YYYY-MM-DD, for example 2026-09-01, or a period as a number plus hours, days, weeks, months or years, for example 24 hours or 7 days. A period counts back from the start of each run, which suits schedules. Jobs whose board gives no posting date are left out. Leave empty for all dates.

## `postedBefore` (type: `string`):

Keep only jobs posted before this date. Use a date as YYYY-MM-DD, for example 2026-06-01, or a period such as 30 days for jobs posted more than 30 days ago. With Posted since it gives a date range. Jobs whose board gives no posting date are left out, and the company's warning says how many. Leave empty for all dates.

## `maxJobsPerCompany` (type: `integer`):

Return at most this many matching jobs per company, the newest first, for example 20, so one large company does not fill the results. Leave empty for all matching jobs.

## `maxResults` (type: `integer`):

The most matching jobs this run returns, for example 200. Every company is searched and you get the newest matching jobs first, across all companies. You pay per matching job returned, so this caps the price of a run: 200 jobs at $1 per 1,000 cost $0.20. At most 10,000.

## Actor input object example

```json
{
  "companyLists": [
    "ai-companies",
    "tech-companies",
    "remote-first",
    "europe-tech"
  ],
  "titleIncludes": [
    "engineer"
  ],
  "location": "London",
  "remoteOnly": false,
  "jobFunctions": [
    "engineering",
    "data"
  ],
  "department": "engineering",
  "hasSalary": false,
  "minAnnualSalaryCurrency": "USD",
  "postedSince": "7 days",
  "maxJobsPerCompany": 50,
  "maxResults": 200
}
```

# Actor output Schema

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

Dataset items, one per job: company, companyName, matchedBy, companyStatus, title, department, team, location, countryCode, city, remote, seniority, jobFunction, employment type, salary with its yearly value, tools (with descriptions), postedAt and url. The dataset has more fields (jobId, applyUrl, description, country, region, salaryRanges, charged, warning, error); read it with fields=... to keep only what you need.

## `companies` (type: `string`):

JSON array, one object per company in input order: companyStatus (ok, no\_open\_jobs, not\_found, no\_job\_board\_found, invalid\_input and others), charged, chargedEvent, companyName, matchedBy (link, website, directory, name or name variant), inputDomain and boardUrl for websites, companyTotalOpenJobs, companyMatchedJobs, companyJobsReturned, newJobsCount, closedJobsCount, updatedJobsCount, error and warning.

## `companySummaries` (type: `string`):

Dataset items with rowType company, one per company, when Rows to return is companies or both: openJobs, jobs posted in the last 7 and 30 days, jobs open over 90 days, remote, engineering and sales shares, top departments, locations and countries, seniority and job function counts, jobs per function posted in the last 30 days, leadership and first-hire roles, top tools, salary medians, and new, closed, updated and reposted jobs with Only new jobs. With jobs, this view has no summary rows.

# 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 = {
    "companyLists": [
        "ai-companies",
        "tech-companies",
        "remote-first",
        "europe-tech"
    ],
    "titleIncludes": [
        "engineer"
    ],
    "postedSince": "7 days"
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/tech-jobs-search").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 = {
    "companyLists": [
        "ai-companies",
        "tech-companies",
        "remote-first",
        "europe-tech",
    ],
    "titleIncludes": ["engineer"],
    "postedSince": "7 days",
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/tech-jobs-search").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 '{
  "companyLists": [
    "ai-companies",
    "tech-companies",
    "remote-first",
    "europe-tech"
  ],
  "titleIncludes": [
    "engineer"
  ],
  "postedSince": "7 days"
}' |
apify call conserving_celerytop/tech-jobs-search --silent --output-dataset

```

## MCP server setup

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

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/nlkLahqgoiBoetloT/builds/6dUR6tXs4WV7VbAfo/openapi.json
