{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Post Enricher: Salary, Seniority, Remote, Visa & Skills",
    "description": "Adds AI fields to job posts from any LinkedIn, Indeed or career-site dataset, CSV or Google Sheet: yearly salary in one currency, seniority, remote or hybrid, visa sponsorship, skills, years of experience. Never invents pay. Charged per enriched job. Agent-ready: x402, MCP.",
    "version": "0.1",
    "x-build-id": "26lMv8TjqTyfm7Rds"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nerolabs~job-post-enricher/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nerolabs-job-post-enricher",
        "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/nerolabs~job-post-enricher/runs": {
      "post": {
        "operationId": "runs-sync-nerolabs-job-post-enricher",
        "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/nerolabs~job-post-enricher/run-sync": {
      "post": {
        "operationId": "run-sync-nerolabs-job-post-enricher",
        "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": {
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "An Apify dataset of job posts, for example the output of a LinkedIn Jobs, Indeed, Glassdoor or career-site (Greenhouse, Lever, Ashby, Workday) scraper run. Every original column is kept and the AI fields are added alongside. Title, description, company, location and salary columns are found automatically. Use the picker rather than typing an ID."
          },
          "fileUrl": {
            "title": "File or Google Sheet URL",
            "type": "string",
            "description": "A public link to a CSV, TSV, Excel, JSON or JSON Lines file with one job per row (an ATS export, a job board feed, a sheet of scraped jobs). A normal Google Sheets link works: share it as 'Anyone with the link can view'."
          },
          "fileFormat": {
            "title": "File format",
            "enum": [
              "auto",
              "csv",
              "tsv",
              "json",
              "jsonl",
              "xlsx"
            ],
            "type": "string",
            "description": "Leave on 'Detect automatically' unless the link has no file extension and the server reports the wrong content type.",
            "default": "auto"
          },
          "sheetName": {
            "title": "Excel sheet name",
            "type": "string",
            "description": "Which sheet to read from an Excel workbook. Defaults to the first sheet."
          },
          "jobTexts": {
            "title": "Job post texts",
            "type": "array",
            "description": "A plain list of whole job posts pasted as text, one per entry, for a quick run with no file. Use a dataset, file or Google Sheet to keep your own columns alongside the AI fields.",
            "items": {
              "type": "string"
            }
          },
          "data": {
            "title": "Rows",
            "type": "array",
            "description": "Job rows as inline JSON, an alternative to a dataset or file. Each object needs a title or description field."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "The currency for the yearly salary columns (salaryMinYearly, salaryMaxYearly), as a three-letter code: USD, GBP, EUR, CAD, AUD, INR and any other European Central Bank currency. Converted at the day's ECB reference rate. Enter 'original' to keep each job's own currency. The stated pay is always kept as written as well.",
            "default": "USD"
          },
          "hoursPerWeek": {
            "title": "Hours per week (for hourly pay)",
            "minimum": 1,
            "maximum": 80,
            "type": "integer",
            "description": "Used only to turn hourly pay into a yearly figure (hourly x hours x 52) when the job does not state its own weekly hours; stated hours (\"20 hours a week\") win. Daily pay uses 260 days a year, weekly 52 weeks, monthly 12 months.",
            "default": 40
          },
          "includeExtras": {
            "title": "Add benefits, education and languages",
            "type": "boolean",
            "description": "Also return statedBenefits (up to 10), educationLevel (minimum stated) and languagesRequired. Same price per job; adds a little run time.",
            "default": false
          },
          "titleField": {
            "title": "Title field (optional)",
            "type": "string",
            "description": "The column holding the job title. Leave empty to detect it. Nested fields use a dot, e.g. 'job.title'."
          },
          "descriptionField": {
            "title": "Description field (optional)",
            "type": "string",
            "description": "The column holding the job description text or HTML, e.g. 'descriptionText', 'description' or 'description.text'. Leave empty to detect it."
          },
          "companyField": {
            "title": "Company field (optional)",
            "type": "string",
            "description": "The column holding the company name, e.g. 'companyName' or 'employer.name'."
          },
          "locationField": {
            "title": "Location field (optional)",
            "type": "string",
            "description": "The column holding the job location, e.g. 'location' or 'location.city'."
          },
          "salaryField": {
            "title": "Salary field(s) (optional)",
            "type": "string",
            "description": "The column(s) holding the posted salary, comma separated, e.g. 'salary' or 'baseSalary,salaryText'. The description is always read for pay too."
          },
          "keep": {
            "title": "Which rows to keep",
            "enum": [
              "all",
              "ok",
              "problems"
            ],
            "type": "string",
            "description": "Filtering happens after the jobs are enriched, so it does not make a run cheaper.",
            "default": "all"
          },
          "keepOriginalFields": {
            "title": "Keep my original columns",
            "type": "boolean",
            "description": "Keep every column from the input row next to the AI fields, so results line up with the scraper's own data (job URL, posted date, applicants). Turn off for the AI fields plus title, company and location only.",
            "default": true
          },
          "exportFormats": {
            "title": "Export files",
            "type": "array",
            "description": "Also write the results as a downloadable CSV or Excel file, linked from the run's output. Lists (skills) are joined with semicolons so they fit a spreadsheet.",
            "items": {
              "type": "string",
              "enum": [
                "csv",
                "xlsx"
              ],
              "enumTitles": [
                "CSV",
                "Excel (xlsx)"
              ]
            },
            "default": []
          },
          "outputDatasetName": {
            "title": "Append to named dataset",
            "type": "string",
            "description": "Also append every kept row to a named dataset that persists across runs, building one growing jobs table. Not charged again."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POST the run summary (counts, top skills, export links) to this URL when the run finishes, for Slack, Zapier, Make, n8n or your own API. Charged only on a confirmed 2xx response."
          },
          "concurrency": {
            "title": "Batches at a time",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many AI requests run in parallel (4 jobs each). The default 4 handles about 1,000 jobs in 20 to 25 minutes; higher values can hit the AI service's rate limit, which the Actor then waits out.",
            "default": 4
          },
          "maxItems": {
            "title": "Maximum jobs",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "A hard ceiling on how many rows are read from the input, as a safety net on a large dataset. The run's own maximum charge limit also stops it cleanly."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}