{
  "openapi": "3.0.1",
  "info": {
    "title": "Naukri Job Scraper — India’s Largest Job Board",
    "description": "Scrape naukri.com - India's largest job board with 500K+ active listings. Salary data, recruiter contact details, skill requirements, and company profiles. Incremental mode detects new and changed listings. Compact output for AI agents and MCP workflows.",
    "version": "1.0",
    "x-build-id": "bvtJOPoMqdMOYuhdM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~naukri-jobs-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-naukri-jobs-feed",
        "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~naukri-jobs-feed/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-naukri-jobs-feed",
        "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~naukri-jobs-feed/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-naukri-jobs-feed",
        "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": {
          "keyword": {
            "title": "🔍 Search Keyword",
            "type": "string",
            "description": "Canonical job search keyword (e.g. 'python developer', 'data analyst'). Not required if jobIds, startUrls, companyGroupIds, or searchQueries is provided. Compatibility: `query` is accepted as an alias for `keyword`."
          },
          "searchQueries": {
            "title": "🔍 Multiple Search Queries",
            "type": "array",
            "description": "Run one search task per entry — useful for batching related searches in a single run. `maxResults` is a GLOBAL cap across the union of all queries (not per-query); under that cap, earlier queries in the list have scheduling priority. Whitespace-only entries are ignored, and exact duplicates are deduplicated (preserving order of first occurrence). Mutually exclusive with `keyword`: if both are supplied, canonical `keyword` wins and searchQueries is ignored. Results dedupe by jobId across queries.",
            "items": {
              "type": "string"
            }
          },
          "skills": {
            "title": "🛠️ Skills",
            "type": "array",
            "description": "Filter by skill names (e.g. ['Python', 'Django', 'AWS']). Appended to the search keyword for server-side matching.",
            "items": {
              "type": "string"
            }
          },
          "jobIds": {
            "title": "🆔 Job IDs",
            "type": "array",
            "description": "Fetch specific jobs by their Naukri job IDs (skips keyword search). Each ID is fetched individually.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste any naukri.com URL straight from your browser. Four shapes work: (1) single-job pages like https://www.naukri.com/job-listings-...-220426501512, (2) search-results like https://www.naukri.com/jobs?keyword=devops&location=mumbai, (3) 'X jobs in Y' SEO URLs like https://www.naukri.com/python-developer-jobs-in-bangalore (optionally -1-to-3-years), and (4) keyword-only SEO URLs like https://www.naukri.com/python-developer-jobs. Mix freely with keyword and jobIds; results dedupe by jobId.",
            "items": {
              "type": "string"
            }
          },
          "ignoreUrlFailures": {
            "title": "🛟 Ignore URL Parse Failures",
            "type": "boolean",
            "description": "When true (default), unparseable startUrls are logged and skipped. When false, the run fails fast on the first bad URL.",
            "default": true
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "Filter by location (e.g. 'Bangalore', 'Mumbai', 'Delhi')"
          },
          "experience": {
            "title": "👨‍💼 Experience (shortcut)",
            "type": "string",
            "description": "Convenient shortcut for the experience filter. Accepts ranges like \"0-1\", \"3-6\", \"10-15\", open-ended \"5+\", a single integer like \"2\", or labels: fresher, entry, junior, mid, senior, lead. Fans out to experienceMin + experienceMax. If you also supply experienceMin/experienceMax, those win."
          },
          "experienceMin": {
            "title": "👨‍💼 Minimum Experience (years, advanced)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Minimum years of experience. Most users should set the `experience` shortcut above instead — only use this for explicit numeric control."
          },
          "experienceMax": {
            "title": "👨‍💼 Maximum Experience (years, advanced)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Maximum years of experience. Most users should set the `experience` shortcut above instead — only use this for explicit numeric control."
          },
          "salary": {
            "title": "💰 Salary Range (Lakhs/year)",
            "enum": [
              "0to3",
              "3to6",
              "6to10",
              "10to15",
              "15to25",
              "25to50",
              "50to75",
              "75to100"
            ],
            "type": "string",
            "description": "Salary range filter in lakhs per annum. Note: Naukri's API does not enforce this filter strictly — many matched jobs still hide their actual salary (salaryDetail.hideSalary=true)."
          },
          "sortBy": {
            "title": "🔀 Sort By",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Sort results by relevance or posting date"
          },
          "workMode": {
            "title": "🏠 Work Mode",
            "enum": [
              "office",
              "remote",
              "hybrid",
              "temporary_wfh"
            ],
            "type": "string",
            "description": "Filter by work arrangement"
          },
          "freshness": {
            "title": "📅 Posted Within (days)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Only show jobs posted within this many days (1, 3, 7, 15, or 30). Compatibility: `freshnessInDays` is accepted as an alias."
          },
          "datePosted": {
            "title": "📅 Date Posted (shortcut)",
            "type": "string",
            "description": "Convenient shortcut for the freshness filter. Accepts integer days (\"7\"), shorthand like \"24h\", \"7d\", \"30d\", or labels: today, yesterday, week, fortnight, month, quarter (the last|past|this prefix is tolerated, e.g. \"last_week\"). Coerces to integer days. If you also supply freshness, that wins."
          },
          "roleCategory": {
            "title": "📁 Role Category",
            "type": "string",
            "description": "Post-filter by role category (e.g. 'Software Engineering', 'Data Science', 'Sales'). Partial match, case-insensitive. Requires fetchDetails."
          },
          "industry": {
            "title": "🏭 Industry",
            "type": "string",
            "description": "Post-filter by industry (e.g. 'IT Services', 'Banking', 'Healthcare'). Partial match, case-insensitive. Requires fetchDetails."
          },
          "cityTypeGid": {
            "title": "🏙️ City ID",
            "minimum": 1,
            "type": "integer",
            "description": "Filter by Naukri city ID (e.g. 97 for Bengaluru, 17 for Hyderabad, 139 for Pune). Stronger filter than the free-text 'location' field. IDs come from the citiesGid cluster in taxonomy_clusters.json."
          },
          "groupId": {
            "title": "🏢 Company Group ID",
            "minimum": 1,
            "type": "integer",
            "description": "Filter to a single company group (e.g. 10476 for Accenture, 223346 for TCS). IDs come from the topGroupId cluster in taxonomy_clusters.json."
          },
          "companyId": {
            "title": "🏢 Company Entity ID",
            "minimum": 1,
            "type": "integer",
            "description": "Filter to a specific company entity (e.g. 1354 for Virtusa, 6762 for Conduent). Different ID-space from groupId — companyId targets a single entity, groupId targets a parent group with subsidiaries. IDs come from the featuredCompanies cluster."
          },
          "companyGroupIds": {
            "title": "🏢 Company Group IDs (fan-out)",
            "type": "array",
            "description": "Crawl multiple company groups in parallel by ID. Each ID becomes its own search seed with independent pagination. IDs from the 1892-company prefetch seed (taxonomy_seed_v4.json) are verified compatible. Mutually exclusive with single groupId.",
            "items": {
              "type": "integer",
              "minimum": 1
            }
          },
          "companyType": {
            "title": "🏛️ Company Type",
            "uniqueItems": true,
            "type": "array",
            "description": "Server-side filter by company type (multi-select). Common IDs: 213=Foreign MNC, 211=Corporate, 217=Indian MNC, 62=Startup, 215=Govt/PSU, 60=MNC. Best-effort — Naukri's mobile API may interpret inconsistently.",
            "items": {
              "type": "string",
              "enum": [
                "213",
                "211",
                "217",
                "62",
                "63",
                "215",
                "60"
              ],
              "enumTitles": [
                "Foreign MNC",
                "Corporate",
                "Indian MNC",
                "Startup",
                "Others",
                "Govt/PSU",
                "MNC"
              ]
            }
          },
          "postedBy": {
            "title": "👤 Posted By",
            "enum": [
              "Both",
              "Company",
              "Consultant"
            ],
            "type": "string",
            "description": "Filter by who posted the job. Verified client-side via the `consultant` field — reliable. \"Company\" drops recruiter/consultant listings (recruiter-spam-filter); \"Consultant\" keeps only consultant-posted; \"Both\" (default) returns all."
          },
          "departmentIds": {
            "title": "🏛️ Department / Function",
            "uniqueItems": true,
            "type": "array",
            "description": "Server-side filter by department (multi-select). E.g. 5=Engineering-SW&QA, 3=Data Science, 14=Sales. See Naukri's filter list for full ID set. Best-effort.",
            "items": {
              "type": "string"
            }
          },
          "roleCategoryIds": {
            "title": "📁 Role Category IDs (server-side)",
            "uniqueItems": true,
            "type": "array",
            "description": "Server-side role-category filter via Naukri's roleCategoryGid (e.g. 1028=Software Development, 1067=Data Science). Distinct from `roleCategory` text filter (which is client-side post-filter on detail). Use IDs for fast server-side narrowing. Best-effort.",
            "items": {
              "type": "string"
            }
          },
          "ugCourse": {
            "title": "🎓 UG Course (Undergraduate)",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by undergraduate course/degree (multi-select). E.g. \"37\"=B.Com, \"5\"=B.Tech. Niche filter for university recruiting.",
            "items": {
              "type": "string"
            }
          },
          "pgCourse": {
            "title": "🎓 PG Course (Postgraduate)",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by postgraduate course/degree (multi-select). E.g. \"8\"=MBA, \"22\"=M.Tech.",
            "items": {
              "type": "string"
            }
          },
          "stipend": {
            "title": "🪙 Internship Stipend",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter internship listings by stipend bracket. Naukri taxonomy IDs.",
            "items": {
              "type": "string"
            }
          },
          "duration": {
            "title": "⏱️ Internship Duration",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter internship listings by duration bracket. Naukri taxonomy IDs.",
            "items": {
              "type": "string"
            }
          },
          "topCompanies": {
            "title": "⭐ Top Companies",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter to Naukri's curated top-employer lists (multi-select). Naukri taxonomy IDs.",
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch full job details. Enables: description, roleCategory, functionalArea, jobRole, employmentType, educationUG, educationPG, applyCount, vacancy, workMode, companyDescription, companyWebsite, plus AmbitionBox reviews/salaries/benefits and walk-in details. Slower — one extra request per job.",
            "default": false
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of jobs to return (0 = unlimited). Compatibility: `limit` and `maxItems` are accepted as aliases.",
            "default": 25
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Return only core fields (jobId, title, company, location, salary, experience, skills, createdDate, portalUrl, description). Ideal for AI agents and MCP workflows.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Truncate job descriptions to this many characters (0 or empty = no truncation)"
          },
          "incremental": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Only return new or changed jobs since last run (state scoped per keyword+location). Tracks NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED classifications across runs.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Override the incremental state key. By default scoped to keyword+location. Use this to isolate state for different workflows using the same query. Concurrent runs with the same stateKey are blocked by a soft 30-min lock to prevent state corruption."
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "Exclude listings detected as reposts of previously seen jobs (matched by content hash).",
            "default": false
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged Jobs",
            "type": "boolean",
            "description": "Incremental only — also emit jobs that are still in the SERP but whose tracked content has not changed since last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Jobs",
            "type": "boolean",
            "description": "Incremental only — also emit jobs that were present last run but are gone this run (marks them as EXPIRED).",
            "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 where alerts are sent (e.g. \"-100123456789\" for a private group, or \"@yourchannel\")."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Get one from Server Settings → Integrations → Webhooks."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. Create at api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📱 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone number ID from Meta Business Manager (NOT the phone number itself — the numeric ID shown next to your business number). Free service-conversation messages within 24 hours of last user-initiated contact."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp Access Token",
            "type": "string",
            "description": "Meta Cloud API access token with `whatsapp_business_messaging` scope. Get a permanent token from a system user in Meta Business Manager."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format (e.g. +919876543210). Recipient must have messaged your business number within the last 24 hours — outside that window, free-form text is rejected by Meta."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Generic webhook URL that receives a JSON POST with the full job payload + run metadata. Universal escape hatch for n8n / Make / Zapier / your own backend."
          },
          "webhookHeaders": {
            "title": "🔑 Webhook Headers",
            "type": "object",
            "description": "Optional headers (e.g. {\"Authorization\": \"Bearer xyz\"}) sent with the webhook POST."
          },
          "notificationLimit": {
            "title": "📊 Max Jobs Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of jobs included in each notification message (1–20). Excess jobs are still in the dataset; notifications get a summary line.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW / UPDATED / REAPPEARED jobs. Has no effect outside incremental mode.",
            "default": false
          },
          "maxConcurrency": {
            "title": "🚦 Max Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of concurrent requests",
            "default": 5
          },
          "maxRequestRetries": {
            "title": "🔁 Max Request Retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of crawler-level retries per request (transient 5xx are also retried at the HTTP layer with exponential backoff).",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "Proxy configuration (optional — Naukri's mobile API does not require a proxy in normal operation)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}