{
  "openapi": "3.0.1",
  "info": {
    "title": "Wuzzuf.net MENA Job Scraper — Egypt & Middle East Jobs",
    "description": "Scrape wuzzuf.net — Egypt's largest job platform plus the wider MENA region across Saudi Arabia, UAE, Kuwait, Qatar, Bahrain, Oman, Jordan, and Lebanon. Get structured salary, career level, and employment type. Incremental mode tracks changes across runs.",
    "version": "0.1",
    "x-build-id": "oE9Ke3n1WvWdNNyoT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~wuzzuf-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-wuzzuf-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/blackfalcondata~wuzzuf-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-wuzzuf-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/blackfalcondata~wuzzuf-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-wuzzuf-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "title": "🔍 Search Term(s)",
            "type": "string",
            "description": "Keywords to match against job titles and descriptions. Leave empty to browse all jobs in the selected country. Use a JSON array like [\"python\", \"java\"] to run several searches in one execution."
          },
          "country": {
            "title": "🌍 Country",
            "enum": [
              "EG",
              "SA",
              "AE",
              "KW",
              "QA",
              "BH",
              "OM",
              "JO",
              "LB"
            ],
            "type": "string",
            "description": "Country market to search (ISO-2 code: EG = Egypt, SA = Saudi Arabia, AE = UAE, KW = Kuwait, QA = Qatar, BH = Bahrain, OM = Oman, JO = Jordan, LB = Lebanon). Pick a single market per run. Defaults to EG. Full country names like \"Egypt\" are not accepted.",
            "default": "EG"
          },
          "location": {
            "title": "📍 City",
            "type": "string",
            "description": "City or region label as it appears on the site (e.g. \"Cairo\", \"Riyadh\"). Use a JSON array for multi-city searches."
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Direct search URLs or individual job detail URLs. When provided, these run in addition to the search above.",
            "items": {
              "type": "string"
            }
          },
          "careerLevel": {
            "title": "🎯 Career Level",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Filter by seniority. Leave empty to include all levels.",
            "default": ""
          },
          "employmentType": {
            "title": "💼 Employment Type",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4",
              "5",
              "6"
            ],
            "type": "string",
            "description": "Filter by contract style.",
            "default": ""
          },
          "workplaceArrangement": {
            "title": "🏢 Workplace",
            "enum": [
              "",
              "1",
              "2",
              "3"
            ],
            "type": "string",
            "description": "On-site, hybrid, or remote.",
            "default": ""
          },
          "yearsOfExperience": {
            "title": "📈 Minimum Years of Experience",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Filter to jobs requiring at least this many years."
          },
          "salaryFrom": {
            "title": "💰 Minimum Salary",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum monthly salary in the country's local currency (EGP for Egypt, SAR for Saudi Arabia, AED for UAE)."
          },
          "searchMinSalary": {
            "title": "💵 Minimum Salary (USD/month)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs with a disclosed salary whose USD-normalized monthly value meets this amount. Yearly salaries are compared as monthly equivalents.",
            "default": 0
          },
          "easyApplyOnly": {
            "title": "✅ Easy Apply Only",
            "type": "boolean",
            "description": "Keep only jobs that can be applied to directly on Wuzzuf.",
            "default": false
          },
          "searchRadiusKm": {
            "title": "📍 Search Radius (km)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Keep only jobs within this distance of the selected city or the coordinates below. Leave empty or 0 to disable.",
            "default": 0
          },
          "searchLatitude": {
            "title": "🧭 Center Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Optional radius center latitude. When set with longitude, these coordinates override the city center."
          },
          "searchLongitude": {
            "title": "🧭 Center Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Optional radius center longitude. When set with latitude, these coordinates override the city center."
          },
          "categories": {
            "title": "🏷️ Industry Categories",
            "type": "array",
            "description": "Industry codes to filter by (advanced). Leave empty for all industries.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum total jobs to return across all searches. Set 0 to disable the cap.",
            "default": 50
          },
          "maxPages": {
            "title": "📄 Max Pages per Search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Cap on result pages per search query (page size is 15).",
            "default": 10
          },
          "includeDetails": {
            "title": "📋 Fetch Extra Per-Job Detail",
            "type": "boolean",
            "description": "Optional. Fetch each job's individual page to add application counts and similar-job IDs. Slows the run; off by default because the main feed already includes full descriptions.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate plain-text and markdown descriptions to this many characters. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Emit only core fields (title, company, salary, URL, posted date). Useful for AI agents.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "On follow-up runs, only emit jobs that are new or changed since last run. Auto-derives a state key from your filters so different searches stay separate.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional. Manual label for the tracked search universe (e.g. \"eg-developers\"). Leave empty to auto-derive."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged",
            "type": "boolean",
            "description": "Also emit jobs that are unchanged since the last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired",
            "type": "boolean",
            "description": "Also emit a record for jobs that have dropped off the listings.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "Skip jobs whose content matches a job that previously expired (cross-run repost detection).",
            "default": false
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL."
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API access token (System User token from Meta Business). Recipient must have messaged the business number in the last 24h."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"201234567890\")."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after the run. Use with n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\": \"Bearer ...\"})."
          },
          "notificationLimit": {
            "title": "📊 Max Jobs Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of jobs included in each notification message (1–20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When incremental mode is on, only notify about NEW and UPDATED jobs.",
            "default": false
          },
          "appConnector": {
            "title": "Send results to Notion (or another connected app)",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results. Notion is supported today (a run-summary page); other MCP connectors are best-effort as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}