{"openapi":"3.1.0","info":{"title":"Multi-ATS Jobs Feed (x402)","version":"1.0.0","description":"One maintained, normalized jobs data API that scrapes open job postings and listings across 10 applicant-tracking systems (Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Recruitee, Workable, BambooHR, Breezy, Personio) with company-domain auto-detection. Use it to list a company’s open roles, find remote software-engineering / sales / any jobs, detect whether a company is hiring, and pull recruiting, salary and requirements data. Pay per call in USDC on Base via x402 (HTTP 402) — no account, no API key. Adapters are drift-monitored and maintained so the feed does not rot.","contact":{"name":"Grey Ridge Signals","email":"contact@greyridgesignals.ai","url":"https://assetfactory-jobs-x402.sigrunner.workers.dev"}},"servers":[{"url":"https://assetfactory-jobs-x402.sigrunner.workers.dev"}],"paths":{"/jobs/preview":{"get":{"operationId":"previewJobs","summary":"Free sample of ALL THREE paid products for one company (no payment)","description":"Free teaser for ONE company so a buyer can verify data quality before paying: real normalized sample postings (first 3 rows), PLUS a capped real sample of /jobs/comp (comp_teaser — normalized compensation + disclosed-in-sample count) and /hiring/signal (hiring_teaser — the exact aggregate record), both computed from the same scan. Returns the exact paid upgrade calls for all three endpoints.","parameters":[{"name":"companies","in":"query","required":true,"description":"One company domain / slug / \"platform:token\".","schema":{"type":"string"},"example":"stripe.com"}],"responses":{"200":{"description":"Sample rows + upgrade pointer (free)."}}}},"/company/enrich/preview":{"get":{"operationId":"previewCompanyEnrich","summary":"Free keyless DNS/RDAP enrichment sample for one domain (no payment)","description":"Free teaser for the company-enrichment vector: runs the keyless DNS/RDAP layer (email provider, SaaS-from-DNS, domain age + registrar) on one domain so a buyer verifies real output before paying. The paid /company/enrich adds the site crawl, tech-stack fingerprint, contacts, office address, legal registration and the live multi-ATS hiring block.","parameters":[{"name":"companies","in":"query","required":true,"description":"One company domain.","schema":{"type":"string"},"example":"stripe.com"}],"responses":{"200":{"description":"Keyless DNS/RDAP sample + upgrade pointer (free)."}}}},"/email/verify/preview":{"get":{"operationId":"previewEmailVerify","summary":"Free email deliverability sample — first email graded in full (no payment)","description":"Free teaser for the email-verification vector: the first email is graded in full (real keyless MX/implicit-MX, SPF+DMARC, disposable/role/free flags, typo did-you-mean, A-F score); any additional emails return only {deliverable, grade}. The paid /email/verify returns the full per-email record for up to 100 addresses.","parameters":[{"name":"emails","in":"query","required":true,"description":"Comma-separated email addresses; the first is graded in full.","schema":{"type":"string"},"example":"jane@stripe.com,info@acme.com"}],"responses":{"200":{"description":"Full grade for the first email + redacted rest (free)."}}}},"/jobs/roster":{"get":{"operationId":"getRoster","summary":"The maintained Greenhouse board roster behind useRoster (free)","description":"Lists the maintained, live-pruned Greenhouse board roster (board count, total live roles, richest boards, freshness) that any paid endpoint pulls when useRoster=true — a broad live feed with no company list required.","responses":{"200":{"description":"Roster summary + usage (free)."}}}},"/jobs/search":{"get":{"operationId":"company_open_jobs","summary":"Scrape a company's open job postings and listings from its Greenhouse, Lever, Ashby, Workday or 6 more applicant-tracking system (ATS) job boards — recruiting jobs data, remote filter (paid, x402)","description":"Scrape the open job listings / job postings from a company’s careers board and applicant-tracking system across 10 ATS platforms — Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, BambooHR, Breezy and Personio. Find remote and onsite roles across software engineering, sales, marketing, data and every other function. Returns a normalized recruiting dataset of postings per company with title, location (parsed city/state/country/remote), salary, employment type, seniority, requirements/skills, and a ghost-job flag, plus optional server-side filters (skills, remote, seniority, salaryMin, country). Pay-per-call in USDC on Base via x402.","parameters":[{"name":"companies","in":"query","required":false,"description":"Comma-separated company domains / ATS slugs / \"platform:token\" selectors (max 25). Domains auto-detect the ATS + board token. e.g. \"stripe.com,lever:palantir,bunq.com\". Optional when useRoster=true.","schema":{"type":"string"}},{"name":"maxPerCompany","in":"query","required":false,"description":"Results per company (default 50, max 200).","schema":{"type":"integer","default":50,"maximum":200}},{"name":"includeDescription","in":"query","required":false,"description":"Include full job description text when true.","schema":{"type":"boolean","default":false}},{"name":"includeCompany","in":"query","required":false,"description":"Attach a per-job company_profile (resolved domain, email provider, SaaS/tech stack from DNS, domain age + registrar from RDAP). Resolved once per board (keyless, no per-job cost). Domain is provider-authoritative (careers URL) or homepage-verified, never a guess; null when unresolved.","schema":{"type":"boolean","default":false}},{"name":"ghostDays","in":"query","required":false,"description":"Age in days at which a still-open role is flagged ghost_candidate (a likely evergreen/unfilled \"ghost job\"). 0 uses the default (60).","schema":{"type":"integer","default":60,"minimum":0}},{"name":"excludeGhost","in":"query","required":false,"description":"Drop ghost_candidate rows for a clean feed.","schema":{"type":"boolean","default":false}},{"name":"ghostOnly","in":"query","required":false,"description":"Return ONLY ghost_candidate rows (ghost-job intel).","schema":{"type":"boolean","default":false}},{"name":"skills","in":"query","required":false,"description":"Comma-separated skills to require (matched against the structured requirements.skills[]; needs includeDescription=true). e.g. python,go,kubernetes.","schema":{"type":"string"}},{"name":"skillsMatch","in":"query","required":false,"description":"any = at least one skill present (default); all = every listed skill present.","schema":{"type":"string","enum":["any","all"],"default":"any"}},{"name":"remote","in":"query","required":false,"description":"true = remote-only; false = exclude remote. Derived from location_parsed.","schema":{"type":"boolean"}},{"name":"workplace","in":"query","required":false,"description":"Comma-separated work models to keep: remote, hybrid, onsite.","schema":{"type":"string"}},{"name":"employmentType","in":"query","required":false,"description":"Comma-separated canonical types: full_time, part_time, contract, temporary, internship.","schema":{"type":"string"}},{"name":"seniority","in":"query","required":false,"description":"Comma-separated exact levels: intern, junior, mid, senior, lead, staff, principal, director, executive.","schema":{"type":"string"}},{"name":"seniorityMin","in":"query","required":false,"description":"Ordinal floor — keep roles at this level or more senior (e.g. senior keeps senior/lead/staff/principal/director/executive).","schema":{"type":"string"}},{"name":"salaryMin","in":"query","required":false,"description":"Annualized minimum compensation floor. Rows with no disclosed comp are excluded (cannot prove they clear the floor).","schema":{"type":"integer","minimum":1}},{"name":"salaryCurrency","in":"query","required":false,"description":"Restrict the salaryMin gate to a currency code (e.g. USD, EUR, GBP).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Comma-separated ISO country codes to keep (matches the primary country or any in countries[]).","schema":{"type":"string"}},{"name":"useRoster","in":"query","required":false,"description":"Union the maintained, live-pruned Greenhouse board roster into the request so you get a broad live feed without supplying a company list. See GET /jobs/roster.","schema":{"type":"boolean","default":false}},{"name":"rosterLimit","in":"query","required":false,"description":"Richest-first roster boards to include (default 10, capped by the 25-company per-call ceiling).","schema":{"type":"integer","default":10,"maximum":25}},{"name":"rosterFilter","in":"query","required":false,"description":"Case-insensitive substring on company/token to narrow the roster (e.g. \"data\").","schema":{"type":"string"}}],"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2","maxAmountRequired":"4000","price":"$0.004","maxTimeoutSeconds":300},"responses":{"200":{"description":"Normalized jobs for the requested companies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsResult"}}}},"402":{"description":"Payment required — x402 v2 exact (USDC on Base). See accepts[] / payment-required header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}}}},"/hiring/signal":{"get":{"operationId":"company_hiring_signal","summary":"Detect whether a company is hiring — hiring intent and recruiting signal from its open jobs across 10 ATS boards (paid, x402)","description":"Detect if a company is hiring and how aggressively: a live hiring / buying-intent signal per company derived from its open job postings across 10 ATS job boards (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, BambooHR, Breezy, Personio): open-req count, intensity grade, department + location histograms, and newest-post recency. One aggregate record per company. Pay-per-call in USDC on Base via x402.","parameters":[{"name":"companies","in":"query","required":false,"description":"Comma-separated company domains / ATS slugs / \"platform:token\" selectors (max 25). Domains auto-detect the ATS + board token. e.g. \"stripe.com,lever:palantir,bunq.com\". Optional when useRoster=true.","schema":{"type":"string"}},{"name":"maxScan","in":"query","required":false,"description":"Postings scanned per company (default 500, max 1000).","schema":{"type":"integer","default":500,"maximum":1000}},{"name":"useRoster","in":"query","required":false,"description":"Union the maintained, live-pruned Greenhouse board roster into the request so you get a broad live feed without supplying a company list. See GET /jobs/roster.","schema":{"type":"boolean","default":false}},{"name":"rosterLimit","in":"query","required":false,"description":"Richest-first roster boards to include (default 10, capped by the 25-company per-call ceiling).","schema":{"type":"integer","default":10,"maximum":25}},{"name":"rosterFilter","in":"query","required":false,"description":"Case-insensitive substring on company/token to narrow the roster (e.g. \"data\").","schema":{"type":"string"}}],"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2","maxAmountRequired":"3000","price":"$0.003","maxTimeoutSeconds":300},"responses":{"200":{"description":"One hiring-signal record per requested company.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HiringSignalResult"}}}},"402":{"description":"Payment required — x402 v2 exact (USDC on Base).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}}}},"/jobs/comp":{"get":{"operationId":"company_job_salary_data","summary":"Company job salaries and compensation data — pay-transparency salary bands from open postings across 10 ATS boards (paid, x402)","description":"Normalized salary / compensation and pay-transparency data per open job posting for a company across 10 ATS job boards. Unifies structured ATS salary fields AND pay-transparency text in descriptions into {min,max,currency,period,annualized} per posting, plus a per-company disclosure rate and median band. Pay-per-call in USDC on Base via x402.","parameters":[{"name":"companies","in":"query","required":false,"description":"Comma-separated company domains / ATS slugs / \"platform:token\" selectors (max 25). Domains auto-detect the ATS + board token. e.g. \"stripe.com,lever:palantir,bunq.com\". Optional when useRoster=true.","schema":{"type":"string"}},{"name":"maxPerCompany","in":"query","required":false,"description":"Postings scanned per company (default 50, max 200).","schema":{"type":"integer","default":50,"maximum":200}},{"name":"disclosedOnly","in":"query","required":false,"description":"When true, drop postings with no disclosed comp.","schema":{"type":"boolean","default":false}},{"name":"useRoster","in":"query","required":false,"description":"Union the maintained, live-pruned Greenhouse board roster into the request so you get a broad live feed without supplying a company list. See GET /jobs/roster.","schema":{"type":"boolean","default":false}},{"name":"rosterLimit","in":"query","required":false,"description":"Richest-first roster boards to include (default 10, capped by the 25-company per-call ceiling).","schema":{"type":"integer","default":10,"maximum":25}},{"name":"rosterFilter","in":"query","required":false,"description":"Case-insensitive substring on company/token to narrow the roster (e.g. \"data\").","schema":{"type":"string"}}],"x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2","maxAmountRequired":"5000","price":"$0.005","maxTimeoutSeconds":300},"responses":{"200":{"description":"Normalized comp rows + per-company summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompResult"}}}},"402":{"description":"Payment required — x402 v2 exact (USDC on Base).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}}}},"/company/enrich":{"get":{"operationId":"company_enrich","summary":"Company enrichment — firmographics + DNS/RDAP + tech + live hiring (paid, x402)","description":"One enriched record per company domain: a bounded keyless site crawl (name, industry, description, social links, contacts), a tech-stack fingerprint, keyless DNS/RDAP depth (email provider, SaaS-from-DNS, domain age + registrar) and the live multi-ATS hiring block. Deduped by canonical domain.","parameters":[{"name":"companies","in":"query","required":true,"description":"Comma-separated company domains (up to 25).","schema":{"type":"string"}},{"name":"includeHiring","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"includeTech","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"includeDns","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"maxPages","in":"query","required":false,"schema":{"type":"integer","default":4,"maximum":8}}],"x-try-free":"/company/enrich/preview — real keyless DNS/RDAP sample, no payment","x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2","maxAmountRequired":"10000","price":"$0.01","maxTimeoutSeconds":300},"responses":{"200":{"description":"Enriched company records + batch stats.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyEnrichResult"}}}},"402":{"description":"Payment required — x402 v2 exact (USDC on Base).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}}}},"/email/verify":{"get":{"operationId":"verify_email","summary":"Email verification / deliverability grade (paid, x402)","description":"One deliverability record per email address: MX / implicit-MX (A) routing per RFC 5321, SPF + DMARC posture, disposable / role-account / free-provider flags against a loop-maintained throwaway-domain corpus, a derived \"did-you-mean\" typo suggestion, and an A-F score. Keyless (DNS-over-HTTPS); no SMTP mailbox probe (mailbox existence reported as unknown, never fabricated).","parameters":[{"name":"emails","in":"query","required":true,"description":"Comma-separated email addresses (up to 100).","schema":{"type":"string"}},{"name":"checkSenderPosture","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"x-try-free":"/email/verify/preview — first email graded in full, no payment","x-x402":{"scheme":"exact","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2","maxAmountRequired":"2000","price":"$0.002","maxTimeoutSeconds":300},"responses":{"200":{"description":"Email deliverability records + batch stats.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailResult"}}}},"402":{"description":"Payment required — x402 v2 exact (USDC on Base).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}}}}},"components":{"schemas":{"EmailResult":{"type":"object","description":"Result envelope for /email/verify. Every `required` property is always present; each record always carries email, deliverable, score and grade.","required":["count","stats","records","generated_at"],"properties":{"count":{"type":"integer"},"stats":{"type":"object","description":"requested / verified / deliverable / risky / undeliverable counts."},"records":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"domain":{"type":"string"},"valid_syntax":{"type":"boolean"},"mx_found":{"type":"boolean","description":"True if the domain has MX, or an A record (RFC 5321 implicit MX)."},"email_provider":{"type":"string","description":"Mail host derived from MX (Google Workspace, Microsoft 365, ...)."},"is_disposable":{"type":"boolean","description":"Domain is in the maintained throwaway-email corpus."},"is_role_account":{"type":"boolean","description":"Local part is a shared role mailbox (info@, support@, ...)."},"is_free_provider":{"type":"boolean"},"spf_present":{"type":"boolean"},"dmarc_present":{"type":"boolean"},"dmarc_policy":{"type":"string","enum":["none","quarantine","reject"]},"did_you_mean":{"type":"string","description":"Suggested correction when the domain is a near-miss of a known provider; null otherwise."},"deliverable":{"type":"string","enum":["deliverable","risky","undeliverable","unknown"]},"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D","F"]},"reasons":{"type":"array","items":{"type":"string"}}}}},"generated_at":{"type":"string","format":"date-time"}}},"CompanyRecord":{"type":"object","description":"One enriched company. canonical_domain, company_name and enrichment_status are always present (company_name/canonical_domain are null when a live crawl could not resolve them — never fabricated); enrichment_status grades whether the record carries real signal (ok) or came back thin.","required":["canonical_domain","company_name","enrichment_status"],"properties":{"canonical_domain":{"type":"string","nullable":true},"company_name":{"type":"string","nullable":true},"industry":{"type":"string"},"description":{"type":"string"},"social_links":{"type":"object"},"tech_stack":{"type":"array","items":{"type":"object"}},"email_provider":{"type":"string","description":"Derived from MX records (e.g. Google Workspace, Microsoft 365)."},"dns_saas":{"type":"array","items":{"type":"object"},"description":"SaaS vendors inferred from DNS TXT verification tokens + SPF includes."},"domain_age_years":{"type":"number"},"registrar":{"type":"string"},"office_address":{"type":"object","description":"Postal address (structured street/locality/region/postal_code/country from schema.org PostalAddress, else a formatted <address> line). Null when not stated."},"legal_registration":{"type":"object","description":"Statutory identifiers parsed keyword-anchored from legal/imprint pages: vat_number (+vat_country), company_number (+registry: UK Companies House, DE Handelsregister, FR SIREN). Null when not stated."},"hiring":{"type":"object","description":"Live multi-ATS hiring block (open-req count, ATS vendor, intensity)."},"enrichment_status":{"type":"string","enum":["ok","thin"]}}},"Job":{"type":"object","description":"A single normalized job row. id, title and url are guaranteed on every row across all 10 ATS adapters (the same id+title+url triad the freshness monitor grades for schema integrity); source_platform names the ATS it came from. Enrichment blocks (requirements, company_profile) are present only when their include flag is set.","required":["id","title","url","source_platform"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"company":{"type":"string"},"company_name":{"type":"string","nullable":true,"description":"Authoritative employer display name."},"company_profile":{"$ref":"#/components/schemas/CompanyProfile"},"location":{"type":"string"},"location_parsed":{"$ref":"#/components/schemas/LocationParsed"},"remote":{"type":"boolean"},"employment_type":{"type":"string","description":"Canonical set: internship | part_time | contract | temporary | full_time.","enum":["internship","part_time","contract","temporary","full_time"]},"employment_type_source":{"type":"string","enum":["adapter","title","description"]},"seniority":{"type":"string","enum":["executive","vp","director","principal","staff","lead","manager","senior","mid","junior","intern"]},"seniority_source":{"type":"string","enum":["title","description"]},"department":{"type":"string"},"url":{"type":"string","format":"uri"},"posted_at":{"type":"string","format":"date-time"},"age_days":{"type":"integer","nullable":true,"description":"Days since posted_at — the age signal behind ghost_candidate."},"days_open":{"type":"integer","nullable":true,"description":"Tenure estimate (on this stateless rail = posted_at age; the Apify actor tracks true continuity across runs)."},"ghost_candidate":{"type":"boolean","description":"True when a still-open role has aged past the ghostDays threshold (default 60) — a likely evergreen/unfilled \"ghost job\"."},"ghost_signals":{"type":"array","items":{"type":"string"},"description":"Which rules fired: posted_60d (board post age), stale_update_60d (board untouched). Empty when not a candidate."},"requirements":{"$ref":"#/components/schemas/Requirements"},"source_platform":{"type":"string"}}},"Requirements":{"type":"object","nullable":true,"description":"Structured hiring requirements parsed at call time from the job description (only when includeDescription=true; null otherwise — never guessed from the title). Skills come from a maintained, boundary-anchored taxonomy that we keep current as tool names and JD phrasing drift.","properties":{"skills":{"type":"array","description":"Matched skills with a category each.","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string","enum":["language","framework","cloud","data","devops","ml","security","tool"]}}}},"skill_names":{"type":"array","items":{"type":"string"},"description":"Flat list of matched skill names (dedup)."},"skills_count":{"type":"integer"},"categories":{"type":"array","items":{"type":"string"},"description":"Distinct skill categories present."},"years_experience_min":{"type":"integer","nullable":true,"description":"Lowest explicit years-of-experience floor stated in the JD; null when none stated."},"education_level":{"type":"string","enum":["associate","bachelors","masters","phd"],"nullable":true,"description":"Lowest required degree mentioned (the floor to apply); null when none stated."},"source":{"type":"string","enum":["description"]}}},"CompanyProfile":{"type":"object","nullable":true,"description":"Per-job company enrichment (only when includeCompany=true). Resolved once per board (keyless, no per-job cost). Closes the resold incumbent's per-job company-data axis with our own live DNS/RDAP capability instead of a rented third-party key.","properties":{"name":{"type":"string","nullable":true,"description":"Authoritative employer display name."},"domain":{"type":"string","nullable":true,"description":"Resolved primary domain; null when neither signal resolves (never a fabricated guess)."},"domain_source":{"type":"string","nullable":true,"enum":["careers_url","verified_homepage"],"description":"careers_url = the custom host on the board's own apply link (provider-authoritative). verified_homepage = a candidate whose live homepage names the company."},"email_provider":{"type":"string","nullable":true,"description":"Mail host from live MX records (e.g. Google Workspace, Microsoft 365)."},"dns_saas":{"type":"array","description":"SaaS/tech vendors detected from DNS TXT verification tokens.","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"}}}},"mx":{"type":"array","items":{"type":"string"},"description":"Raw MX records."},"domain_age_years":{"type":"number","nullable":true,"description":"Domain age in years from RDAP registration date."},"domain_created_at":{"type":"string","format":"date-time","nullable":true},"registrar":{"type":"string","nullable":true}}},"LocationParsed":{"type":"object","description":"Structured geography parsed at call time from the free-text board location.","properties":{"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"state_code":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true},"countries":{"type":"array","items":{"type":"string"},"nullable":true},"cities":{"type":"array","items":{"type":"string"},"nullable":true,"description":"Every distinct city when the posting enumerates multiple (e.g. \"Seattle, San Francisco, New York City\"); null for a single-city role."},"workplace":{"type":"string","enum":["remote","hybrid","onsite"],"nullable":true},"is_remote":{"type":"boolean"},"multi_location":{"type":"boolean"},"raw":{"type":"string","nullable":true}}},"JobsResult":{"type":"object","description":"Result envelope for /jobs/search. Every property listed in `required` is present on every successful response regardless of input or filter outcome (an empty board returns count:0 with the same shape, never a bare error).","required":["count","matched","scanned","ghost_candidates","filters_applied","jobs","resolutions","roster_boards_used","generated_at"],"properties":{"count":{"type":"integer","description":"Number of rows returned after filtering (== matched)."},"matched":{"type":"integer","description":"Rows that passed the server-side query filter."},"scanned":{"type":"integer","description":"Rows scanned across all boards before filtering."},"ghost_candidates":{"type":"integer","description":"Count of scanned rows flagged ghost_candidate (stale still-open role)."},"filters_applied":{"type":"object","description":"The normalized filter spec actually applied (echoes skills/remote/workplace/employmentType/seniority/salaryMin/country/ghost)."},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Job"}},"resolutions":{"type":"array","items":{"type":"object"},"description":"Per-input resolution record: which ATS+token each company entry resolved to, and the row count."},"roster_boards_used":{"type":"integer","description":"When useRoster=true, how many maintained-roster boards were scanned."},"generated_at":{"type":"string","format":"date-time"}}},"HiringSignalResult":{"type":"object","description":"Result envelope for /hiring/signal. Every `required` property is always present.","required":["count","signals","generated_at"],"properties":{"count":{"type":"integer"},"signals":{"type":"array","items":{"type":"object"},"description":"One record per input company: resolved ATS, open_reqs_count, hiring_intensity band, top departments/locations."},"generated_at":{"type":"string","format":"date-time"}}},"CompResult":{"type":"object","description":"Result envelope for /jobs/comp. Every `required` property is always present.","required":["count","disclosed_count","jobs","summary","resolutions","generated_at"],"properties":{"count":{"type":"integer"},"disclosed_count":{"type":"integer","description":"Of count, how many rows carry a normalized comp band."},"jobs":{"type":"array","items":{"type":"object"}},"summary":{"type":"array","items":{"type":"object"}},"resolutions":{"type":"array","items":{"type":"object"}},"generated_at":{"type":"string","format":"date-time"}}},"CompanyEnrichResult":{"type":"object","description":"Result envelope for /company/enrich. Every `required` property is always present; `records` holds one CompanyRecord per input company.","required":["count","stats","records","generated_at"],"properties":{"count":{"type":"integer"},"stats":{"type":"object","description":"Batch counters (requested / enriched / thin)."},"records":{"type":"array","items":{"$ref":"#/components/schemas/CompanyRecord"}},"generated_at":{"type":"string","format":"date-time"}}},"PaymentRequired":{"type":"object","properties":{"x402Version":{"type":"integer"},"accepts":{"type":"array","items":{"type":"object"}}}}}},"x-x402":{"version":2,"facilitator":"https://facilitator.payai.network","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xE601c3FeCbf9Fe9DacAC10b8b87167944cfe93A2"}}