{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Job Search & Fit Scorer — 10 Sources + V3 Matching",
    "description": "All-in-one developer job search and fit scoring: search 10 public sources or score your own jobs against a résumé or profile. Get a gate-aware shortlist with fit evidence, skill gaps, hard-requirement checks, and application links.",
    "version": "0.1",
    "x-build-id": "FWyEWn1da2RW3q7t8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nomad-agent~ai-job-fit-scorer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nomad-agent-ai-job-fit-scorer",
        "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/nomad-agent~ai-job-fit-scorer/runs": {
      "post": {
        "operationId": "runs-sync-nomad-agent-ai-job-fit-scorer",
        "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/nomad-agent~ai-job-fit-scorer/run-sync": {
      "post": {
        "operationId": "run-sync-nomad-agent-ai-job-fit-scorer",
        "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": {
          "mode": {
            "title": "Run mode",
            "enum": [
              "search",
              "score-jobs"
            ],
            "type": "string",
            "description": "Choose Search + score to find current jobs, or Score supplied jobs to evaluate normalized jobs you already have.",
            "default": "search"
          },
          "search": {
            "title": "Search configuration",
            "type": "object",
            "description": "Used only in Search + score. The fresh form searches three public sources for software engineer roles and fetches at most three jobs per source. Edit sources, terms, and filters for your market. Collectors run inside this Actor—there are no paid child Actor runs or stacked child fees.",
            "properties": {
              "sources": {
                "title": "Sources",
                "type": "array",
                "description": "Select 1–10 in-process sources. Defaults to LinkedIn public jobs, remote boards, and JustJoin.it.",
                "minItems": 1,
                "maxItems": 10,
                "uniqueItems": true,
                "items": {
                  "type": "string"
                }
              },
              "keywords": {
                "title": "Search terms",
                "type": "array",
                "description": "Required role/skill terms. Single-query sources are queried fairly; Built In and NoFluffJobs use developer categories and report keyword support as unsupported.",
                "minItems": 1,
                "maxItems": 10,
                "items": {
                  "type": "string",
                  "maxLength": 100
                }
              },
              "location": {
                "title": "City / province / location",
                "type": "string",
                "maxLength": 200,
                "description": "Native filter for LinkedIn, JustJoin.it, InfoJobs, and Tecnoempleo. It is not a guarantee across every source."
              },
              "countryCodes": {
                "title": "Country codes (WTTJ)",
                "type": "array",
                "maxItems": 30,
                "description": "ISO two-letter country codes forwarded to Welcome to the Jungle.",
                "items": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              "remoteOnly": {
                "title": "Fully remote only",
                "type": "boolean",
                "default": false,
                "description": "Use native filters where supported, then keep only jobs explicitly normalized as fully remote. Hybrid and unknown arrangements are excluded."
              },
              "titleExclude": {
                "title": "Exclude title terms",
                "type": "array",
                "description": "Drop titles containing any of these terms on sources with native title exclusion.",
                "maxItems": 20,
                "items": {
                  "type": "string",
                  "maxLength": 100
                }
              },
              "experienceLevels": {
                "title": "Experience levels (JustJoin.it)",
                "type": "array",
                "description": "Optional Just Join IT experience-level filters such as mid or senior.",
                "maxItems": 12,
                "items": {
                  "type": "string",
                  "maxLength": 40
                }
              },
              "maxExperienceYears": {
                "title": "Maximum experience years (WTTJ)",
                "type": "integer",
                "description": "Optional maximum required experience forwarded to Welcome to the Jungle.",
                "minimum": 0,
                "maximum": 60
              },
              "postedWithinDays": {
                "title": "Posted within (days)",
                "type": "integer",
                "default": 14,
                "minimum": 0,
                "maximum": 365,
                "description": "Mapped to supported sources. Y Combinator and WTTJ do not expose this filter; unknown dates are retained."
              },
              "maxItemsPerSource": {
                "title": "Maximum fetched per source",
                "type": "integer",
                "description": "Bound the number of full postings retained from each selected source before cross-source merging.",
                "default": 10,
                "minimum": 1,
                "maximum": 50
              },
              "cacheTtlSeconds": {
                "title": "Search cache time (seconds)",
                "type": "integer",
                "description": "Reuse source HTTP responses within this duration; set zero to disable cache reuse.",
                "default": 1800,
                "minimum": 0,
                "maximum": 86400
              },
              "concurrency": {
                "title": "Source concurrency",
                "type": "integer",
                "description": "Maximum concurrent source requests across the in-process collectors.",
                "default": 3,
                "minimum": 1,
                "maximum": 10
              },
              "sourceTimeoutSecs": {
                "title": "Per-source timeout (seconds)",
                "type": "integer",
                "description": "Cooperative deadline for each native source request.",
                "default": 120,
                "minimum": 30,
                "maximum": 300
              }
            },
            "default": {
              "sources": [
                "linkedin",
                "remote_boards",
                "justjoinit"
              ],
              "keywords": [
                "software engineer"
              ],
              "postedWithinDays": 14,
              "maxItemsPerSource": 10,
              "cacheTtlSeconds": 1800,
              "concurrency": 3,
              "sourceTimeoutSecs": 120
            },
            "additionalProperties": false
          },
          "jobs": {
            "title": "Normalized jobs (inline)",
            "maxItems": 200,
            "type": "array",
            "description": "JSON array of complete nomad-agent-job-v1 records. Every item needs top-level schemaVersion, identity, data, custom, llm, and raw; identity needs source plus externalId or url, and raw.description contains the posting text. Copy the working shape from README → Score jobs you already have or examples/inline-input.json. Use this, sourceDatasetId, or sourceActorRunId—never more than one. Hard limits: 200 records and 20,000 plain-text description characters per job; oversized evidence is rejected, never truncated.",
            "items": {
              "type": "object"
            }
          },
          "sourceDatasetId": {
            "title": "Source dataset ID",
            "type": "string",
            "description": "Paste the immutable Apify dataset ID—not the dataset name or URL. Each dataset item must be one complete nomad-agent-job-v1 record. The dataset is read only and never modified. Use only one supplied-job source."
          },
          "sourceActorRunId": {
            "title": "Exact source Actor run ID",
            "type": "string",
            "description": "Paste the exact upstream run ID—not the Actor ID, build ID, or run URL. The run must be terminal SUCCEEDED with exit code 0; this Actor reads that run's default dataset as nomad-agent-job-v1 records. Use only one supplied-job source."
          },
          "expectedSourceBuild": {
            "title": "Expected upstream build (optional)",
            "type": "string",
            "description": "Optional guard for sourceActorRunId. Enter the upstream run's exact immutable build ID or build number; the run fails instead of reading jobs when it does not match."
          },
          "maxItems": {
            "title": "Maximum jobs",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum unique jobs to evaluate (1–200). In search mode this caps the merged, deduplicated result set; in score-jobs mode it caps the supplied source.",
            "default": 25
          },
          "candidateProfile": {
            "title": "Structured candidate profile",
            "type": "object",
            "description": "JSON object with at least one of primaryRole, targetTerms, skills, or freeText. Optional seniority, experience, language, location, and contract constraints must be evidence-backed. The displayed example is illustrative and is not prefilled. Use exactly one of this, Résumé, or Résumé text.",
            "properties": {
              "primaryRole": {
                "type": "string",
                "title": "Primary role",
                "description": "Candidate's current or primary professional role, when explicitly evidenced."
              },
              "targetTerms": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "title": "Target role terms",
                "description": "Role titles the candidate can credibly perform now; do not add aspirational roles without evidence."
              },
              "skills": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "title": "Evidenced skills",
                "description": "Skills explicitly supported by the candidate evidence."
              },
              "seniorityLevels": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "title": "Target seniority",
                "description": "Explicitly supported target levels such as junior, mid, senior, lead, or staff."
              },
              "yearsExperience": {
                "type": "number",
                "minimum": 0,
                "title": "Years of experience",
                "description": "Non-negative total relevant years supported by the candidate evidence."
              },
              "workableLanguages": {
                "type": "array",
                "title": "Workable languages",
                "description": "Languages the candidate can use professionally, each with source evidence.",
                "items": {
                  "type": "object",
                  "required": [
                    "language",
                    "evidence"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "language": {
                      "type": "string",
                      "title": "Language",
                      "description": "Language name."
                    },
                    "level": {
                      "type": "string",
                      "title": "Level",
                      "description": "Published or candidate-stated proficiency, such as C1, when known."
                    },
                    "evidence": {
                      "type": "string",
                      "title": "Evidence",
                      "description": "Short source statement supporting this language ability."
                    }
                  }
                }
              },
              "workableLanguagesComplete": {
                "type": "boolean",
                "title": "Language inventory is complete",
                "description": "True only when the supplied list is the candidate's complete workable-language inventory.",
                "default": false
              },
              "acceptedWorkArrangements": {
                "type": "array",
                "title": "Accepted work arrangements",
                "description": "Must exactly match the non-empty remote, hybrid, and onsite location lists.",
                "items": {
                  "type": "string"
                }
              },
              "remoteLocations": {
                "type": "array",
                "title": "Remote locations",
                "description": "Geographies from which the candidate explicitly accepts remote work.",
                "items": {
                  "type": "string"
                }
              },
              "hybridLocations": {
                "type": "array",
                "title": "Hybrid locations",
                "description": "Locations where the candidate explicitly accepts hybrid work.",
                "items": {
                  "type": "string"
                }
              },
              "onsiteLocations": {
                "type": "array",
                "title": "On-site locations",
                "description": "Locations where the candidate explicitly accepts on-site work.",
                "items": {
                  "type": "string"
                }
              },
              "workArrangementPreferencesComplete": {
                "type": "boolean",
                "title": "Work arrangement inventory is complete",
                "description": "True only when the location lists completely describe every accepted arrangement.",
                "default": false
              },
              "acceptedCountryCodes": {
                "type": "array",
                "title": "Accepted country codes",
                "description": "Explicitly accepted two-letter country codes, used only when provided.",
                "items": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 2
                }
              },
              "acceptedContractTypes": {
                "type": "array",
                "title": "Accepted contract types",
                "description": "Explicitly accepted employment or contract types.",
                "items": {
                  "type": "string"
                }
              },
              "acceptedContractTypesComplete": {
                "type": "boolean",
                "title": "Contract inventory is complete",
                "description": "True only when the supplied contract-type list is exhaustive.",
                "default": false
              },
              "asOf": {
                "type": "string",
                "title": "Profile evidence as-of",
                "description": "Optional ISO timestamp describing when the structured evidence was current."
              },
              "freeText": {
                "type": "string",
                "maxLength": 4000,
                "title": "Additional evidence",
                "description": "Short factual candidate summary or explicit constraints, up to 4,000 characters."
              }
            },
            "additionalProperties": false
          },
          "resume": {
            "title": "Résumé (PDF or TXT)",
            "type": "string",
            "description": "Text-based PDF or UTF-8 text, up to 5 MB, 50 PDF pages, and 8,000 readable characters. It is read in memory and sent once for structured profile extraction; it is not written as a separate dataset artifact or repeated in each fit prompt."
          },
          "resumeText": {
            "title": "Résumé text (API alternative)",
            "type": "string",
            "description": "Plain-text alternative for API clients, up to 8,000 readable characters. Use exactly one of candidateProfile, resume, or resumeText."
          },
          "preferences": {
            "title": "Explicit preferences (optional)",
            "type": "string",
            "description": "Up to 4,000 characters of explicit role, location, work-mode, language, contract, or other constraints. Unknowns are never guessed."
          },
          "resultMode": {
            "title": "Result mode",
            "enum": [
              "shortlist",
              "audit"
            ],
            "type": "string",
            "description": "Shortlist (default) returns and charges only successfully scored rows whose deliveryScore meets minDeliveryScore. Audit returns the complete evaluation dataset, including static_drop, static_hold, forward_cap_hold, and ai_failed rows; as before, every Audit row except ai_failed is charged.",
            "default": "shortlist"
          },
          "minDeliveryScore": {
            "title": "Minimum delivery score",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Inclusive 0–5 output threshold used only in Shortlist mode. Default 2. deliveryScore includes hard-gate reductions, so it is safer for delivery than raw fitScore alone. Audit mode records this value but does not filter by it.",
            "default": 2
          },
          "minRankToForward": {
            "title": "Static rank floor",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "V3 static candidates below this 0–100 rank are held before AI (default 30). Hard contradictions are always dropped.",
            "default": 30
          },
          "maxAiItems": {
            "title": "Maximum AI verdicts (optional)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Cap AI verdict calls after static selection (0–200). Remaining eligible jobs receive forward_cap_hold rather than a fabricated score."
          },
          "recoverHolds": {
            "title": "Send recoverable holds to AI",
            "type": "boolean",
            "description": "Also evaluate v3 recoverable holds. Disabled by default so uncertain static evidence remains visibly held.",
            "default": false
          },
          "aiConcurrency": {
            "title": "AI concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Concurrent fit verdict calls (1–8). Lower this for smaller or latency-sensitive batches.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}