{
 "openapi": "3.1.0",
 "info": {
  "title": "Job Opportunity Index API",
  "version": "1.0",
  "description": "Job-posting feed: new, modified and expired postings, counts and employers. Derived fields are read from each posting by rules (no language model)."
 },
 "servers": [
  {
   "url": "https://jobs.centrality.lol"
  }
 ],
 "paths": {
  "/api/v1/active-jobs": {
   "get": {
    "operationId": "active_jobs",
    "summary": "Active jobs",
    "description": "Open postings first indexed within the time window, from company career sites, hiring platforms and public employment services, with filtering, full-text search, date ranges, pagination and field selection.",
    "tags": [
     "New Jobs"
    ],
    "parameters": [
     {
      "name": "time_frame",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "1h",
        "24h",
        "7d",
        "6m"
       ],
       "default": "24h"
      },
      "description": "1h (hourly polling), 24h (daily, the default), 7d (a week), 6m (every open posting, for a backfill). Counts also accept 1m: everything indexed in 31 days, closed or not. No ingestion delay: a posting is in the window the moment it is indexed. Every window holds only postings their source still lists; roles first posted more than 12 months ago are left out."
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 100
      },
      "description": "Postings per response, 1 to 1000. Default 100."
     },
     {
      "name": "offset",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 0
      },
      "description": "Postings to skip, up to 100,000. Keep adding limit until a page comes back shorter than limit."
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "The last id you received; returns the next postings by id ascending. Best for backfills; every response also carries it in the X-Last-Id header. Wins over offset."
     },
     {
      "name": "description_format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "text",
        "html"
       ]
      },
      "description": "text or html to include the full description (and requirements). Left out by default because it is large."
     },
     {
      "name": "include_page_text",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the complete text read from the original posting page."
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "jsonl",
        "csv",
        "md"
       ],
       "default": "json"
      },
      "description": "json (an array, the default), jsonl, csv, or md (Markdown for language models; chars limits text per posting)."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated list of the fields to return, e.g. id,title,url."
     },
     {
      "name": "schema",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "fantastic",
        "native"
       ],
       "default": "fantastic"
      },
      "description": "The output layout. Default: the universal job-feed layout (ai_* names for derived fields, salary / employment_type as the source states them), so code written for other job feeds works unchanged; the values are still derived by rules from the posting. native: this index's own names (no ai_ prefix)."
     },
     {
      "name": "include_basic_organization_details",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: the employer's profile inline (industry, headcount, headquarters, legal entity id, open and new postings)."
     },
     {
      "name": "include_beta",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the standard occupation of each posting, classification_onet (O*NET-SOC 2019), classification_soc (SOC 2018) and classification_isco (ISCO-08), each {id, name}, matched by rules against O*NET's official title lists (English titles; null when no title matches), and locations_derived_structured (each place as lat, lon, locality, county, region, country, country_code, continent, timezone)."
     },
     {
      "name": "order_by",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "date_created",
        "date_posted",
        "salary"
       ],
       "default": "date_created"
      },
      "description": "date_created (default, newest first), date_posted or salary."
     },
     {
      "name": "include_duplicates",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the same opening found on a second channel."
     },
     {
      "name": "title",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Google-style search of the title: software engineer (both words), \"software engineer\" (phrase), python OR rust, -senior (exclude)."
     },
     {
      "name": "description",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the title and the complete description."
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the location, raw and normalised: Munich also finds München; \"London, England, United Kingdom\"; \"United States\" OR Canada."
     },
     {
      "name": "title_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean: & and, | or, ! not,  followed by,  within N words, 'exact phrase', manag:* prefix, parentheses. E.g. (python | rust) & senior & !staff."
     },
     {
      "name": "description_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over title and description."
     },
     {
      "name": "location_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the location: Germany & !(Berlin | Munich)."
     },
     {
      "name": "organization_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the employer's name."
     },
     {
      "name": "skill",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated skills, all required: Python,SQL."
     },
     {
      "name": "date_posted_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted on or after (ISO 8601, UTC)."
     },
     {
      "name": "date_posted_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted before."
     },
     {
      "name": "date_created_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed on or after: the safe cursor for incremental syncs."
     },
     {
      "name": "date_created_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed before."
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated sources: greenhouse, lever (or lever.co), ashby, workday, oracle, smartrecruiters, workable, recruitee, personio, bamboohr, teamtailor, breezy, adp, arbeitsagentur, eures, career_site. See Supported sources."
     },
     {
      "name": "exclude_source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sources to leave out."
     },
     {
      "name": "source_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ats, career_site, public_employment_service."
     },
     {
      "name": "organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Exact employer names, comma-separated."
     },
     {
      "name": "exclude_organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employers to leave out."
     },
     {
      "name": "domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer domains: nvidia.com,microsoft.com."
     },
     {
      "name": "exclude_domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Domains to leave out."
     },
     {
      "name": "organization_agency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only staffing / placement agencies, or exclude them (direct employers only)."
     },
     {
      "name": "organization_industry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sector, e.g. technology, finance, healthcare."
     },
     {
      "name": "organization_size",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Company size buckets, comma-separated: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+."
     },
     {
      "name": "organization_headcount_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "At least this many employees."
     },
     {
      "name": "organization_headcount_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Fewer than this many employees."
     },
     {
      "name": "company_country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer's home country (ISO code)."
     },
     {
      "name": "experience_level",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "0-2, 2-5, 5-10, 10+ years (also as ai_experience_level)."
     },
     {
      "name": "work_arrangement",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "On-site, Hybrid, Remote OK, Remote Solely."
     },
     {
      "name": "employment_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER."
     },
     {
      "name": "language",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Language the posting is written in: English, German, French, Spanish…"
     },
     {
      "name": "education",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "high school, associate degree, bachelor degree, postgraduate degree."
     },
     {
      "name": "taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Job function, e.g. Software Engineering, Data & AI, Sales (also ai_taxonomies_a, function)."
     },
     {
      "name": "exclude_taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Functions to leave out."
     },
     {
      "name": "visa_sponsorship",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only postings that offer sponsorship, or exclude them."
     },
     {
      "name": "seniority",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "internship, entry, mid, senior, lead, manager, director, executive."
     },
     {
      "name": "has_salary",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings that state pay."
     },
     {
      "name": "salary_min",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Minimum yearly pay (hourly, daily, weekly and monthly pay are converted)."
     },
     {
      "name": "currency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "USD, EUR, GBP…"
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ISO country codes of the job's location: US,CA."
     },
     {
      "name": "has_no_location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings without a recognisable place."
     },
     {
      "name": "full_text_only",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings whose complete text is stored."
     },
     {
      "name": "id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Posting ids, comma-separated."
     },
     {
      "name": "no_collect",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "true: a search with few results does not trigger an automatic collection."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/Job"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/modified-jobs": {
   "get": {
    "operationId": "modified_jobs",
    "summary": "Modified jobs",
    "description": "Open postings whose title, location, pay, employment type, department or complete text changed upstream in the last 24 hours, with date_modified and modified_fields on every row.",
    "tags": [
     "Modified Jobs"
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 100
      },
      "description": "Postings per response, 1 to 1000. Default 100."
     },
     {
      "name": "offset",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 0
      },
      "description": "Postings to skip, up to 100,000. Keep adding limit until a page comes back shorter than limit."
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "The last id you received; returns the next postings by id ascending. Best for backfills; every response also carries it in the X-Last-Id header. Wins over offset."
     },
     {
      "name": "description_format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "text",
        "html"
       ]
      },
      "description": "text or html to include the full description (and requirements). Left out by default because it is large."
     },
     {
      "name": "include_page_text",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the complete text read from the original posting page."
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "jsonl",
        "csv",
        "md"
       ],
       "default": "json"
      },
      "description": "json (an array, the default), jsonl, csv, or md (Markdown for language models; chars limits text per posting)."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated list of the fields to return, e.g. id,title,url."
     },
     {
      "name": "schema",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "fantastic",
        "native"
       ],
       "default": "fantastic"
      },
      "description": "The output layout. Default: the universal job-feed layout (ai_* names for derived fields, salary / employment_type as the source states them), so code written for other job feeds works unchanged; the values are still derived by rules from the posting. native: this index's own names (no ai_ prefix)."
     },
     {
      "name": "include_basic_organization_details",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: the employer's profile inline (industry, headcount, headquarters, legal entity id, open and new postings)."
     },
     {
      "name": "include_beta",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the standard occupation of each posting, classification_onet (O*NET-SOC 2019), classification_soc (SOC 2018) and classification_isco (ISCO-08), each {id, name}, matched by rules against O*NET's official title lists (English titles; null when no title matches), and locations_derived_structured (each place as lat, lon, locality, county, region, country, country_code, continent, timezone)."
     },
     {
      "name": "order_by",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "date_created",
        "date_posted",
        "salary"
       ],
       "default": "date_created"
      },
      "description": "date_created (default, newest first), date_posted or salary."
     },
     {
      "name": "include_duplicates",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the same opening found on a second channel."
     },
     {
      "name": "title",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Google-style search of the title: software engineer (both words), \"software engineer\" (phrase), python OR rust, -senior (exclude)."
     },
     {
      "name": "description",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the title and the complete description."
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the location, raw and normalised: Munich also finds München; \"London, England, United Kingdom\"; \"United States\" OR Canada."
     },
     {
      "name": "title_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean: & and, | or, ! not,  followed by,  within N words, 'exact phrase', manag:* prefix, parentheses. E.g. (python | rust) & senior & !staff."
     },
     {
      "name": "description_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over title and description."
     },
     {
      "name": "location_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the location: Germany & !(Berlin | Munich)."
     },
     {
      "name": "organization_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the employer's name."
     },
     {
      "name": "skill",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated skills, all required: Python,SQL."
     },
     {
      "name": "date_posted_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted on or after (ISO 8601, UTC)."
     },
     {
      "name": "date_posted_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted before."
     },
     {
      "name": "date_created_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed on or after: the safe cursor for incremental syncs."
     },
     {
      "name": "date_created_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed before."
     },
     {
      "name": "date_modified_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "default": "now − 24 h"
      },
      "description": "Changed upstream on or after (default: 24 hours ago)."
     },
     {
      "name": "date_modified_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Changed upstream before."
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated sources: greenhouse, lever (or lever.co), ashby, workday, oracle, smartrecruiters, workable, recruitee, personio, bamboohr, teamtailor, breezy, adp, arbeitsagentur, eures, career_site. See Supported sources."
     },
     {
      "name": "exclude_source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sources to leave out."
     },
     {
      "name": "source_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ats, career_site, public_employment_service."
     },
     {
      "name": "organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Exact employer names, comma-separated."
     },
     {
      "name": "exclude_organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employers to leave out."
     },
     {
      "name": "domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer domains: nvidia.com,microsoft.com."
     },
     {
      "name": "exclude_domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Domains to leave out."
     },
     {
      "name": "organization_agency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only staffing / placement agencies, or exclude them (direct employers only)."
     },
     {
      "name": "organization_industry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sector, e.g. technology, finance, healthcare."
     },
     {
      "name": "organization_size",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Company size buckets, comma-separated: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+."
     },
     {
      "name": "organization_headcount_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "At least this many employees."
     },
     {
      "name": "organization_headcount_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Fewer than this many employees."
     },
     {
      "name": "company_country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer's home country (ISO code)."
     },
     {
      "name": "experience_level",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "0-2, 2-5, 5-10, 10+ years (also as ai_experience_level)."
     },
     {
      "name": "work_arrangement",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "On-site, Hybrid, Remote OK, Remote Solely."
     },
     {
      "name": "employment_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER."
     },
     {
      "name": "language",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Language the posting is written in: English, German, French, Spanish…"
     },
     {
      "name": "education",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "high school, associate degree, bachelor degree, postgraduate degree."
     },
     {
      "name": "taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Job function, e.g. Software Engineering, Data & AI, Sales (also ai_taxonomies_a, function)."
     },
     {
      "name": "exclude_taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Functions to leave out."
     },
     {
      "name": "visa_sponsorship",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only postings that offer sponsorship, or exclude them."
     },
     {
      "name": "seniority",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "internship, entry, mid, senior, lead, manager, director, executive."
     },
     {
      "name": "has_salary",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings that state pay."
     },
     {
      "name": "salary_min",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Minimum yearly pay (hourly, daily, weekly and monthly pay are converted)."
     },
     {
      "name": "currency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "USD, EUR, GBP…"
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ISO country codes of the job's location: US,CA."
     },
     {
      "name": "has_no_location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings without a recognisable place."
     },
     {
      "name": "full_text_only",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings whose complete text is stored."
     },
     {
      "name": "id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Posting ids, comma-separated."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/Job"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/expired-jobs": {
   "get": {
    "operationId": "expired_jobs",
    "summary": "Expired jobs",
    "description": "Ids of postings that closed: filled, withdrawn or removed by their source.",
    "tags": [
     "Expired"
    ],
    "parameters": [
     {
      "name": "source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated sources: greenhouse, lever (or lever.co), ashby, workday, oracle, smartrecruiters, workable, recruitee, personio, bamboohr, teamtailor, breezy, adp, arbeitsagentur, eures, career_site. See Supported sources."
     },
     {
      "name": "time_frame",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "1h",
        "1d",
        "1m",
        "6m"
       ],
       "default": "1d"
      },
      "description": "1h, 1d (default), 1m, 6m."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "type": "integer"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/organizations": {
   "get": {
    "operationId": "organizations",
    "summary": "Organization list",
    "description": "Every employer with open postings, the largest first, as JSON or CSV.",
    "tags": [
     "Organizations"
    ],
    "parameters": [
     {
      "name": "format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "csv"
       ],
       "default": "json"
      },
      "description": "json (default) or csv."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "type": "object"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/search": {
   "get": {
    "operationId": "search",
    "summary": "Search, scraping if needed",
    "description": "One call for 'give me this': answers from the index when it holds at least min_results postings; otherwise it launches scraping for exactly this (the title / place / country through the public employment services, a company's career site with company_url) and answers with what exists now plus the request ids, or, with wait=N, waits for the scraping and answers with the fresh postings. Accepts every active-jobs filter.",
    "tags": [
     "On demand"
    ],
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 100
      },
      "description": "Postings per response, 1 to 1000. Default 100."
     },
     {
      "name": "offset",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 0
      },
      "description": "Postings to skip, up to 100,000. Keep adding limit until a page comes back shorter than limit."
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "The last id you received; returns the next postings by id ascending. Best for backfills; every response also carries it in the X-Last-Id header. Wins over offset."
     },
     {
      "name": "description_format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "text",
        "html"
       ]
      },
      "description": "text or html to include the full description (and requirements). Left out by default because it is large."
     },
     {
      "name": "include_page_text",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the complete text read from the original posting page."
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "jsonl",
        "csv",
        "md"
       ],
       "default": "json"
      },
      "description": "json (an array, the default), jsonl, csv, or md (Markdown for language models; chars limits text per posting)."
     },
     {
      "name": "fields",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated list of the fields to return, e.g. id,title,url."
     },
     {
      "name": "schema",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "fantastic",
        "native"
       ],
       "default": "fantastic"
      },
      "description": "The output layout. Default: the universal job-feed layout (ai_* names for derived fields, salary / employment_type as the source states them), so code written for other job feeds works unchanged; the values are still derived by rules from the posting. native: this index's own names (no ai_ prefix)."
     },
     {
      "name": "include_basic_organization_details",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: the employer's profile inline (industry, headcount, headquarters, legal entity id, open and new postings)."
     },
     {
      "name": "include_beta",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the standard occupation of each posting, classification_onet (O*NET-SOC 2019), classification_soc (SOC 2018) and classification_isco (ISCO-08), each {id, name}, matched by rules against O*NET's official title lists (English titles; null when no title matches), and locations_derived_structured (each place as lat, lon, locality, county, region, country, country_code, continent, timezone)."
     },
     {
      "name": "order_by",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "date_created",
        "date_posted",
        "salary"
       ],
       "default": "date_created"
      },
      "description": "date_created (default, newest first), date_posted or salary."
     },
     {
      "name": "include_duplicates",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the same opening found on a second channel."
     },
     {
      "name": "title",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Google-style search of the title: software engineer (both words), \"software engineer\" (phrase), python OR rust, -senior (exclude)."
     },
     {
      "name": "description",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the title and the complete description."
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the location, raw and normalised: Munich also finds München; \"London, England, United Kingdom\"; \"United States\" OR Canada."
     },
     {
      "name": "title_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean: & and, | or, ! not,  followed by,  within N words, 'exact phrase', manag:* prefix, parentheses. E.g. (python | rust) & senior & !staff."
     },
     {
      "name": "description_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over title and description."
     },
     {
      "name": "location_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the location: Germany & !(Berlin | Munich)."
     },
     {
      "name": "organization_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the employer's name."
     },
     {
      "name": "skill",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated skills, all required: Python,SQL."
     },
     {
      "name": "date_posted_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted on or after (ISO 8601, UTC)."
     },
     {
      "name": "date_posted_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted before."
     },
     {
      "name": "date_created_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed on or after: the safe cursor for incremental syncs."
     },
     {
      "name": "date_created_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed before."
     },
     {
      "name": "exclude_source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sources to leave out."
     },
     {
      "name": "source_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ats, career_site, public_employment_service."
     },
     {
      "name": "organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Exact employer names, comma-separated."
     },
     {
      "name": "exclude_organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employers to leave out."
     },
     {
      "name": "domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer domains: nvidia.com,microsoft.com."
     },
     {
      "name": "exclude_domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Domains to leave out."
     },
     {
      "name": "organization_agency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only staffing / placement agencies, or exclude them (direct employers only)."
     },
     {
      "name": "organization_industry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sector, e.g. technology, finance, healthcare."
     },
     {
      "name": "organization_size",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Company size buckets, comma-separated: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+."
     },
     {
      "name": "organization_headcount_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "At least this many employees."
     },
     {
      "name": "organization_headcount_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Fewer than this many employees."
     },
     {
      "name": "company_country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer's home country (ISO code)."
     },
     {
      "name": "experience_level",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "0-2, 2-5, 5-10, 10+ years (also as ai_experience_level)."
     },
     {
      "name": "work_arrangement",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "On-site, Hybrid, Remote OK, Remote Solely."
     },
     {
      "name": "employment_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER."
     },
     {
      "name": "language",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Language the posting is written in: English, German, French, Spanish…"
     },
     {
      "name": "education",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "high school, associate degree, bachelor degree, postgraduate degree."
     },
     {
      "name": "taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Job function, e.g. Software Engineering, Data & AI, Sales (also ai_taxonomies_a, function)."
     },
     {
      "name": "exclude_taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Functions to leave out."
     },
     {
      "name": "visa_sponsorship",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only postings that offer sponsorship, or exclude them."
     },
     {
      "name": "seniority",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "internship, entry, mid, senior, lead, manager, director, executive."
     },
     {
      "name": "has_salary",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings that state pay."
     },
     {
      "name": "salary_min",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Minimum yearly pay (hourly, daily, weekly and monthly pay are converted)."
     },
     {
      "name": "currency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "USD, EUR, GBP…"
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ISO country codes of the job's location: US,CA."
     },
     {
      "name": "has_no_location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings without a recognisable place."
     },
     {
      "name": "full_text_only",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings whose complete text is stored."
     },
     {
      "name": "id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Posting ids, comma-separated."
     },
     {
      "name": "mode",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "index",
        "live"
       ],
       "default": "index"
      },
      "description": "index (default): only what is already in the database, answered in a fraction of a second. live: the database and live scraping at the same time for whatever is missing (takes up to wait seconds; the answer says what was added and what is still coming)."
     },
     {
      "name": "min_results",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": "limit"
      },
      "description": "How many postings you want (default: limit). While the index holds fewer, the search scrapes for more at the same time: the hiring boards that had such postings before (ranked by what each actually delivered in earlier searches), the public employment services and Amazon for the place, and the place's own employers in the background."
     },
     {
      "name": "wait",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "default": 45
      },
      "description": "Seconds (0-120, default 45) to wait for the scraping it launches, then answer with what it found. 0 (default): answer at once with what is there and a call_again link."
     },
     {
      "name": "company_url",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "A company's website: its career site is scraped now (the company is added if unknown), e.g. https://www.example.com."
     },
     {
      "name": "refresh",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: scrape now even when the index already holds enough."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/Job"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/collect": {
   "get": {
    "operationId": "collect",
    "summary": "Collect now",
    "description": "Ask the index to go and get postings for something specific now (a job, a city, a country), above all for a place it has little on: it finds the employers located there (organisations headquartered nearby on Wikidata, offices, companies, hospitals, universities and banks on OpenStreetMap, with their websites), adds the new ones, reads the career sites of the 80 most important at once, searches the public employment services with those words and that place, and moves the place's other companies to the front of the scraping queue. Returns a request id; GET /api/v1/collect/{id} shows progress and what was found. A feed search returning fewer than 20 postings triggers the same automatically.",
    "tags": [
     "On demand"
    ],
    "parameters": [
     {
      "name": "title",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Job title or keywords to collect for, e.g. nurse."
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "City, region or country, e.g. Lyon or Munich, Germany."
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Two-letter country code, when no location is given, e.g. FR."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/Job"
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  },
  "/api/v1/active-jobs-count": {
   "get": {
    "operationId": "active_jobs_count",
    "summary": "Active jobs count",
    "description": "How many postings active-jobs would return for the same filters.",
    "tags": [
     "Counts"
    ],
    "parameters": [
     {
      "name": "time_frame",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "1h",
        "24h",
        "7d",
        "1m",
        "6m"
       ],
       "default": "24h"
      },
      "description": "1h (hourly polling), 24h (daily, the default), 7d (a week), 6m (every open posting, for a backfill). Counts also accept 1m: everything indexed in 31 days, closed or not. No ingestion delay: a posting is in the window the moment it is indexed. Every window holds only postings their source still lists; roles first posted more than 12 months ago are left out."
     },
     {
      "name": "include_duplicates",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: also the same opening found on a second channel."
     },
     {
      "name": "title",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Google-style search of the title: software engineer (both words), \"software engineer\" (phrase), python OR rust, -senior (exclude)."
     },
     {
      "name": "description",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the title and the complete description."
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "The same syntax over the location, raw and normalised: Munich also finds München; \"London, England, United Kingdom\"; \"United States\" OR Canada."
     },
     {
      "name": "title_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean: & and, | or, ! not,  followed by,  within N words, 'exact phrase', manag:* prefix, parentheses. E.g. (python | rust) & senior & !staff."
     },
     {
      "name": "description_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over title and description."
     },
     {
      "name": "location_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the location: Germany & !(Berlin | Munich)."
     },
     {
      "name": "organization_advanced",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Boolean expression over the employer's name."
     },
     {
      "name": "skill",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated skills, all required: Python,SQL."
     },
     {
      "name": "date_posted_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted on or after (ISO 8601, UTC)."
     },
     {
      "name": "date_posted_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Posted before."
     },
     {
      "name": "date_created_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed on or after: the safe cursor for incremental syncs."
     },
     {
      "name": "date_created_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "First indexed before."
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Comma-separated sources: greenhouse, lever (or lever.co), ashby, workday, oracle, smartrecruiters, workable, recruitee, personio, bamboohr, teamtailor, breezy, adp, arbeitsagentur, eures, career_site. See Supported sources."
     },
     {
      "name": "exclude_source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sources to leave out."
     },
     {
      "name": "source_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ats, career_site, public_employment_service."
     },
     {
      "name": "organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Exact employer names, comma-separated."
     },
     {
      "name": "exclude_organization",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employers to leave out."
     },
     {
      "name": "domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer domains: nvidia.com,microsoft.com."
     },
     {
      "name": "exclude_domain",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Domains to leave out."
     },
     {
      "name": "organization_agency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only staffing / placement agencies, or exclude them (direct employers only)."
     },
     {
      "name": "organization_industry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Sector, e.g. technology, finance, healthcare."
     },
     {
      "name": "organization_size",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Company size buckets, comma-separated: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+."
     },
     {
      "name": "organization_headcount_gte",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "At least this many employees."
     },
     {
      "name": "organization_headcount_lt",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Fewer than this many employees."
     },
     {
      "name": "company_country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Employer's home country (ISO code)."
     },
     {
      "name": "experience_level",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "0-2, 2-5, 5-10, 10+ years (also as ai_experience_level)."
     },
     {
      "name": "work_arrangement",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "On-site, Hybrid, Remote OK, Remote Solely."
     },
     {
      "name": "employment_type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER."
     },
     {
      "name": "language",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Language the posting is written in: English, German, French, Spanish…"
     },
     {
      "name": "education",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "high school, associate degree, bachelor degree, postgraduate degree."
     },
     {
      "name": "taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Job function, e.g. Software Engineering, Data & AI, Sales (also ai_taxonomies_a, function)."
     },
     {
      "name": "exclude_taxonomies",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Functions to leave out."
     },
     {
      "name": "visa_sponsorship",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "only",
        "exclude"
       ]
      },
      "description": "only postings that offer sponsorship, or exclude them."
     },
     {
      "name": "seniority",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "internship, entry, mid, senior, lead, manager, director, executive."
     },
     {
      "name": "has_salary",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings that state pay."
     },
     {
      "name": "salary_min",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Minimum yearly pay (hourly, daily, weekly and monthly pay are converted)."
     },
     {
      "name": "currency",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "USD, EUR, GBP…"
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "ISO country codes of the job's location: US,CA."
     },
     {
      "name": "has_no_location",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings without a recognisable place."
     },
     {
      "name": "full_text_only",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": "false"
      },
      "description": "true: only postings whose complete text is stored."
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "X-Result-Count": {
        "schema": {
         "type": "integer"
        }
       },
       "X-Last-Id": {
        "schema": {
         "type": "integer"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "count": {
           "type": "integer"
          },
          "time_frame": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "A parameter is not understood",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "error": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "429": {
      "description": "Too many requests"
     },
     "503": {
      "description": "Query would scan too much"
     }
    }
   }
  }
 },
 "security": [
  {
   "bearer": []
  }
 ],
 "components": {
  "schemas": {
   "Job": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "description": "Stable posting id."
     },
     "date_posted": {
      "type": "string",
      "description": "When the source says it was posted."
     },
     "date_created": {
      "type": "string",
      "description": "When it was first indexed. Monotonic: use it for incremental syncs."
     },
     "date_last_seen": {
      "type": "string",
      "description": "When it was last confirmed open."
     },
     "title": {
      "type": "string",
      "description": "Title as posted."
     },
     "organization": {
      "type": "string",
      "description": "Employer."
     },
     "organization_url": {
      "type": "string",
      "description": "Employer's website."
     },
     "date_valid_through": {
      "type": "string",
      "description": "Closing date, when the source states one."
     },
     "locations": {
      "type": "array",
      "items": {
       "type": "object"
      },
      "description": "Raw location, JobPosting-style."
     },
     "location_type": {
      "type": "string",
      "description": "TELECOMMUTE when remote."
     },
     "salary": {
      "type": "string",
      "description": "Pay as the posting states it."
     },
     "employment_type": {
      "type": "string",
      "description": "Employment type as the source states it."
     },
     "url": {
      "type": "string",
      "description": "The exact original posting."
     },
     "apply_url": {
      "type": "string",
      "description": "Where to apply."
     },
     "source_type": {
      "type": "string",
      "description": "ats, career_site or public_employment_service."
     },
     "source": {
      "type": "string",
      "description": "Platform or service."
     },
     "source_domain": {
      "type": "string",
      "description": "Host of the posting URL."
     },
     "source_slug": {
      "type": "string",
      "description": "The employer's board on that platform."
     },
     "cities_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Normalised cities."
     },
     "counties_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Counties."
     },
     "regions_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Regions / states."
     },
     "countries_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Countries."
     },
     "country_codes_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "ISO country codes."
     },
     "locations_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "\"City, Region, Country\" in English."
     },
     "timezones_derived": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "IANA time zones."
     },
     "lats_derived": {
      "type": "array",
      "items": {
       "type": "number"
      },
      "description": "Latitudes."
     },
     "lngs_derived": {
      "type": "array",
      "items": {
       "type": "number"
      },
      "description": "Longitudes."
     },
     "domain_derived": {
      "type": "string",
      "description": "Employer domain."
     },
     "ai_salary_currency": {
      "type": "string",
      "description": "ISO currency."
     },
     "ai_salary_value": {
      "type": "number",
      "description": "A single amount."
     },
     "ai_salary_min_value": {
      "type": "number",
      "description": "Lower end of a range."
     },
     "ai_salary_max_value": {
      "type": "number",
      "description": "Upper end."
     },
     "ai_salary_unit_text": {
      "type": "string",
      "description": "HOUR, DAY, WEEK, MONTH, YEAR."
     },
     "ai_benefits": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Benefits the posting names."
     },
     "ai_experience_level": {
      "type": "string",
      "description": "0-2, 2-5, 5-10, 10+."
     },
     "years_experience": {
      "type": "integer",
      "description": "Years asked for."
     },
     "seniority": {
      "type": "string",
      "description": "internship … executive."
     },
     "ai_work_arrangement": {
      "type": "string",
      "description": "On-site, Hybrid, Remote OK, Remote Solely."
     },
     "ai_work_arrangement_office_days": {
      "type": "integer",
      "description": "Office days a week (hybrid), when stated."
     },
     "ai_remote_location": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Countries a remote role is open to."
     },
     "ai_key_skills": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Skills the posting names."
     },
     "ai_core_responsibilities": {
      "type": "string",
      "description": "The posting's own duties section, verbatim."
     },
     "ai_requirements_summary": {
      "type": "string",
      "description": "The posting's own requirements section, verbatim."
     },
     "ai_working_hours": {
      "type": "number",
      "description": "Hours a week, when stated."
     },
     "ai_employment_type": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER."
     },
     "ai_job_language": {
      "type": "string",
      "description": "Language of the posting."
     },
     "ai_visa_sponsorship": {
      "type": "boolean",
      "description": "Whether the posting offers sponsorship, when it says."
     },
     "ai_keywords": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Title words, function, department and skills."
     },
     "ai_taxonomies_a": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Job function."
     },
     "ai_education": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Degree level asked for."
     },
     "department": {
      "type": "string",
      "description": "Department."
     },
     "apply_effort": {
      "type": "string",
      "description": "quick or lengthy."
     },
     "full_text": {
      "type": "boolean",
      "description": "The complete text is stored."
     },
     "details": {
      "type": "object",
      "description": "Every other fact the source gave."
     },
     "org_id": {
      "type": "integer",
      "description": "Employer id."
     },
     "org_slug": {
      "type": "string",
      "description": "Slug for /api/company/{slug}."
     },
     "org_industry": {
      "type": "string",
      "description": "Sector."
     },
     "org_headcount": {
      "type": "integer",
      "description": "Employees."
     },
     "org_headquarters_country": {
      "type": "string",
      "description": "HQ country."
     },
     "org_headquarters_city": {
      "type": "string",
      "description": "HQ city."
     },
     "org_lei": {
      "type": "string",
      "description": "Legal Entity Identifier."
     },
     "org_open_jobs": {
      "type": "integer",
      "description": "Employer's open postings."
     },
     "org_new_jobs_7d": {
      "type": "integer",
      "description": "New this week."
     },
     "org_recruitment_agency_derived": {
      "type": "boolean",
      "description": "Staffing / placement agency."
     },
     "date_modified": {
      "type": "string",
      "description": "When a tracked field changed upstream."
     },
     "modified_fields": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Which fields changed."
     },
     "description_text": {
      "type": "string",
      "description": "Full description (description_format=text)."
     },
     "description_html": {
      "type": "string",
      "description": "Description as HTML (description_format=html)."
     },
     "requirements_text": {
      "type": "string",
      "description": "Requirements section."
     },
     "page_text": {
      "type": "string",
      "description": "Full text of the original page (include_page_text)."
     },
     "locations_derived_structured": {
      "type": "array",
      "items": {
       "type": "object"
      },
      "description": "Each place as lat, lon, locality, county, region, country, country_code, continent, timezone (include_beta)."
     },
     "classification_onet": {
      "type": "object",
      "description": "O*NET-SOC 2019 occupation {id, name}, e.g. {\"id\": \"15-1252.00\", \"name\": \"Software Developers\"} (include_beta; rule-matched from the title)."
     },
     "classification_soc": {
      "type": "object",
      "description": "SOC 2018 detailed occupation {id, name} (include_beta)."
     },
     "classification_isco": {
      "type": "object",
      "description": "ISCO-08 unit group {id, name}, e.g. {\"id\": \"2512\", \"name\": \"Software developers\"} (include_beta)."
     },
     "org_size": {
      "type": "string",
      "description": "Company size bucket: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+ (include_basic_organization_details)."
     },
     "locations_alt": {
      "type": "string",
      "description": "Always null (kept for layout compatibility)."
     },
     "location_requirements": {
      "type": "string",
      "description": "Always null (kept for layout compatibility)."
     },
     "organization_logo": {
      "type": "string",
      "description": "Always null (kept for layout compatibility)."
     },
     "ai_hiring_manager_name": {
      "type": "string",
      "description": "Always null: not collected."
     },
     "ai_hiring_manager_email_address": {
      "type": "string",
      "description": "Always null: not collected."
     }
    }
   }
  },
  "securitySchemes": {
   "bearer": {
    "type": "http",
    "scheme": "bearer",
    "description": "Required: your personal API key (joi_...) from a subscribed account (/account)"
   }
  }
 }
}