search_job_postings
Search job postings
All MCP toolsRead
Start with this for free-word job discovery: search over the organization's PUBLISHED job postings, ranked job-level hits, each with the posting, a relevance score, and the best-matching chunk as a snippet. Optional facets (employment type / location / salary floor / occupation / office frequency / skills) narrow the result with the same semantics as the candidate's conditions surface: the location facet also admits full-remote postings that accept applicants from a listed region's country; the salary-floor facet names its currency and compares annualized amounts strictly within that currency — postings with undisclosed pay, hourly pay, or pay in another currency are INCLUDED (no comparable value = no condition; amounts are never converted across currencies); the occupation facet takes occupation ids (the id of a search_occupations hit) and EXCLUDES unclassified postings (honest on the LOW side — the OPPOSITE polarity of the salary facet); the office-frequency facet lists accepted remote modes and ALWAYS admits postings whose remote mode is undisclosed; the skills facet keeps only postings that list EVERY named skill (required, preferred or in the flat list) by normalized-exact match — "Go" never matches "Google"; postings listing no skills are EXCLUDED. A query that IS a company's official or declared name (spelling and legal-form variance only — never a word merely contained in a name) surfaces that company's published postings first; a hit reached through a declared name carries `matchedName`. To browse a person's SAVED desired conditions newest-first without a query, use list_jobs_in_frame instead. Every returned hit is logged as an impression. Occupation references in the answer carry name as the display name in the saved language of the person this call acts for (the bound person, or the person named as the one acted for on the caller's own side; a service key acting for nobody reads the connection's language) — read the id as the identity, never the name.
Input schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Free-word search query (natural language)."
},
"facets": {
"type": "object",
"properties": {
"employmentType": {
"description": "Employment-type facet: the posting's employmentType must be one of these.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"FULL_TIME",
"PART_TIME",
"CONTRACTOR",
"TEMPORARY",
"INTERN"
],
"description": "Employment type (schema.org vocabulary): \"FULL_TIME\", \"PART_TIME\", \"CONTRACTOR\", \"TEMPORARY\", or \"INTERN\". Other values are rejected."
}
},
"jobLocation": {
"description": "Job-location facet: country (ISO 3166-1, e.g. \"JP\") or region (ISO 3166-2, e.g. \"JP-13\") entries. The posting's work-location list (jobLocations, falling back to the single jobLocation) must overlap the entries — equal codes, or either side's country containing the other's region by prefix (mirroring the SQL arms) — or the posting is full-remote and accepts applicants from a listed entry's country (undisclosed applicant location never qualifies).",
"minItems": 1,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO 3166-1 alpha-2 country code: exactly two uppercase letters, e.g. \"JP\". Three-letter codes (\"JPN\"), subdivision codes (\"JP-13\"), country names, and lowercase are rejected."
},
{
"type": "string",
"pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$",
"description": "ISO 3166-2 subdivision code: two uppercase letters, a hyphen, then 1-3 uppercase alphanumerics, e.g. \"JP-13\" (Tokyo). Country-only codes (\"JP\"), place names, and lowercase are rejected."
}
],
"description": "Desired-location entry: a whole country as an ISO 3166-1 alpha-2 code (e.g. \"US\") or one region as an ISO 3166-2 subdivision code (e.g. \"JP-13\"). Names, lowercase, and three-letter codes are rejected."
}
},
"minBaseSalary": {
"description": "Salary lower-bound facet (annual, per-currency): postings in `currency` must reach `min` annualized (MONTH ranges ×12; the posting's max, falling back to min). Postings with undisclosed pay, hourly pay, or pay in ANOTHER currency are INCLUDED — the facet states no condition for them (never converted, never compared across currencies).",
"type": "object",
"properties": {
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 currency code (exactly three uppercase letters) of the lower bound."
},
"min": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Desired ANNUAL lower bound as a non-negative integer in `currency`."
}
},
"required": [
"currency",
"min"
],
"additionalProperties": false
},
"minBaseSalaries": {
"description": "Salary lower-bound facet, per-currency rows (the frame's desiredSalaries projection): one annual lower bound per currency, conjoined — a posting must satisfy EVERY row, each row judged by the same per-currency table as `minBaseSalary` (undisclosed / hourly / other-currency pay is within THAT row). Equivalent to `jobWithinDesiredSalaries`' per-currency semantics. When `minBaseSalary` is also set, both conjoin.",
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 currency code (exactly three uppercase letters) of the lower bound."
},
"min": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Desired ANNUAL lower bound as a non-negative integer in `currency`."
}
},
"required": [
"currency",
"min"
],
"additionalProperties": false
}
},
"occupations": {
"description": "Occupations facet: occupation numbers. A posting stays only when one of its occupation entries carries a listed id. Unclassified postings (`occupations` absent) are EXCLUDED when this facet is set — honest on the LOW side, the OPPOSITE polarity of the salary facet's \"no comparable value = included\".",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"officeModes": {
"description": "Office-frequency facet: accepted remote-work modes (\"none\" | \"hybrid\" | \"full\", the shared remote-work vocabulary). The posting's `remote` must be one of these — but a posting whose `remote` is ABSENT (undisclosed) is ALWAYS allowed; the axis states no condition for it.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"none",
"hybrid",
"full"
],
"description": "Remote-work classification: \"none\" (on-site), \"hybrid\", or \"full\" (fully remote). Other values are rejected; absent = undisclosed. \"Full remote within Japan\" composes as remote \"full\" + applicantLocation countries [\"JP\"]."
}
},
"skills": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"description": "Skills facet (ALL-OF): the posting must list EVERY named skill — in its flat `skills` list or in `skillRequirements`, required and preferred alike — by normalized-exact match (width, case, whitespace and katakana/hiragana folded; never a substring, so \"Go\" does not match \"Google\"). Postings that list no skills are EXCLUDED — honest on the LOW side, like the occupation facet. A search-band condition only: never a frame arm, never saved."
}
},
"additionalProperties": false,
"description": "Job-search facet filter. Absent facets impose no constraint; the salary, location, occupation, and office-mode facets share the conditions surface's frame semantics (undisclosed salary = included, full-remote reach counts as the region, unclassified occupations = excluded, undisclosed remote = included); the skills facet is the search band's own all-of condition (postings listing no skills = excluded)."
},
"limit": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"hits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"jobId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The matched jobs.id."
},
"job": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "string",
"pattern": "^3\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
"description": "Contract version as a SemVer core triple with major locked to 3 (pattern \"3.<minor>.<patch>\", e.g. \"3.0.0\"). Minors are additive-only: they may only add optional fields. Other majors and non-SemVer strings are rejected."
},
"title": {
"type": "string",
"minLength": 1,
"description": "Posting title (non-empty)."
},
"description": {
"type": "string",
"minLength": 1,
"description": "Full free-text description of the role (non-empty)."
},
"occupations": {
"description": "Job occupations: references { id, name? } to occupation rows, unique by id, in the order stated. An empty array is rejected — absent = unclassified (the house nonempty-optional pattern). Parallel to (never replacing) the raw `title` verbatim.",
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The occupation's number (an `occupations` row) — the identity predicates count on."
},
"name": {
"description": "The row's display name in the reader's language, added when a read answers (trimmed, non-empty). Optional on a write and never stored — a stored reference carries the number alone.",
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$"
}
},
"required": [
"id"
],
"additionalProperties": false,
"description": "Occupation reference: { id, name? } — the row's number, plus the display name a read adds in the reader's language (a write may carry one; it is not stored)."
}
},
"employmentType": {
"type": "string",
"enum": [
"FULL_TIME",
"PART_TIME",
"CONTRACTOR",
"TEMPORARY",
"INTERN"
],
"description": "Employment type (schema.org vocabulary): \"FULL_TIME\", \"PART_TIME\", \"CONTRACTOR\", \"TEMPORARY\", or \"INTERN\". Other values are rejected."
},
"hiringOrganization": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Hiring organization display name."
},
"sameAs": {
"description": "Canonical URL identifying the organization.",
"type": "string",
"format": "uri"
},
"address": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "The recruiting entity's address as ONE line in customary domestic notation, e.g. \"1-1-1 Marunouchi, Chiyoda-ku, Tokyo 100-0005\" (or its Japanese spelling) — trimmed and non-empty, never normalized, verified or geocoded. Posting content published as-is beside the contact (ADR-0216): an external-publication readiness item, never a market publish item, never a matching or search input (ADR-0082)."
}
},
"required": [
"name"
],
"additionalProperties": false,
"description": "The organization hiring for this posting: its display name, an optional canonical URL, and the optional one-line address the external publication discloses."
},
"contact": {
"description": "Employer contact for enquiries about this posting — phone and/or email plus an optional note. Absent = not stated. Posting content, published as-is: never a publish item, never a matching or search input (ADR-0216).",
"type": "object",
"properties": {
"phone": {
"description": "Phone number in customary domestic notation, e.g. \"03-1234-5678\" or \"+81 3 1234 5678\" — digits, \"+\", \"-\", spaces and parentheses only; never normalized or verified.",
"type": "string",
"pattern": "^(?=.*[0-9])[0-9+(](?:[0-9+\\-() ]*[0-9)])?$"
},
"email": {
"description": "Contact email address for enquiries about this posting.",
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"note": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "One line beside the channels — the department, the person in charge, reception hours — trimmed and non-empty."
}
},
"additionalProperties": false
},
"jobLocation": {
"description": "Work location as ONE ISO 3166-2 subdivision code, e.g. \"JP-13\" — the same format as the candidate's desiredLocations. Deprecated in place since 1.12.0: readers read the plural `jobLocations` through `jobLocationsOf`; the write choke keeps this field a truthful mirror (set only when the list is exactly one region entry).",
"type": "string",
"pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$"
},
"jobLocations": {
"description": "Work locations as a mixed country/region list, e.g. [\"JP-13\", \"JP-27\"] (any of the listed sites) or [\"JP\"] (anywhere within the country), unique and insertion-order-preserving. An empty array is rejected — absent = undisclosed (the same meaning as the deprecated single `jobLocation` being absent). Readers of the single `jobLocation` migrate to this list via `jobLocationsOf`; a redundant country⊇region pair is accepted (the desiredLocations posture — the UI absorbs it, matching is unaffected).",
"minItems": 1,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO 3166-1 alpha-2 country code: exactly two uppercase letters, e.g. \"JP\". Three-letter codes (\"JPN\"), subdivision codes (\"JP-13\"), country names, and lowercase are rejected."
},
{
"type": "string",
"pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$",
"description": "ISO 3166-2 subdivision code: two uppercase letters, a hyphen, then 1-3 uppercase alphanumerics, e.g. \"JP-13\" (Tokyo). Country-only codes (\"JP\"), place names, and lowercase are rejected."
}
],
"description": "Desired-location entry: a whole country as an ISO 3166-1 alpha-2 code (e.g. \"US\") or one region as an ISO 3166-2 subdivision code (e.g. \"JP-13\"). Names, lowercase, and three-letter codes are rejected."
}
},
"remote": {
"type": "string",
"enum": [
"none",
"hybrid",
"full"
],
"description": "Remote-work classification: \"none\" (on-site), \"hybrid\", or \"full\" (fully remote). Other values are rejected; absent = undisclosed. \"Full remote within Japan\" composes as remote \"full\" + applicantLocation countries [\"JP\"]."
},
"officeFrequency": {
"description": "Office-attendance frequency: the posting's ACTUAL range on the shared ordered 6-level office-frequency scale — min = most remote-leaning, max = most office-leaning, both inclusive. Absent = undisclosed on this axis. Parallel to (never replacing) the 3-value `remote` classification: writers that set a range mirror it into `remote` via officeFrequencyRangeToRemote; readers of `remote` stay untouched.",
"type": "object",
"properties": {
"min": {
"type": "string",
"enum": [
"remote_only",
"office_monthly",
"office_1_2_days",
"office_3_4_days",
"office_daily_remote_ok",
"office_daily"
],
"description": "The most remote-leaning end of the accepted range (inclusive)."
},
"max": {
"type": "string",
"enum": [
"remote_only",
"office_monthly",
"office_1_2_days",
"office_3_4_days",
"office_daily_remote_ok",
"office_daily"
],
"description": "The most office-leaning end of the accepted range (inclusive)."
}
},
"required": [
"min",
"max"
],
"additionalProperties": false
},
"applicantLocation": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "anywhere",
"description": "No location restriction — applications are accepted from anywhere."
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "countries",
"description": "Applications are accepted only from the listed countries."
},
"countries": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO 3166-1 alpha-2 country code: exactly two uppercase letters, e.g. \"JP\". Three-letter codes (\"JPN\"), subdivision codes (\"JP-13\"), country names, and lowercase are rejected."
},
"description": "Allowed applicant countries as unique, order-preserving ISO 3166-1 alpha-2 codes, e.g. [\"JP\", \"US\"]. An empty list is rejected — \"no restriction\" is { type: \"anywhere\" }."
}
},
"required": [
"type",
"countries"
],
"additionalProperties": false
}
],
"description": "Where applicants may apply from: { type: \"anywhere\" } or { type: \"countries\", countries: [...] }. Absent = undisclosed."
},
"visaSponsorship": {
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "Whether visa sponsorship is offered. false is a disclosed no — distinct from the group being absent (undisclosed)."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Conditions, eligible visa statuses, and similar sponsorship detail — free text, trimmed and non-empty."
}
},
"required": [
"available"
],
"additionalProperties": false,
"description": "Visa sponsorship: availability plus optional conditions. Absent = undisclosed."
},
"relocationSupport": {
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "Whether relocation support is offered. false is a disclosed no — distinct from the group being absent (undisclosed)."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "What the relocation support covers (temporary housing, flights, moving costs, etc.) — free text, trimmed and non-empty."
}
},
"required": [
"available"
],
"additionalProperties": false,
"description": "Relocation support: availability plus optional detail of what is covered. Absent = undisclosed."
},
"sideJobAcceptance": {
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "Whether the engagement can be worked alongside a primary job. false is a disclosed no — distinct from the group being absent (undisclosed)."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Conditions on side workers (weekly hours, meeting windows, conflict-of-interest rules, etc.) — free text, trimmed and non-empty."
}
},
"required": [
"available"
],
"additionalProperties": false,
"description": "Side-job acceptance: whether the engagement can run alongside a primary job, plus optional conditions. Absent = undisclosed."
},
"languageRequirements": {
"description": "Language requirements: one entry per language with unique, order-preserving ISO 639-1 codes, e.g. [{ language: \"ja\", level: \"business\" }]. An empty array is rejected — absent = undisclosed; level \"none\" = a disclosed not-required.",
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"language": {
"type": "string",
"enum": [
"aa",
"ab",
"ae",
"af",
"ak",
"am",
"an",
"ar",
"as",
"av",
"ay",
"az",
"ba",
"be",
"bg",
"bi",
"bm",
"bn",
"bo",
"br",
"bs",
"ca",
"ce",
"ch",
"co",
"cr",
"cs",
"cu",
"cv",
"cy",
"da",
"de",
"dv",
"dz",
"ee",
"el",
"en",
"eo",
"es",
"et",
"eu",
"fa",
"ff",
"fi",
"fj",
"fo",
"fr",
"fy",
"ga",
"gd",
"gl",
"gn",
"gu",
"gv",
"ha",
"he",
"hi",
"ho",
"hr",
"ht",
"hu",
"hy",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"io",
"is",
"it",
"iu",
"ja",
"jv",
"ka",
"kg",
"ki",
"kj",
"kk",
"kl",
"km",
"kn",
"ko",
"kr",
"ks",
"ku",
"kv",
"kw",
"ky",
"la",
"lb",
"lg",
"li",
"ln",
"lo",
"lt",
"lu",
"lv",
"mg",
"mh",
"mi",
"mk",
"ml",
"mn",
"mr",
"ms",
"mt",
"my",
"na",
"nan",
"nb",
"nd",
"ne",
"ng",
"nl",
"nn",
"no",
"nr",
"nv",
"ny",
"oc",
"oj",
"om",
"or",
"os",
"pa",
"pi",
"pl",
"ps",
"pt",
"qu",
"rm",
"rn",
"ro",
"ru",
"rw",
"sa",
"sc",
"sd",
"se",
"sg",
"si",
"sk",
"sl",
"sm",
"sn",
"so",
"sq",
"sr",
"ss",
"st",
"su",
"sv",
"sw",
"ta",
"te",
"tg",
"th",
"ti",
"tk",
"tl",
"tn",
"to",
"tr",
"ts",
"tt",
"tw",
"ty",
"ug",
"uk",
"ur",
"uz",
"ve",
"vi",
"vo",
"wa",
"wo",
"xh",
"yi",
"yo",
"yue",
"za",
"zh",
"zu"
],
"description": "Language code from the closed vocabulary: ISO 639-1 two-letter codes plus the allowlist \"yue\" (Cantonese) and \"nan\" (Taiwanese Hokkien), e.g. \"ja\", \"en\", \"zh\". Language names, unassigned codes, region-qualified tags (\"zh-TW\"), and uppercase are rejected."
},
"level": {
"type": "string",
"enum": [
"none",
"basic",
"conversational",
"business",
"fluent"
],
"description": "Minimum required proficiency: \"none\" (a disclosed not-required), \"basic\", \"conversational\", \"business\", or \"fluent\". Other values are rejected."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Supplementary free text on the language requirement, e.g. \"equivalent to JLPT N1\" — trimmed and non-empty."
}
},
"required": [
"language",
"level"
],
"additionalProperties": false,
"description": "Per-language minimum proficiency requirement: ISO 639-1 language code × ordered level, plus optional free-text detail."
}
},
"experienceRequirement": {
"type": "object",
"properties": {
"minYears": {
"type": "integer",
"minimum": 0,
"maximum": 50,
"description": "Minimum required years of experience as an integer 0–50. 0 = no experience required (a disclosed not-required), distinct from the field being absent (undisclosed)."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Supplementary free text on the experience requirement, e.g. \"hands-on web application development\" or \"management experience welcome\" — trimmed and non-empty."
}
},
"required": [
"minYears"
],
"additionalProperties": false,
"description": "Experience requirement: minimum years threshold plus optional free-text detail. Absent = undisclosed; minYears 0 = no experience required."
},
"educationRequirement": {
"type": "object",
"properties": {
"minLevel": {
"type": "string",
"enum": [
"none",
"high_school",
"associate",
"bachelor",
"master",
"doctorate"
],
"description": "Minimum required education level: \"none\" (a disclosed not-required), \"high_school\", \"associate\" (junior college, technical college, or vocational school), \"bachelor\", \"master\", or \"doctorate\". Other values are rejected."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Supplementary free text on the education requirement, e.g. \"computer science major\" or \"equivalent work experience accepted\" — trimmed and non-empty."
}
},
"required": [
"minLevel"
],
"additionalProperties": false,
"description": "Education requirement: minimum level on the ordered EDUCATION_LEVELS ladder, plus optional free-text detail. Absent = undisclosed."
},
"certificationRequirements": {
"description": "Required certifications: one entry per certification with unique, order-preserving names, e.g. [{ name: \"AWS SAA\", issuer: \"AWS\" }]. An empty array is rejected — absent = undisclosed.",
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Certification name, e.g. \"AWS Certified Solutions Architect\" or \"PMP\" — trimmed and non-empty."
},
"issuer": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Issuing organization, e.g. \"IPA\" — trimmed and non-empty."
},
"url": {
"description": "URL of the certification or issuing organization.",
"type": "string",
"format": "uri"
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Supplementary free text on the certification requirement, e.g. \"equivalent certifications accepted\" or \"may be obtained after joining\" — trimmed and non-empty."
}
},
"required": [
"name"
],
"additionalProperties": false,
"description": "Required certification: name plus optional issuer / url / free-text detail. Vocabulary mirrors the candidate-side certificateSchema."
}
},
"baseSalary": {
"type": "object",
"properties": {
"currency": {
"default": "JPY",
"description": "ISO 4217 currency code (exactly three uppercase letters). Defaults to \"JPY\".",
"type": "string",
"pattern": "^[A-Z]{3}$"
},
"min": {
"description": "Lower bound of the range as a non-negative integer; must be <= max when both are present.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"max": {
"description": "Upper bound of the range as a non-negative integer; must be >= min when both are present.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"unit": {
"default": "YEAR",
"description": "Salary period unit: \"YEAR\" (annual amounts, the default), \"MONTH\", or \"HOUR\".",
"type": "string",
"enum": [
"YEAR",
"MONTH",
"HOUR"
]
}
},
"required": [
"currency",
"unit"
],
"additionalProperties": false,
"description": "Salary range in a single ISO 4217 currency (non-negative integers, min <= max); the period is given by `unit` (annual by default)."
},
"skills": {
"description": "Skills required or desired for the role.",
"type": "array",
"items": {
"type": "string",
"description": "A required or desired skill."
}
},
"skillRequirements": {
"description": "Structured skill demands: one entry per skill with unique, order-preserving raw verbatim names, e.g. [{ name: \"TypeScript\", necessity: \"required\", minProficiency: { scale: \"mw7\", level: 4 } }]. An empty array is rejected — absent = undisclosed. Parallel to (never replacing) the flat `skills` list; a name may appear in both.",
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Raw verbatim skill string exactly as stated (trimmed only): one skill per entry, never split on commas or slashes, never normalized away — the same policy as candidate-side skills."
},
"necessity": {
"type": "string",
"enum": [
"required",
"preferred"
],
"description": "Necessity: \"required\" or \"preferred\". Mandatory — an unclassified skill mention belongs in the flat `skills` list, not here. Other values are rejected."
},
"minProficiency": {
"description": "Minimum demanded proficiency on the SAME mw7 scale candidate skills use. Absent = no level floor stated.",
"type": "object",
"properties": {
"scale": {
"type": "string",
"const": "mw7",
"description": "Proficiency scale identifier; only \"mw7\" (matchwire's neutral 7-level responsibility ladder) is defined."
},
"level": {
"type": "integer",
"minimum": 1,
"maximum": 7,
"description": "Integer 1-7 on the mw7 ladder: 1 follow, 2 assist, 3 apply, 4 enable, 5 advise, 6 initiate, 7 set strategy. Values outside 1-7 are rejected."
}
},
"required": [
"scale",
"level"
],
"additionalProperties": false
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Supplementary free text on the skill requirement, e.g. \"production operations experience is a plus\" — trimmed and non-empty."
}
},
"required": [
"name",
"necessity"
],
"additionalProperties": false,
"description": "Structured skill demand: raw verbatim skill name × required/preferred necessity, plus optional mw7 minimum proficiency and free-text detail. Shape-symmetric with the candidate-side skill claim."
}
},
"materialRequirements": {
"description": "Submission-material declarations: one entry per document with unique, order-preserving (kind, detail) pairs — one document is one stage x one necessity, so declaring the same document at two stages is contradictory and rejected. E.g. [{ kind: \"resume\", stage: \"match\", necessity: \"required\" }]. An empty array is rejected — absent = undisclosed.",
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"work_history",
"resume",
"portfolio",
"other"
],
"description": "Material kind: \"work_history\", \"resume\", \"portfolio\", or \"other\". Other values are rejected."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Free text naming or narrowing the material — REQUIRED when kind is \"other\" (it is the declaration's name), optional otherwise. Trimmed and non-empty."
},
"stage": {
"type": "string",
"enum": [
"match",
"scheduling",
"interview_passed"
],
"description": "Stage at which the material is requested — a selection milestone: \"match\", \"scheduling\", \"interview_passed\". Other values are rejected."
},
"necessity": {
"type": "string",
"enum": [
"required",
"optional"
],
"description": "Submission necessity: \"required\" or \"optional\". Other values are rejected."
}
},
"required": [
"kind",
"stage",
"necessity"
],
"additionalProperties": false,
"description": "One declared submission material: kind x requested stage x required/optional necessity, plus free-text detail (mandatory for kind \"other\")."
}
},
"laborConditions": {
"type": "object",
"properties": {
"placeOfWork": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Place of work immediately after hiring, as free-text detail; the machine-readable codes stay in jobLocations (ISO 3166-1/-2)."
},
"placeOfWorkChangeScope": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Scope of future changes to the place of work (a 2024-04 amendment disclosure item) — free text, trimmed and non-empty."
},
"workScopeChange": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Scope of future changes to the duties to be performed (a 2024-04 amendment disclosure item) — free text, trimmed and non-empty."
},
"contractPeriod": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"indefinite",
"fixed_term"
],
"description": "Labor-contract period type: \"indefinite\" or \"fixed_term\". Other values are rejected."
},
"endDate": {
"description": "End of a fixed-term contract as ISO 8601 with optional month/day, e.g. \"2027\", \"2027-03\", or \"2027-03-31\".",
"type": "string",
"pattern": "^[1-2]\\d{3}(-[0-1]\\d(-[0-3]\\d)?)?$"
},
"renewalCriteria": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Criteria for renewing a fixed-term contract (a 2024-04 amendment disclosure item) — free text, trimmed and non-empty."
}
},
"required": [
"type"
],
"additionalProperties": false,
"description": "Labor-contract period: indefinite, or fixed-term with its renewal criteria."
},
"probation": {
"type": "object",
"properties": {
"exists": {
"type": "boolean",
"description": "Whether a probation period exists."
},
"detail": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Length and conditions of the probation period — free text, trimmed and non-empty."
}
},
"required": [
"exists"
],
"additionalProperties": false,
"description": "Probation period: existence plus its length/conditions."
},
"workingHours": {
"type": "object",
"properties": {
"start": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "Start of the working day as zero-padded 24-hour \"HH:MM\", e.g. \"09:00\"."
},
"end": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "End of the working day as zero-padded 24-hour \"HH:MM\", e.g. \"18:00\"."
},
"breakMinutes": {
"description": "Break time in minutes as a non-negative integer.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"overtime": {
"type": "boolean",
"description": "Whether work beyond scheduled hours exists."
},
"holidays": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Days off, e.g. \"weekends, national holidays, and the year-end break\" — free text, trimmed and non-empty."
}
},
"required": [
"start",
"end",
"overtime"
],
"additionalProperties": false,
"description": "Working hours: start/end, break, overtime, and days off."
},
"socialInsurance": {
"description": "Applicable statutory insurance schemes. An EMPTY array is meaningful (none apply) and distinct from the field being absent (undisclosed).",
"type": "array",
"items": {
"type": "string",
"enum": [
"health_insurance",
"employees_pension",
"employment_insurance",
"workers_compensation"
],
"description": "Statutory insurance scheme: \"health_insurance\", \"employees_pension\", \"employment_insurance\", or \"workers_compensation\". Other values are rejected."
}
},
"smokingPolicy": {
"type": "object",
"properties": {
"measures": {
"type": "string",
"enum": [
"no_smoking_indoors",
"designated_smoking_area",
"smoking_allowed",
"other"
],
"description": "Passive-smoking prevention measure: \"no_smoking_indoors\", \"designated_smoking_area\", \"smoking_allowed\", or \"other\". Other values are rejected."
},
"note": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "Details of the passive-smoking prevention measures — free text, trimmed and non-empty."
}
},
"required": [
"measures"
],
"additionalProperties": false,
"description": "Passive-smoking prevention measures at the place of work."
}
},
"additionalProperties": false,
"description": "Statutory working-condition disclosure items (Japan's Employment Security Act Art. 5-3 and Enforcement Ordinance Art. 4-2, incl. the 2024-04 amendment). All fields optional here; publish-time requiredness lives in jobPostingPublishReadiness."
}
},
"required": [
"schemaVersion",
"title",
"description",
"hiringOrganization"
],
"additionalProperties": false,
"description": "The canonical published posting."
},
"score": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1,
"description": "Ranking score in (0, 1]: dense hits carry the best-chunk cosine similarity, company-name hits carry 1."
},
"snippet": {
"type": "string",
"minLength": 1,
"description": "Deterministic retrieval evidence: the strongest-matching chunk's text for a dense hit, the company name that matched for a company-name hit."
},
"matchedName": {
"description": "Present only when the hit was reached through the company's DECLARED known name (never its official name): that name, for a quiet attribution beside the official name, which stays primary.",
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"required": [
"jobId",
"job",
"score",
"snippet"
],
"additionalProperties": false,
"description": "One job-level free-word search hit: a company-name hit (the whole query IS the company's official or declared name, spelling and legal-form variance only — never a word merely contained in a name — first, newest first) or a dense hit over published-posting chunks."
},
"description": "Ranked published postings, best first."
}
},
"required": [
"hits"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}