{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/100hires-com/json-schema/100hires-com-job-schema.json",
  "title": "Job",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/100hires-com-openapi.json#/components/schemas/Job",
  "type": "object",
  "required": [
    "id",
    "company_id",
    "title",
    "status",
    "url",
    "is_remote",
    "is_hybrid",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "Unique identifier"
    },
    "alias": {
      "type": [
        "string",
        "null"
      ],
      "description": "Short alphanumeric alias used in UI URLs. Use this to build job links — `https://app.100hires.com/job/{alias}/candidates/pipeline`. Also accepted as `{id}` in API requests."
    },
    "company_id": {
      "type": "integer",
      "description": "ID of the company this job belongs to"
    },
    "title": {
      "type": "string",
      "description": "Public job title shown to candidates"
    },
    "internal_title": {
      "type": [
        "string",
        "null"
      ],
      "description": "Internal job title visible only to the hiring team"
    },
    "internal_job_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Company's internal job identifier (e.g. requisition number)"
    },
    "description": {
      "type": "string",
      "description": "Job description (HTML). Present only when `view=full` (default); omitted entirely when `view=summary` to keep list responses inside the agent context budget. Use `GET /jobs/{id}` or `view=full` to retrieve."
    },
    "resume_field_status": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "required",
        "optional",
        "hidden"
      ],
      "description": "Whether resume upload is required, optional, or hidden on the application form"
    },
    "location": {
      "oneOf": [
        {
          "$ref": "#/$defs/JobLocation"
        },
        {
          "type": "null"
        }
      ],
      "description": "Job location details"
    },
    "url": {
      "type": "string",
      "description": "Public URL of the job posting page"
    },
    "url_backoffice": {
      "type": "string",
      "description": "Backoffice URL — opens the job's pipeline view inside the recruiter app (`https://app.100hires.com/job/{alias}/candidates/pipeline`). Use this to link agent widgets / UI to the in-app job page rather than the public career page."
    },
    "is_remote": {
      "type": "boolean",
      "description": "Whether this is a remote position"
    },
    "is_hybrid": {
      "type": "boolean",
      "description": "Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote."
    },
    "job_board_remote_scope": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "city",
        "statewide",
        "nationwide"
      ],
      "description": "How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote."
    },
    "status": {
      "type": "string",
      "description": "Job status: open, closed, draft, or archived"
    },
    "department": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Department this job belongs to"
    },
    "category": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Job category (e.g. Engineering, Marketing)"
    },
    "employment_type": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Employment type (e.g. Full-time, Part-time, Contract)"
    },
    "education_level": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Required education level"
    },
    "experience_level": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Required experience level (e.g. Entry, Mid, Senior)"
    },
    "workflow_id": {
      "type": [
        "integer",
        "null"
      ],
      "description": "ID of the hiring workflow (pipeline) assigned to this job"
    },
    "workflow": {
      "oneOf": [
        {
          "$ref": "#/$defs/IdName"
        },
        {
          "type": "null"
        }
      ],
      "description": "Hiring workflow (pipeline) assigned to this job. Embedded via `include=workflow`. Suppressed when `view=summary` even if the include was requested."
    },
    "form_id": {
      "type": [
        "integer",
        "null"
      ],
      "description": "ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). `null` only when the company has no forms. Fetch the questions with `GET /forms/{id}`. Present in both `view=full` and `view=summary`."
    },
    "pipeline_stages": {
      "oneOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "name": {
                "type": "string"
              }
            }
          }
        },
        {
          "type": "null"
        }
      ],
      "description": "Pipeline stages for this job's workflow. Only included when `include=pipeline_stages` is specified. Suppressed when `view=summary` even if the include was requested."
    },
    "salary_min": {
      "type": [
        "number",
        "null"
      ],
      "description": "Minimum salary"
    },
    "salary_max": {
      "type": [
        "number",
        "null"
      ],
      "description": "Maximum salary"
    },
    "salary_currency": {
      "type": [
        "string",
        "null"
      ],
      "description": "Salary currency code (e.g. USD, EUR)"
    },
    "salary_period": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "annually",
        "monthly",
        "daily",
        "hourly"
      ],
      "description": "Salary period"
    },
    "hours_per_week_min": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Minimum hours per week"
    },
    "hours_per_week_max": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Maximum hours per week"
    },
    "indeed_posting_data": {
      "type": "object",
      "additionalProperties": true,
      "description": "Indeed job board posting metadata. Present only when `view=full` (default); omitted entirely when `view=summary`."
    },
    "hiring_team": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/JobHiringTeamMember"
      },
      "description": "Team members assigned to this job. Embedded via `include=hiring_team`. Suppressed when `view=summary` even if the include was requested."
    },
    "is_satellite": {
      "type": "boolean",
      "description": "Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent."
    },
    "parent_job_id": {
      "type": [
        "integer",
        "null"
      ],
      "description": "ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job."
    },
    "language": {
      "type": [
        "string",
        "null"
      ],
      "description": "Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (`GET /companies/career-site-settings`), which in turn falls back to en-US. This is the override, not the effective language. Present in both `view=full` and `view=summary`."
    },
    "created_at": {
      "type": "integer",
      "format": "int64",
      "description": "Unix timestamp (seconds)"
    },
    "updated_at": {
      "type": "integer",
      "format": "int64",
      "description": "Unix timestamp (seconds)"
    },
    "ai_scoring_criteria": {
      "type": "array",
      "description": "AI scoring criteria configured for this job, ordered by `position` ASC. Returned as an empty array when none are configured. Present only when `view=full` (default); omitted entirely when `view=summary`.",
      "items": {
        "$ref": "#/$defs/AiScoringCriterion"
      }
    }
  },
  "$defs": {
    "AiScoringCriterion": {
      "type": "object",
      "required": [
        "id",
        "text",
        "weight",
        "position"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "description": "Unique identifier of the criterion."
        },
        "title": {
          "type": [
            "string",
            "null"
          ],
          "description": "Optional short label for the criterion."
        },
        "text": {
          "type": "string",
          "description": "Prompt text describing what to evaluate."
        },
        "weight": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10,
          "description": "Relative importance of this criterion in the total score (1–10)."
        },
        "position": {
          "type": "integer",
          "description": "0-based ordinal of the criterion in the job's list."
        }
      }
    },
    "IdName": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "description": "Unique identifier."
        },
        "name": {
          "type": "string",
          "description": "Display name."
        }
      }
    },
    "JobHiringTeamMember": {
      "type": "object",
      "required": [
        "id",
        "full_name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "description": "User ID."
        },
        "full_name": {
          "type": "string",
          "description": "User full name."
        },
        "email": {
          "type": [
            "string",
            "null"
          ],
          "description": "User email."
        },
        "role": {
          "type": [
            "string",
            "null"
          ],
          "description": "Role on hiring team (e.g. hiring_manager, recruiter)."
        }
      }
    },
    "JobLocation": {
      "type": "object",
      "properties": {
        "country": {
          "type": "string",
          "description": "Country."
        },
        "city": {
          "type": "string",
          "description": "City."
        },
        "state": {
          "type": "string",
          "description": "State or region."
        },
        "postal_code": {
          "type": "string",
          "description": "Postal code."
        },
        "street_address": {
          "type": "string",
          "description": "Street address."
        },
        "full_address": {
          "type": "string",
          "description": "Full formatted address."
        }
      }
    }
  }
}