# Algeria Emploitic Jobs Scraper (`scraper_guru/algeria-emploitic-jobs-scraper`) Actor

Scrape public job listings from Emploitic Algeria. Collect job titles, employers, locations, descriptions, posting dates, and employment types for recruitment research and job-market analysis.

- **URL**: https://apify.com/scraper\_guru/algeria-emploitic-jobs-scraper.md
- **Developed by:** [LIAICHI MUSTAPHA](https://apify.com/scraper_guru) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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

## Algeria Emploitic Jobs Scraper

Collect public job listings from [Emploitic](https://emploitic.com/offres-d-emploi), an Algerian employment and recruitment portal. Export structured listings for recruitment research, HR analytics, and dated job-market snapshots.

### Features

- Collects job title, employer, location, wilaya, experience label, employment type, posting date, deadline, description, and source URL when provided by the page.
- Merges structured `JobPosting` data with public listing cards; Emploitic currently includes fewer records in its structured metadata than it renders on a search page.
- Follows result pagination and supports filtered Emploitic search URLs.
- Deduplicates listing URLs across pages and across supplied searches.
- Writes run counts to the key-value store under `STATS`.
- Uses low-concurrency HTML requests; no browser rendering or login is required.

### Use cases

- Analyze public job listings by location, employer, employment type, or posting date.
- Build a dated snapshot for a report or dashboard.
- Find public hiring signals for recruitment and HR research.
- Compare Emploitic's source population with other job portals, keeping each source separate.

### Input

The default input collects up to 30 unique listings from two pages:

```json
{
  "startUrls": [{"url": "https://emploitic.com/offres-d-emploi"}],
  "maxItems": 30,
  "maxPages": 2
}
```

Use `maxItems: 0` to collect up to `maxPages` for each start URL. Supply a filtered Emploitic job-search URL to target the site's own search results. Pagination preserves its query filters and changes the `page` parameter. Start URLs must be HTTPS pages on `emploitic.com` under `/offres-d-emploi`.

### Output

One dataset item represents a source listing. Fields that Emploitic does not publish are left `null`.

```json
{
  "listing_id": "data-analyst-abc12",
  "job_title": "Data Analyst",
  "company_name": "Example Algeria",
  "location": "Alger, Alger",
  "wilaya": "Alger",
  "country": "DZ",
  "employment_type": "FULL_TIME",
  "date_posted": "2026-10-01T10:00:00Z",
  "published_label": "Aujourd'hui",
  "experience_label": "Confirmé / Expérimenté (3 À 5 Ans)",
  "valid_through": null,
  "description": "Analyze business data and prepare reports.",
  "job_url": "https://emploitic.com/entreprises/example/offres-d-emploi/roles/data-analyst-abc12",
  "source_listing_url": "https://emploitic.com/offres-d-emploi?page=2",
  "source_language": "fr",
  "scraped_at": "2026-10-01T12:00:00.000Z"
}
```

The default dataset view is `overview`. Run statistics are available under the `STATS` key in the Actor's default key-value store.

### How to use

1. Open the Actor's Input tab.
2. Use the default Emploitic job search or paste a filtered Emploitic job-search URL.
3. Choose the maximum number of records and result pages.
4. Run the Actor and export the dataset as JSON, CSV, or Excel.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("scraper_guru/algeria-emploitic-jobs-scraper").call(run_input={
    "maxItems": 100,
    "maxPages": 5,
})
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('scraper_guru/algeria-emploitic-jobs-scraper').call({
    maxItems: 100,
    maxPages: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Pricing

The Actor uses the pay-per-event model. Check the Actor's Apify page for its current event price and any platform usage charges. Total cost depends on returned records and the run's resource use.

### Data quality and limitations

- The Actor collects only listings returned by the selected Emploitic searches at collection time. Search totals and results change.
- It does not claim full coverage of Algeria's job market. Emploitic is one source with its own audience and listing practices.
- Posting dates, employment types, locations, deadlines, and descriptions are captured only when present in the page's structured data.
- The site may change its markup or structured data. Check `STATS` and inspect the source page if a run returns zero listings.
- No login, candidate data, or application submission is used.

Use collected public information responsibly and follow the source's terms and applicable law.

### FAQ

#### Does this represent every job opening in Algeria?

No. It represents public listings returned by the selected Emploitic search pages during the run.

#### Can I collect a particular wilaya or job type?

Use the corresponding Emploitic search filters in a browser and pass the resulting job-search URL as a start URL.

#### Why are some fields empty?

The Actor preserves source fields when Emploitic provides them. It does not infer missing salary, education, or contract information.

#### How do I collect more listings?

Increase `maxItems` and `maxPages`. Requests are kept sequential to reduce load on the source.

#### Can I use it on a schedule?

Yes. Configure an Apify schedule that fits your monitoring needs, and treat each run as its own dated snapshot.

#### How do I troubleshoot an empty dataset?

Check the run log and `STATS` record. Emploitic may change its page structure or return a temporary error; retry later or enable Apify Proxy if direct access is blocked.

# Actor input Schema

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

Optional Emploitic job search pages. Search URLs can include the site's filters. Defaults to the latest job listings.

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

Maximum unique job records to save. Use 0 to collect up to the selected page limit.

## `maxPages` (type: `integer`):

Maximum result pages to process for each search URL. Emploitic currently presents about 20 listings per page.

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

Optional Apify Proxy configuration. Try direct requests first; enable a proxy only if needed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://emploitic.com/offres-d-emploi"
    }
  ],
  "maxItems": 30,
  "maxPages": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Open the default dataset containing collected Emploitic listings.

## `runStats` (type: `string`):

Pages visited, listings found, duplicates skipped, and saved 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 = {
    "startUrls": [
        {
            "url": "https://emploitic.com/offres-d-emploi"
        }
    ],
    "maxItems": 30,
    "maxPages": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper_guru/algeria-emploitic-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://emploitic.com/offres-d-emploi" }],
    "maxItems": 30,
    "maxPages": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("scraper_guru/algeria-emploitic-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 '{
  "startUrls": [
    {
      "url": "https://emploitic.com/offres-d-emploi"
    }
  ],
  "maxItems": 30,
  "maxPages": 2
}' |
apify call scraper_guru/algeria-emploitic-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraper_guru/algeria-emploitic-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/odSNqzx6GUGHEjNkY/builds/hNr7adYpHYknd9QQV/openapi.json
