{"openapi":"3.1.0","info":{"title":"Trawle API","version":"1.0.0","description":"Open jobs straight from employers' own applicant tracking systems, verified daily, with closure and repost history.\n\n- Send a free read-only API key from https://trawle.com/account#api-keys as the `x-api-key` header.\n- Data refreshes once a day; polling more often returns the same results.\n- Build a `JobQuery` from ids: resolve place names with `GET /v1/places`, roles with `GET /v1/roles`, companies with `GET /v1/companies`.\n- For a daily \"new jobs\" check, pass the previous response's `nextSince` as `postedSince`.\n- Results link to the employer's posting (`applyUrl`) and to Trawle (`url`). Show \"Data by Trawle\" with a link when you display them.\n- Full job descriptions are not served; link to `applyUrl`."},"servers":[{"url":"https://trawle.com"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Required. Free read-only API key from https://trawle.com/account#api-keys. 1,000 requests per daily window."}},"schemas":{"SearchJobsResult":{"type":"object","properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/JobSummary"}},"total":{"type":"integer","description":"Matches, up to 10,000. When `totalCapped` is true the real number is higher: either past the cap, or the count took too long and this only counts what the page found."},"totalCapped":{"type":"boolean"},"nextCursor":{"type":["string","null"],"description":"Next page; null on the last."},"selectedPlaces":{"type":"array","items":{"$ref":"#/components/schemas/PlaceRef"},"description":"Resolved query.places, independent of matching jobs. Includes country codes for location-aware currency defaults; unknown ids are omitted and multi-country regions have a null country."},"labels":{"type":"object","additionalProperties":{"type":"string"},"description":"Names for the ids and slugs in the query, keyed `filter:value` (`places:2618425` → `Copenhagen`). Excluded companies use `companies:slug` too. Unknown inclusions match nothing; unknown exclusions remove nothing. Unknown labels are absent."},"dataDate":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"When the data was last refreshed (daily)."},"nextSince":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"Safe discovery boundary, not response time. Stable across cached pages and pagination. Save only after finishing all pages; pass unchanged as postedSince next run and deduplicate by job id because boundaries overlap. May remain unchanged while scans are incomplete; Unix epoch before a safe scan exists."}},"required":["jobs","total","totalCapped","nextCursor","labels","dataDate","nextSince"]},"JobSummary":{"type":"object","properties":{"id":{"type":"string","description":"Stable public id; never changes across scans.","example":"019a3b6e-8f2c-7d41-9b0e-5c3f7a2d4e81"},"title":{"type":"string"},"postingId":{"type":"string","description":"The concrete source posting whose facts and application link are shown."},"postingCount":{"type":"integer","minimum":0,"description":"Currently publishable source postings grouped into this job; not a headcount estimate."},"department":{"type":["string","null"],"default":null,"description":"Department or team as supplied by the employer; null when not stated."},"requirements":{"type":"array","items":{"type":"string","minLength":1,"maxLength":160},"maxItems":3,"default":[],"description":"Up to three key must-have qualifications extracted from the posting. Preferred qualifications are excluded. Empty when not yet extracted or none are explicitly stated; not an exhaustive list."},"summary":{"type":["string","null"],"default":null,"description":"One-paragraph summary (generated)."},"experienceYears":{"type":["object","null"],"properties":{"min":{"type":["integer","null"]},"max":{"type":["integer","null"]}},"default":null,"required":["min","max"]},"company":{"$ref":"#/components/schemas/CompanyRef"},"role":{"$ref":"#/components/schemas/Ref"},"family":{"$ref":"#/components/schemas/Ref"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/PlaceRef"},"description":"Where the job is located (or, for remote jobs, who may apply), most specific first."},"workplace":{"type":["string","null"],"enum":["remote","hybrid","onsite",null]},"remoteScope":{"type":["string","null"],"description":"For remote jobs: who may apply, in words (\"Anywhere\", \"United States only\")."},"seniority":{"type":["string","null"],"enum":["intern","entry","mid","senior","lead","principal","director","vp","executive",null]},"employmentType":{"type":["string","null"],"enum":["full_time","part_time","contract","temporary","internship","apprenticeship","seasonal","volunteer",null]},"salary":{"$ref":"#/components/schemas/Salary"},"firstSeenAt":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"First seen by Trawle under this id."},"lastSeenAt":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"Last time a daily scan saw it open on the employer's site."},"postedAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"\"Date posted\" from the employer's ATS, when it has one. Often unreliable."},"openSince":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"Legacy earliest observation of a similar posting. Not continuous time open or proof of the same requisition."},"repostCount":{"type":"integer","description":"Legacy total of possible earlier postings plus reopenings. Use possibleRepostCount and reopenCount separately."},"possibleRepostCount":{"type":"integer"},"reopenCount":{"type":"integer"},"historyStartedAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"Detailed scan change capture began here. Earlier changes may be missing; null means capture has not started."},"lastListingChangeAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z"},"relatedPostings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"firstSeenAt":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z"},"confidence":{"type":"string","enum":["source_identity","possible"]}},"required":["id","title","firstSeenAt","confidence"]},"maxItems":8,"description":"Up to eight earlier matching postings, strongest evidence first. source_identity requires matching URL, ATS and requisition id on a confirmed board move. A similar title/location is only possible; never automatically merge decisions for it."},"closedAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"When it disappeared; null while open."},"applyUrl":{"type":"string","description":"The employer's own posting (their ATS)."},"url":{"type":"string","description":"This job on Trawle."},"matchReasons":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"evidence":{"type":"string"},"explanation":{"type":"string"}},"required":["label","evidence","explanation"]},"description":"Query-specific evidence returned by search, not a candidate fit score. Classification is not proof of an employer requirement. Absent outside search."}},"required":["id","title","company","role","family","locations","workplace","remoteScope","seniority","employmentType","salary","firstSeenAt","lastSeenAt","postedAt","openSince","repostCount","closedAt","applyUrl","url"]},"CompanyRef":{"type":"object","properties":{"slug":{"type":"string","example":"stripe"},"name":{"type":"string","example":"Stripe"},"domain":{"type":["string","null"],"example":"stripe.com"},"isAgency":{"type":"boolean","description":"A recruitment or staffing agency posting jobs for its clients, not its own. Job search leaves these out unless `agencies` is set."}},"required":["slug","name","domain","isAgency"]},"Ref":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"]},"PlaceRef":{"type":"object","properties":{"id":{"type":"integer","description":"GeoNames id (regions are negative)."},"name":{"type":"string","example":"Copenhagen"},"country":{"type":["string","null"],"description":"ISO 3166-1 alpha-2 country code; null for multi-country regions.","example":"DK"}},"required":["id","name","country"]},"Salary":{"type":["object","null"],"properties":{"min":{"type":["number","null"]},"max":{"type":["number","null"]},"currency":{"type":["string","null"],"description":"ISO 4217 code.","example":"EUR"},"period":{"type":"string","enum":["year","month","week","day","hour"]}},"required":["min","max","currency","period"],"description":"Pay as the employer listed it (not converted)."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable: `invalid_request`, `not_found`, `forbidden`, `rate_limited`, `internal`.","example":"invalid_request"},"message":{"type":"string","example":"places: expected an array of GeoNames ids"},"hint":{"type":"string","description":"What to do next, e.g. which lookup to call first.","example":"Resolve place names to ids with GET /v1/places?q="},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"]},"description":"Validation problems, one per invalid field."}},"required":["code","message"]}},"required":["error"]},"SearchJobsRequest":{"type":"object","properties":{"query":{"$ref":"#/components/schemas/JobQuery"},"cursor":{"type":["string","null"],"description":"`nextCursor` from the previous page."},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Default 25."},"postedSince":{"type":"string","format":"date-time","description":"Inclusive firstSeenAt lower bound (ISO 8601 with timezone), independent of employer posting dates. Reuse the previous completed run's nextSince, finish all pages with unchanged filters, and deduplicate by job id."}},"required":["query"]},"JobQuery":{"type":"object","properties":{"q":{"type":"string","minLength":2,"maxLength":100,"description":"Free text. Every word must start a word of the job title or department (any order, `react` matches \"React/TypeScript\"), or every word must start a word of the company name.","example":"react"},"roles":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":20,"description":"Role slugs, any of them. Look slugs up with `GET /v1/roles?q=` (MCP `find_occupation`).","example":["frontend-engineer"]},"skills":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":20,"description":"Skill/technology slugs, matching ANY selected term mentioned in the posting. Look up canonical slugs with GET /v1/skills. Missing skill data does not match; a mention is not necessarily a requirement.","example":["react","nextjs"]},"skillsAll":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":20,"description":"Skill/technology slugs that must ALL be mentioned in the posting. Combined with skills and other filters using AND. Unknown or unseeded slugs match nothing.","example":["react","typescript"]},"families":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":10,"description":"Job family slugs (any role in the field). List them with `GET /v1/families`.","example":["software-engineering"]},"places":{"type":"array","items":{"type":"integer"},"minItems":1,"maxItems":20,"description":"Where the person wants to work from, as GeoNames ids (multi-country regions are negative, `-1` is worldwide). Matches onsite/hybrid jobs located in the place plus remote jobs open to people living there. Look ids up with `GET /v1/places?q=` (MCP `resolve_location`).","example":[2618425]},"companies":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":50,"description":"Company slugs. Look them up with `GET /v1/companies?q=`.","example":["stripe"]},"collections":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":20,"description":"Company collection slugs, any of them. Look up with GET /v1/collections (MCP list_collections). Membership applies to the company, not every role's benefits.","example":["yc"]},"excludedCompanies":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"minItems":1,"maxItems":50,"description":"Exclude any of these company slugs, even if also included by companies. Applies to this query and saved searches using it.","example":["acme"]},"excludedTitlePhrases":{"type":"array","items":{"type":"string","minLength":2,"maxLength":80},"minItems":1,"maxItems":20,"description":"Exclude titles containing any of these literal, case-insensitive whole phrases. Whitespace is normalized; punctuation is literal. Does not search descriptions, departments or company names.","example":["recruiter","senior engineer"]},"workplace":{"type":"array","items":{"type":"string","enum":["remote","hybrid","onsite"]},"minItems":1,"example":["remote","hybrid"]},"seniority":{"type":"array","items":{"type":"string","enum":["intern","entry","mid","senior","lead","principal","director","vp","executive"]},"minItems":1,"example":["senior"]},"employment":{"type":"array","items":{"type":"string","enum":["full_time","part_time","contract","temporary","internship","apprenticeship","seasonal","volunteer"]},"minItems":1,"example":["full_time"]},"postingLanguages":{"type":"array","items":{"type":"string","pattern":"^[a-z]{2}$"},"minItems":1,"maxItems":10,"description":"Languages the posting is written in, ISO 639-1, any of them. Detected from the description; jobs without one never match. Not the languages a job requires (`JobDetail.languages`).","example":["en"]},"salary":{"$ref":"#/components/schemas/SalaryRange"},"pay":{"type":"string","enum":["listed"],"description":"`listed`: only jobs that show pay."},"posted":{"type":"string","enum":["1d","3d","7d","30d"],"description":"First seen by Trawle within this window. For scheduled agents, prefer `postedSince` with the `nextSince` of the previous run."},"reposts":{"type":"string","enum":["hide","only"],"description":"Reposts are jobs seen before under another id, or closed and reopened. `hide` keeps only originals."},"agencies":{"type":"string","enum":["include","only"],"description":"Recruitment and staffing agencies posting their clients' jobs (`CompanyRef.isAgency`) are left out by default. `include` adds them, `only` returns nothing else. With `companies`, agencies are not left out: naming a company always searches it."},"sort":{"type":"string","enum":["balanced","newest","pay"],"description":"`newest` (API default), `balanced` (freshness days with precomputed company interleaving; website default), or `pay` (highest annual pay first; only jobs that show pay). Balanced includes jobs once their feed slots are assigned during ingestion."}},"description":"A job search. Values inside one filter are OR, filters are AND. The same object is used by the website's links and saved views."},"SalaryRange":{"type":"object","properties":{"min":{"type":["integer","null"],"minimum":0,"example":60000},"max":{"type":["integer","null"],"minimum":0,"example":null},"currency":{"type":"string","enum":["USD","EUR","GBP","DKK","SEK","NOK","CHF","CAD","AUD"]}},"required":["min","max","currency"],"description":"Annual pay range, both ends inclusive, either end open (null). Jobs match when their own range overlaps it after converting currencies; jobs without pay never match."},"CheckJobStatusResult":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/JobStatus"},"description":"One item per distinct id asked for, in the order given."}},"required":["items"]},"JobStatus":{"type":"object","properties":{"id":{"type":"string","example":"019a3b6e-8f2c-7d41-9b0e-5c3f7a2d4e81"},"status":{"type":"string","enum":["open","closed","not_found"],"description":"`open`: still on the employer's site at the last daily scan. `closed`: gone from it. `not_found`: not a Trawle job id (or archived long ago); treat it as closed."},"closedAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"When it disappeared; null unless closed."},"lastSeenAt":{"type":["string","null"],"format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"Last daily scan that saw it open; null when not found."}},"required":["id","status","closedAt","lastSeenAt"]},"CheckJobStatusRequest":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"maxItems":100,"description":"Job ids from earlier search results (`jobs[].id`), up to 100.","example":["019a3b6e-8f2c-7d41-9b0e-5c3f7a2d4e81","019a3b6f-1a07-7c22-8e4d-0b9f6c1e2a37"]}},"required":["ids"]},"JobDetail":{"allOf":[{"$ref":"#/components/schemas/JobSummary"},{"type":"object","properties":{"summary":{"type":["string","null"],"description":"One-paragraph summary (generated)."},"experienceYears":{"type":["object","null"],"properties":{"min":{"type":["integer","null"]},"max":{"type":["integer","null"]}},"required":["min","max"]},"company":{"allOf":[{"$ref":"#/components/schemas/CompanyRef"},{"type":"object","properties":{"openJobs":{"type":"integer"},"newLast30":{"type":"integer"},"trend":{"type":"array","items":{"type":"integer"},"description":"Open jobs per day, oldest first, the last 90 days."}},"required":["openJobs","newLast30","trend"]}]},"postings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/PlaceRef"}},"workplace":{"type":["string","null"],"enum":["remote","hybrid","onsite",null]},"salary":{"$ref":"#/components/schemas/Salary"},"applyUrl":{"type":"string"}},"required":["id","title","locations","workplace","salary","applyUrl"]},"description":"Open source variants. Location, pay and application URL belong to each individual posting."},"listingHistory":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z"},"kind":{"type":"string","enum":["changed","closed","reopened"]},"changes":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["title","location","salary"]},"before":{"type":"string"},"after":{"type":"string"}},"required":["field","before","after"]}}},"required":["at","kind","changes"]},"maxItems":30},"hasMore":{"type":"boolean"}},"required":["events","hasMore"]},"skills":{"type":"array","items":{"type":"string"}},"skillRefs":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"]},"description":"Canonical identifiers for the displayed skills. Use slugs in JobQuery.skills or skillsAll; mentions may be preferred rather than required."},"visaSponsorship":{"type":["string","null"],"enum":["yes","no",null]},"education":{"type":["string","null"],"enum":["none","high_school","vocational","associate","bachelor","master","doctorate",null],"description":"Minimum required degree, if stated."},"managesPeople":{"type":["boolean","null"],"description":"Has direct reports (true), individual contributor (false), or not stated."},"relocation":{"type":["boolean","null"],"description":"Relocation support offered (true), explicitly not (false), or not stated."},"clearanceRequired":{"type":["boolean","null"],"description":"A government security clearance is required (true), explicitly not (false), or not stated."},"equityOffered":{"type":["boolean","null"],"description":"Equity (stock options, RSUs) offered (true), explicitly not (false), or not stated."},"languages":{"type":"array","items":{"type":"string"},"description":"Required languages, ISO 639-1."},"postingLanguage":{"type":["string","null"],"description":"Language the posting is written in, ISO 639-1 (detected).","example":"en"},"source":{"type":"string","description":"The ATS the job was read from (\"greenhouse\").","example":"greenhouse"}},"required":["summary","experienceYears","skills","visaSponsorship","education","managesPeople","relocation","clearanceRequired","equityOffered","languages","postingLanguage","source"]}]},"RoleMatch":{"allOf":[{"$ref":"#/components/schemas/Ref"},{"type":"object","properties":{"family":{"$ref":"#/components/schemas/Ref"},"openJobs":{"type":"integer"}},"required":["family","openJobs"]}]},"PlaceMatch":{"allOf":[{"$ref":"#/components/schemas/PlaceRef"},{"type":"object","properties":{"kind":{"type":"string","enum":["city","metro","admin1","country","region"]},"context":{"type":["string","null"],"description":"Where it is, for telling homonyms apart (\"Washington, United States\")."},"adminArea":{"type":["object","null"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"code":{"type":["string","null"]}},"required":["id","name","code"],"description":"Parent first-level administrative area for cities/metros, when known. The code is GeoNames' country-local admin1 code."},"population":{"type":["integer","null"],"minimum":0,"description":"Population from the bundled GeoNames data, not a current estimate; null when unavailable (including synthetic regions/metros)."}},"required":["kind","context","adminArea","population"]}]},"Skill":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["language","framework","library","database","cloud","platform","tool","methodology","certification","domain","soft","other"]}},"required":["slug","name","kind"]},"Collection":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["sourced","classified","derived"]},"sourceUrl":{"type":["string","null"]},"openJobs":{"type":"integer"},"companies":{"type":"integer"}},"required":["slug","name","description","kind","sourceUrl","openJobs","companies"]},"SiteStats":{"type":"object","properties":{"salaryRates":{"type":"object","properties":{"date":{"type":"string","format":"date"},"checkedAt":{"type":["string","null"],"format":"date-time"},"source":{"type":"string","enum":["ECB via Frankfurter"]},"unitsPerUsd":{"type":"object","additionalProperties":{"type":"number","exclusiveMinimum":0}}},"required":["date","checkedAt","source","unitsPerUsd"],"description":"Dated daily reference rates for salary conversions; a bundled snapshot is used until the first refresh."},"openJobs":{"type":"integer"},"companies":{"type":"integer","description":"Companies with at least one open job."},"newToday":{"type":"integer","description":"Open jobs first seen in the last 24 hours."},"dataDate":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z"},"historyStart":{"type":"string","format":"date-time","example":"2026-10-31T06:12:00.000Z","description":"First day of Trawle's own history; earlier dates come from employers."}},"required":["openJobs","companies","newToday","dataDate","historyStart"]},"Company":{"allOf":[{"$ref":"#/components/schemas/CompanyRef"},{"type":"object","properties":{"achievements":{"type":"array","items":{"$ref":"#/components/schemas/CompanyAchievement"},"description":"Previously earned hiring achievements, including current status and evidence. Empty does not imply poor hiring practices."},"description":{"type":["string","null"]},"industry":{"type":["string","null"]},"hq":{"allOf":[{"$ref":"#/components/schemas/PlaceRef"},{"type":["object","null"]}]},"careersUrl":{"type":["string","null"]},"url":{"type":"string","description":"This company on Trawle."},"stats":{"type":"object","properties":{"openJobs":{"type":"integer"},"newLast7":{"type":"integer"},"closedLast30":{"type":"integer"},"medianDaysOpen":{"type":["integer","null"]},"repostShare":{"type":"number","description":"Share of open jobs that are reposts (0–1)."},"trend":{"type":"array","items":{"type":"integer"},"description":"Open jobs per day, oldest first, the last 90 days."},"trendEndDate":{"type":"string","format":"date","description":"UTC date of the final daily trend value. Earlier values are consecutive days; independent of the last scan timestamp."}},"required":["openJobs","newLast7","closedLast30","medianDaysOpen","repostShare","trend"]},"families":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Ref"},{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"]}]}},"places":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PlaceRef"},{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"]}]}}},"required":["achievements","description","industry","hq","careersUrl","url","stats","families","places"]}]},"CompanyAchievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","enum":["open-books","no-guesswork","remote","room","ownership","first-seen"]},"name":{"type":"string"},"family":{"type":"string","enum":["standard","trait","milestone"]},"description":{"type":"string"},"criteria":{"type":"string"},"limitation":{"type":"string"},"ruleVersion":{"type":"integer","exclusiveMinimum":0},"status":{"type":"string","enum":["current","not_qualifying","unknown","inactive"],"description":"Current is supported by fresh evidence. Unknown includes stale/incomplete scans; inactive means no open roles. Milestones are historical observations, not current hiring endorsements."},"tier":{"type":"string","enum":["earned","established","enduring"]},"earnedAt":{"type":"string","format":"date-time"},"evaluatedAt":{"type":"string","format":"date-time"},"lastQualifiedAt":{"type":"string","format":"date-time"},"statusChangedAt":{"type":"string","format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time","description":"Current evidence expiry; null for historical milestones."},"qualifyingDays":{"type":"integer","minimum":0,"description":"Consecutive qualifying UTC observation days; retries never add days. Gaps, incomplete scans and lapses reset the run."},"bestQualifyingDays":{"type":"integer","minimum":0},"qualifyingJobs":{"type":"integer","minimum":0},"totalJobs":{"type":"integer","minimum":0},"verifiedBoards":{"type":"integer","minimum":0},"examples":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"}},"required":["id","title"]},"maxItems":3,"description":"Up to three still-public openings supporting the most recent evaluation. Counts refer to that evaluation, not necessarily today's live list."}},"required":["id","code","name","family","description","criteria","limitation","ruleVersion","status","tier","earnedAt","evaluatedAt","lastQualifiedAt","statusChangedAt","validUntil","qualifyingDays","bestQualifyingDays","qualifyingJobs","totalJobs","verifiedBoards","examples"]},"CompanyMatch":{"allOf":[{"$ref":"#/components/schemas/CompanyRef"},{"type":"object","properties":{"industry":{"type":["string","null"]},"openJobs":{"type":"integer"}},"required":["industry","openJobs"]}]},"RoleLookup":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RoleMatch"}},"occupations":{"type":"array","items":{"$ref":"#/components/schemas/OccupationMatch"},"description":"Occupation candidates with classification codes. Use a returned role slug for JobQuery.roles or a family slug for broader searches; occupation slugs/codes are not role filters."}},"required":["items","occupations"]},"OccupationMatch":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"family":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"]},"socCode":{"type":"string","description":"O*NET-SOC 2019 code (classification metadata, not a JobQuery role slug).","example":"15-1252.00"},"iscoCode":{"type":"string","description":"ISCO-08 unit-group code.","example":"2512"},"match":{"type":"string","enum":["exact","phrase","prefix"],"description":"How the input matched: deterministic title alias or a name/code prefix candidate. Confirm ambiguous candidates with the person."}},"required":["slug","name","family","socCode","iscoCode","match"]},"FamilyItem":{"allOf":[{"$ref":"#/components/schemas/Ref"},{"type":"object","properties":{"openJobs":{"type":"integer"}},"required":["openJobs"]}]},"SignalSearchResult":{"type":"object","properties":{"status":{"type":"string","enum":["ready","collecting","not_configured"]},"dataDate":{"type":["string","null"],"format":"date"},"windowStart":{"type":"string","format":"date"},"windowEnd":{"type":"string","format":"date"},"observedDays":{"type":"array","items":{"type":"string","format":"date"}},"legacyEventsSkipped":{"type":"integer","minimum":0,"description":"Pre-UUID events excluded because their historical ids cannot safely resolve to current postings."},"items":{"type":"array","items":{"$ref":"#/components/schemas/HiringSignal"}},"total":{"type":"integer","minimum":0},"nextCursor":{"type":["string","null"]}},"required":["status","dataDate","windowStart","windowEnd","observedDays","legacyEventsSkipped","items","total","nextCursor"]},"HiringSignal":{"type":"object","properties":{"key":{"type":"string","description":"Stable event key, not a job or company id."},"day":{"type":"string","format":"date"},"kind":{"$ref":"#/components/schemas/SignalKind"},"company":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"domain":{"type":["string","null"]}},"required":["slug","name","domain"]},"family":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"]},"country":{"type":["object","null"],"properties":{"code":{"type":"string"},"name":{"type":"string"}},"required":["code","name"]},"title":{"type":"string"},"observation":{"type":"string"},"interpretation":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"sourceUrl":{"type":"string","format":"uri"},"closedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","title","url","sourceUrl","closedAt"]}}},"required":["key","day","kind","company","family","country","title","observation","interpretation","evidence"]},"SignalKind":{"type":"string","enum":["department_scaling","first_in_family","market_entry","leadership_opened","leadership_filled","hard_to_fill","hiring_slowdown"]},"OccupationLookup":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/OccupationMatch"}}},"required":["items"]},"SkillLookup":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Skill"}}},"required":["items"]},"SearchOptions":{"type":"object","properties":{"families":{"type":"array","items":{"$ref":"#/components/schemas/TaxonomyFamily"}},"filters":{"type":"object","properties":{"seniority":{"type":"array","items":{"type":"string","enum":["intern","entry","mid","senior","lead","principal","director","vp","executive"]}},"employment":{"type":"array","items":{"type":"string","enum":["full_time","part_time","contract","temporary","internship","apprenticeship","seasonal","volunteer"]}},"workplace":{"type":"array","items":{"type":"string","enum":["remote","hybrid","onsite"]}},"posted":{"type":"array","items":{"type":"string","enum":["1d","3d","7d","30d"]}},"sort":{"type":"array","items":{"type":"string","enum":["balanced","newest","pay"]}},"currency":{"type":"array","items":{"type":"string","enum":["USD","EUR","GBP","DKK","SEK","NOK","CHF","CAD","AUD"]}},"pay":{"type":"array","items":{"type":"string","enum":["listed"]}},"reposts":{"type":"array","items":{"type":"string","enum":["hide","only"]}},"agencies":{"type":"array","items":{"type":"string","enum":["include","only"]}}},"required":["seniority","employment","workplace","posted","sort","currency","pay","reposts","agencies"]}},"required":["families","filters"],"description":"Bundled families and allowed enum values. Filter names match JobQuery, except currency belongs to salary.currency. Resolve skills/skillsAll slugs with GET /v1/skills. Occupation codes are descriptive taxonomy, not search filters."},"TaxonomyFamily":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}},"required":["slug","name","description"]}},"parameters":{}},"paths":{"/v1/jobs/search":{"get":{"operationId":"searchJobsGet","tags":["Jobs"],"summary":"Search open jobs (cacheable)","description":"The same results and cursors as POST /v1/jobs/search. Pass query as a JSON-encoded JobQuery. Results never depend on cookies or viewer location. Use POST for queries too large for a URL.","parameters":[{"schema":{"type":"string","maxLength":6000,"description":"JSON-encoded JobQuery; default {}."},"required":false,"description":"JSON-encoded JobQuery; default {}.","name":"query","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":2000},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"postedSince","in":"query"}],"responses":{"200":{"description":"A page of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchJobsResult"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]},"post":{"operationId":"searchJobs","tags":["Jobs"],"summary":"Search open jobs","description":"Open jobs matching a `JobQuery`, newest first (or by pay). Finish all pages with the same query and postedSince before saving nextSince for the next daily run. Boundaries overlap: deduplicate by job id. Use query.reposts=\"hide\" for originals. Daily UTC schedule: scans 05:00, enrichment 09:00, finalize 13:00; completion may be later. Check dataDate rather than assuming the refresh succeeded.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchJobsRequest"}}}},"responses":{"200":{"description":"A page of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchJobsResult"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/jobs/status":{"post":{"operationId":"checkJobStatus","tags":["Jobs"],"summary":"Check whether jobs are still open","description":"Bulk status for up to 100 job ids from earlier results: `open`, `closed` (with `closedAt`) or `not_found`. Use it to drop closed jobs from a list you are tracking, instead of fetching each job. Data refreshes once a day.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckJobStatusRequest"}}}},"responses":{"200":{"description":"One status per id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckJobStatusResult"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/jobs/{id}":{"get":{"operationId":"getJob","tags":["Jobs"],"summary":"Get a job","description":"One job, open or closed, with the company's hiring activity. Closed jobs have `closedAt` set.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64,"example":"019a3b6e-8f2c-7d41-9b0e-5c3f7a2d4e81"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobDetail"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/collections":{"get":{"operationId":"listCollections","tags":["Lookups"],"summary":"Browse company collections and their membership criteria","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Optional collection name.","example":"YC"},"required":false,"description":"Optional collection name.","name":"q","in":"query"}],"responses":{"200":{"description":"Collections with visible open-job counts.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}}},"required":["items"]}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/collections/{slug}":{"get":{"operationId":"getCollection","tags":["Collections"],"summary":"Get a collection's criteria and counts","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"The collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/stats":{"get":{"operationId":"getStats","tags":["Meta"],"summary":"Index size and freshness","responses":{"200":{"description":"Totals.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteStats"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/companies/{slug}":{"get":{"operationId":"getCompany","tags":["Companies"],"summary":"Get a company and its hiring activity","description":"Open jobs, new and closed jobs, median days open, repost share, a 90-day trend and earned hiring achievements with versioned criteria, current eligibility and supporting openings.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":80,"example":"stripe"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"The company.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/companies":{"get":{"operationId":"searchCompanies","tags":["Companies","Lookups"],"summary":"Find companies by name or domain","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Company name or domain.","example":"stripe"},"required":true,"description":"Company name or domain.","name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":8,"example":8},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Best matches first.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CompanyMatch"}}},"required":["items"]}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/places":{"get":{"operationId":"resolveLocation","tags":["Lookups"],"summary":"Find places (GeoNames) for the `places` filter","description":"Cities, metro areas, states, countries and multi-country regions (\"EMEA\", \"Europe\", \"Anywhere\") whose name starts with `q`. Use `items[].id` in `JobQuery.places`; `context` tells homonyms apart.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Place name.","example":"copenhagen"},"required":true,"description":"Place name.","name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":8,"example":8},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Best matches first.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PlaceMatch"}}},"required":["items"]}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/roles":{"get":{"operationId":"findRoles","tags":["Lookups"],"summary":"Find roles for the `roles` filter","description":"Roles matching a title alias or prefix, with occupation candidates and SOC/ISCO codes. Use `items[].slug` in `JobQuery.roles`, or an occupation's family.slug in JobQuery.families. Occupation slugs are not role filters. Counts are live; use GET /v1/occupations for a database-free taxonomy lookup.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Role or job title.","example":"frontend"},"required":true,"description":"Role or job title.","name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":8,"example":8},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Role and occupation candidates, best matches first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleLookup"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/families":{"get":{"operationId":"listFamilies","tags":["Lookups"],"summary":"List job families for the `families` filter","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Optional name filter.","example":"engineering"},"required":false,"description":"Optional name filter.","name":"q","in":"query"}],"responses":{"200":{"description":"All families, in browsing order.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/FamilyItem"}}},"required":["items"]}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/signals/search":{"get":{"operationId":"searchSignals","tags":["Signals"],"summary":"Search recent company hiring signals and their supporting jobs","description":"Evidence-backed observations from available daily snapshots in the last seven UTC dates. Filter by company slug, kind, text or inclusive since date. Missing observation days are not zero activity. Counts describe recorded postings, not net headcount. Closed listings do not prove a hire; new job locations do not prove market entry. Product/project inference is not included. Data by Trawle: https://trawle.com/radar","parameters":[{"schema":{"type":"string","maxLength":120},"required":false,"name":"q","in":"query"},{"schema":{"$ref":"#/components/schemas/SignalKind"},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,79}$"},"required":false,"name":"company","in":"query"},{"schema":{"type":"string","format":"date"},"required":false,"name":"since","in":"query"},{"schema":{"type":"string","maxLength":1500},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":25},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Newest observations first, with coverage and pagination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalSearchResult"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Signal storage is temporarily unavailable or contains malformed current-format data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/occupations":{"get":{"operationId":"findOccupations","tags":["Lookups"],"summary":"Resolve occupations and classification codes","description":"Deterministic title aliases, names, slugs or SOC/ISCO code prefixes. Candidates include family slugs usable in JobQuery.families. Occupation slugs and codes are not role filters; resolve role slugs with GET /v1/roles. Unknown input returns an empty list.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Job title, occupation or classification code.","example":"senior frontend developer"},"required":true,"description":"Job title, occupation or classification code.","name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":8,"example":8},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Ranked occupation candidates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OccupationLookup"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/skills":{"get":{"operationId":"listSkills","tags":["Lookups"],"summary":"Find skills by prefix","description":"Bundled skill names, slugs and aliases; exact matches precede prefix matches. Use slugs in JobQuery.skills (any) or JobQuery.skillsAll (all). These match posting mentions, not necessarily requirements; jobs without detected skills do not match.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Skill name or alias prefix.","example":"react"},"required":true,"description":"Skill name or alias prefix.","name":"prefix","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":8,"example":8},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Matching skill names, slugs and kinds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillLookup"}}}},"400":{"description":"Invalid request: see `error.issues` and `error.hint`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}},"/v1/taxonomy":{"get":{"operationId":"getSearchOptions","tags":["Lookups"],"summary":"Discover job families and allowed filter values","description":"Static family slugs and fixed enums from the same bundled taxonomy and JobQuery schema used by search. Use GET /v1/families when live open-job counts are needed. No database or model calls.","responses":{"200":{"description":"Families and filter values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchOptions"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Respect Retry-After and cache results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]}]}}},"webhooks":{}}