# Egypt CAOA Government Jobs Scraper (`scraper_guru/egypt-caoa-government-jobs-scraper`) Actor

Collect Egypt government job announcements from the CAOA portal with job titles, hiring entities, deadlines, requirements, and submission details.

- **URL**: https://apify.com/scraper_guru/egypt-caoa-government-jobs-scraper.md
- **Developed by:** [LIAICHI MUSTAPHA](https://apify.com/scraper_guru) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.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

## Egypt CAOA Government Jobs Scraper

Collect public vacancy notices from Egypt's Central Agency for Organization and Administration (CAOA) Government Jobs Portal. The Actor reads the portal's public search sections and can open each public notice for its requirements and application details. It does not sign in, submit applications, or access applicant records.

### Features

- Collects appointments and contracts, leadership/supervisory vacancies, and optionally internal government transfers.
- Extracts job title, hiring entity, closing date, positions count, purpose, duties, age and experience criteria, required documents, qualifications, and application location when available.
- Follows public detail links implemented as portal postbacks and preserves source URLs and identifiers.
- Deduplicates notices, limits pages and output records, and keeps request concurrency at one.
- Respects robots.txt and stops on access-denied pages or challenges; it does not use proxies or bypass controls.
- Saves run metrics in the default key-value store under STATS.

### Scope and limitations

This is a snapshot of vacancies published through the CAOA portal. It covers Egyptian government hiring only, not private-sector jobs or the full Egyptian labor market. The portal separates appointment/contract vacancies, internal transfers for current government employees, and leadership/supervisory positions. Internal transfers are excluded by default. Fields omitted by an announcement remain null; the Actor does not infer salaries, active status, or hiring outcomes.

The portal uses postback links for some notices. If a notice detail cannot be opened, the list entry is still saved with detail_status set to failed. Portal page structures and available announcements may change.

### Use cases

- Snapshot public Egyptian government vacancies and application deadlines.
- Compare advertised role titles and hiring agencies across portal categories.
- Build a transparent, source-bounded public-sector job-notice analysis.

### Input

The default input collects up to 50 notices from appointment/contract and leadership/supervisory sections, with notice details enabled. The prefilled input is limited to five notices for a short test run.

| Field | Default | Meaning |
| --- | ---: | --- |
| maxItems | 50 | Maximum unique records to save, from 1 to 500. |
| workTypes | \[1, 3] | 1: appointment/contract; 2: current-government-employee transfers; 3: leadership/supervisory. |
| includeDetails | true | Open public notice details for requirements and application information. |
| maxPagesPerType | 5 | Pagination safety cap for each selected category, from 1 to 20. |

Example input:

```
{"maxItems": 5, "workTypes": ["1", "3"], "includeDetails": true, "maxPagesPerType": 2}
```

### Output

One dataset item per unique portal vacancy. Dates are normalized to YYYY-MM-DD. job_url is null when a notice could not be opened or the listing has no direct detail URL.

```
{
  "job_id": "ATmv+LLNmNAQ7T/O1LNpKw==",
  "job_title": "مدرس كلية الطب بنين اسيوط",
  "hiring_entity": "جامعة الأزهر",
  "affiliated_entity": "جهات تابعة لمجلس الوزاراء",
  "positions_count": 3,
  "positions_text": "3",
  "job_purpose": "عدد درجة واحدة لقسم جراحة الاوعية الدموية...",
  "duties": "يشترط فيمن يتقدم لشغل وظيفة مدرس...",
  "max_age": "50 عام",
  "experience_requirements": "يشترط توافر الكفاءة للتدريس",
  "application_deadline": "2026-10-15",
  "required_documents": "طلب باسم السيد أ.د/ نائب رئيس الجامعة...",
  "submission_location": "التقدم بالكلية المعلن عنها",
  "qualification_requirements": "ان يكون حاصلا على الدكتوراة او ما يعادلها...",
  "work_type": 1,
  "announcement_type": "Appointment and contract",
  "country": "Egypt",
  "source": "CAOA Government Jobs Portal",
  "job_url": "https://jobs.caoa.gov.eg/Jobs/ShowJob.aspx?JobID=ATmv+LLNmNAQ7T/O1LNpKw==",
  "source_search_url": "https://jobs.caoa.gov.eg/Jobs/SearchJobs.aspx?WorkType=1",
  "source_link_id": "ContentPlaceHolder1_grdAdvert_grdJobs_0_lbJobs_0",
  "detail_status": "complete",
  "scraped_at": "2026-10-06T12:00:00.000Z"
}
```

Exact source text may contain long government notice criteria and document lists. Keep the source attribution and describe any published analysis as CAOA public-sector announcements, not employment or hiring totals.

### Local development

```
npm install
npm test
apify run --input='{"maxItems":2,"workTypes":["1"],"includeDetails":true,"maxPagesPerType":1}'
```

### FAQ

**Does this represent the whole Egyptian job market?** No. It only represents notices visible on the CAOA Government Jobs Portal.

**Why are salary or location absent?** The public portal notice fields inspected do not consistently provide them. Missing values are left empty rather than guessed.

**Does it include jobs for private employers?** No. This source is limited to government vacancies. Select work type 2 only for internal transfer/secondment notices aimed at existing government employees.

**What happens if a detail page fails?** The Actor saves the listing entry with detail_status set to failed and reports the failure in STATS.

**Can I compare runs?** Yes. Retain job_id and scraped_at. Counts describe each collection snapshot; they are not historical hiring or employment statistics.

# Actor input Schema

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

Maximum unique vacancy records to save in this run.

## `workTypes` (type: `array`):

Portal sections to collect: appointment/contract, current-employee transfers, and leadership/supervisory roles.

## `includeDetails` (type: `boolean`):

Open each public vacancy detail page to collect requirements, duties, application documents, and submission information.

## `maxPagesPerType` (type: `integer`):

Pagination safety limit for each selected portal category.

## Actor input object example

```json
{
  "maxItems": 5,
  "workTypes": [
    "1",
    "3"
  ],
  "includeDetails": true,
  "maxPagesPerType": 2
}
```

# Actor output Schema

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

No description

## `runStats` (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 = {
    "maxItems": 5,
    "workTypes": [
        "1",
        "3"
    ],
    "includeDetails": true,
    "maxPagesPerType": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper_guru/egypt-caoa-government-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 = {
    "maxItems": 5,
    "workTypes": [
        "1",
        "3",
    ],
    "includeDetails": True,
    "maxPagesPerType": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("scraper_guru/egypt-caoa-government-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 '{
  "maxItems": 5,
  "workTypes": [
    "1",
    "3"
  ],
  "includeDetails": true,
  "maxPagesPerType": 2
}' |
apify call scraper_guru/egypt-caoa-government-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraper_guru/egypt-caoa-government-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/KaBgxZIfWA1Ij0LjG/builds/tTzPSB3EMcSGosKTE/openapi.json
