{"openapi":"3.1.0","info":{"title":"JobAI Public Job Search","version":"1.0.0","description":"Anonymous read-only job search. Application submission requires the user to click in JobAI; agents must not submit."},"servers":[{"url":"https://jobai.hk"}],"security":[],"externalDocs":{"url":"https://jobai.hk/agents","description":"MCP and OAuth connection guide (廣東話 / English / 简体中文)"},"x-mcp":{"url":"https://jobai.hk/api/v1/mcp","transport":"streamable-http","oauth":{"resourceMetadata":"https://jobai.hk/.well-known/oauth-protected-resource","authorizationServerMetadata":"https://jobai.hk/.well-known/oauth-authorization-server","flow":"authorization_code","codeChallengeMethod":"S256"}},"paths":{"/api/v1/public/jobs":{"get":{"operationId":"searchPublicJobs","summary":"Search active public vacancies","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":60},"description":"Keywords in title, employer, industry or summary."},{"name":"source","in":"query","required":false,"schema":{"type":"string"},"description":"Source identifier returned by facets.source; unknown values are ignored."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["full_time","part_time","contract","internship"]},"description":"Job type."},{"name":"industry","in":"query","required":false,"schema":{"type":"string","maxLength":80},"description":"Exact industry from facets.industry."},{"name":"location","in":"query","required":false,"schema":{"type":"string","maxLength":40},"description":"Location contains this text."},{"name":"min_salary","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":500000,"default":0},"description":"Minimum advertised monthly salary in HKD; excludes hourly pay."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","enum":[1,3,7,30]},"description":"Posted within this many days; omit for all active jobs."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["newest","salary","relevance"]},"description":"Defaults to relevance with q, otherwise newest."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":1},"description":"Page number; 20 jobs per page."}],"responses":{"200":{"description":"Public jobs, filters and index freshness. An empty jobs array means no matching results.","content":{"application/json":{"schema":{"type":"object","required":["jobs","total","page","page_size","query","facets","meta"],"properties":{"jobs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"employer":{"type":"string"},"url":{"type":["string","null"]},"source":{"type":"string"},"source_label":{"type":"string"}}}},"total":{"type":"integer"},"page":{"type":"integer"},"page_size":{"type":"integer","const":20},"query":{"type":"object"},"facets":{"type":"object"},"meta":{"type":"object"}}}}}},"429":{"description":"Rate limit exceeded; wait before retrying (150 requests per IP / 5 minutes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/v1/public/insights":{"get":{"operationId":"publicJobsInsights","summary":"Public salary samples and posting counts (not views)","responses":{"200":{"description":"Salary sample statistics and posting rankings; small samples suppress medians.","content":{"application/json":{"schema":{"type":"object","required":["salary","rankings"],"properties":{"salary":{"type":"object"},"rankings":{"type":"object"}}}}}},"429":{"description":"Rate limit exceeded; wait before retrying (150 requests per IP / 5 minutes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}}}}