{"openapi":"3.1.0","info":{"title":"Panta public data API","version":"1.1.0","description":"Swiss job and employer discovery, plus transient CV text review. Market endpoints are read-only; the CV checker stores no report or document. Anonymous access supported. Preserve source evidence. Coverage is not exhaustive. No personal workspace access.","termsOfService":"https://withpanta.com/terms/"},"servers":[{"url":"https://withpanta.com/api/v1"}],"security":[{},{"bearerAuth":[]}],"externalDocs":{"url":"https://withpanta.com/docs/"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Optional Panta API key from Settings → API keys in the app. Never use a personal session token."}}},"paths":{"/jobs":{"get":{"operationId":"search_jobs","summary":"Search Swiss jobs","description":"Search indexed Swiss-eligible jobs from enabled sources. Inspect source_freshness and location_class; current means refreshable, not guaranteed open. No exhaustive market coverage.","parameters":[{"name":"q","in":"query","required":false,"description":"Keywords. All searchable terms must match; searches titles and descriptions. At most 12 terms are interpreted. Maximum 200 UTF-8 bytes.","schema":{"description":"Keywords. All searchable terms must match; searches titles and descriptions. At most 12 terms are interpreted. Maximum 200 UTF-8 bytes.","type":"string","maxLength":200}},{"name":"company_id","in":"query","required":false,"description":"Exact canonical employer ID returned by company search; preferred for employer-specific queries.","schema":{"description":"Exact canonical employer ID returned by company search; preferred for employer-specific queries.","type":"string","minLength":1,"maxLength":200}},{"name":"category","in":"query","required":false,"description":"Reviewed title-based role family, version 2026-10-27.2. Not an employer-sector filter.","schema":{"description":"Reviewed title-based role family, version 2026-10-27.2. Not an employer-sector filter.","type":"string","enum":["ai","data","pharma"]}},{"name":"company","in":"query","required":false,"description":"Employer name contains this text; not a company ID. Maximum 48 UTF-8 bytes.","schema":{"description":"Employer name contains this text; not a company ID. Maximum 48 UTF-8 bytes.","type":"string","minLength":1,"maxLength":48}},{"name":"canton","in":"query","required":false,"description":"Swiss canton code.","schema":{"description":"Swiss canton code.","type":"string","enum":["AG","AI","AR","BE","BL","BS","FR","GE","GL","GR","JU","LU","NE","NW","OW","SG","SH","SO","SZ","TG","TI","UR","VD","VS","ZG","ZH"]}},{"name":"geography","in":"query","required":false,"description":"Work arrangement; does not imply Swiss remote eligibility.","schema":{"description":"Work arrangement; does not imply Swiss remote eligibility.","type":"string","enum":["physical","hybrid","remote"]}},{"name":"location_class","in":"query","required":false,"description":"Location evidence classification. Swiss search excludes ambiguous and non-Swiss results.","schema":{"description":"Location evidence classification. Swiss search excludes ambiguous and non-Swiss results.","type":"string","enum":["physical_ch","remote_ch_eligible","multi_country_ch"]}},{"name":"sector","in":"query","required":false,"description":"Employer sector contains this text. Maximum 40 UTF-8 bytes.","schema":{"description":"Employer sector contains this text. Maximum 40 UTF-8 bytes.","type":"string","minLength":1,"maxLength":40}},{"name":"employment_type","in":"query","required":false,"description":"Employment type contains this text, e.g. full-time. Maximum 48 UTF-8 bytes.","schema":{"description":"Employment type contains this text, e.g. full-time. Maximum 48 UTF-8 bytes.","type":"string","minLength":1,"maxLength":48}},{"name":"sort","in":"query","required":false,"description":"Default: relevance with keywords, otherwise newest.","schema":{"description":"Default: relevance with keywords, otherwise newest.","type":"string","enum":["relevance","newest","recently_seen"]}},{"name":"limit","in":"query","required":false,"description":"Results per page (1–50).","schema":{"default":20,"description":"Results per page (1–50).","type":"integer","minimum":1,"maximum":50}},{"name":"offset","in":"query","required":false,"description":"Use next_offset from the previous response; maximum 5000.","schema":{"default":0,"description":"Use next_offset from the previous response; maximum 5000.","type":"integer","minimum":0,"maximum":5000}}],"responses":{"200":{"description":"Success. Missing source values are null. Search count is null; use next_offset.","headers":{"X-RateLimit-Limit":{"description":"30 anonymous or 120 keyed requests per minute per Cloudflare location. Keyed traffic also shares an IP gate of 120/minute.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"null"},"page_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"has_more":{"type":"boolean"},"next_offset":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"snapshot_at":{"type":"string"},"query":{"type":"string"},"interpreted_terms":{"type":"array","items":{"type":"string"}},"query_truncated":{"type":"boolean"},"sort":{"type":"string"},"jobs":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"company_id":{"type":["string","null"]},"company":{"type":["string","null"]},"domain":{"type":["string","null"]},"title":{"type":["string","null"]},"location_text":{"type":["string","null"]},"location_class":{"type":["string","null"]},"market_scope":{"type":["string","null"]},"geography_class":{"type":["string","null"]},"city":{"type":["string","null"]},"canton":{"type":["string","null"]},"country_code":{"type":["string","null"]},"workplace_type":{"type":["string","null"]},"employment_type":{"type":["string","null"]},"department":{"type":["string","null"]},"language":{"type":["string","null"]},"salary_text":{"type":["string","null"]},"job_url":{"type":["string","null"]},"published_at":{"type":["string","null"]},"first_seen_at":{"type":["string","null"]},"last_seen_at":{"type":["string","null"]},"location_confidence":{"type":["number","null"]},"source_id":{"type":["string","null"]},"source_url":{"type":["string","null"]},"apply_url":{"type":["string","null"]},"source_kind":{"type":["string","null"]},"observed_open_at":{"type":["string","null"]},"verified_open_at":{"type":["string","null"]},"source_tier":{"type":["string","null"]},"refreshability":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"]},"source_status":{"type":["string","null"]},"source_freshness":{"type":["string","null"]},"source_enabled":{"type":"boolean"}},"required":["id","company_id","company","domain","title","location_text","location_class","market_scope","geography_class","city","canton","country_code","workplace_type","employment_type","department","language","salary_text","job_url","published_at","first_seen_at","last_seen_at","location_confidence","source_id","source_url","apply_url","source_kind","observed_open_at","verified_open_at","source_tier","refreshability","source_last_synced_at","source_status","source_freshness","source_enabled"],"additionalProperties":false}}},"required":["count","page_count","limit","offset","has_more","next_offset","snapshot_at","query","interpreted_terms","query_truncated","sort","jobs"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/jobs/{id}":{"get":{"operationId":"get_job","summary":"Get a job and its sources","description":"Read a canonical job, source listings and country evidence by ID. Past listings may be returned. Verify employer availability before recommending a position.","parameters":[{"name":"id","in":"path","required":true,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path.","schema":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path."}}],"responses":{"200":{"description":"Success. Missing source values are null. Search count is null; use next_offset.","headers":{"X-RateLimit-Limit":{"description":"30 anonymous or 120 keyed requests per minute per Cloudflare location. Keyed traffic also shares an IP gate of 120/minute.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object","properties":{"id":{"type":["string","null"]},"company_id":{"type":["string","null"]},"company":{"type":["string","null"]},"domain":{"type":["string","null"]},"title":{"type":["string","null"]},"location_text":{"type":["string","null"]},"location_class":{"type":["string","null"]},"market_scope":{"type":["string","null"]},"geography_class":{"type":["string","null"]},"city":{"type":["string","null"]},"canton":{"type":["string","null"]},"country_code":{"type":["string","null"]},"workplace_type":{"type":["string","null"]},"employment_type":{"type":["string","null"]},"department":{"type":["string","null"]},"language":{"type":["string","null"]},"salary_text":{"type":["string","null"]},"job_url":{"type":["string","null"]},"published_at":{"type":["string","null"]},"first_seen_at":{"type":["string","null"]},"last_seen_at":{"type":["string","null"]},"location_confidence":{"type":["number","null"]},"description":{"type":["string","null"]},"active":{"type":"boolean"}},"required":["id","company_id","company","domain","title","location_text","location_class","market_scope","geography_class","city","canton","country_code","workplace_type","employment_type","department","language","salary_text","job_url","published_at","first_seen_at","last_seen_at","location_confidence","description","active"],"additionalProperties":false},"postings":{"type":"array","items":{"type":"object","properties":{"source_id":{"type":["string","null"]},"source_url":{"type":["string","null"]},"apply_url":{"type":["string","null"]},"source_kind":{"type":["string","null"]},"observed_open_at":{"type":["string","null"]},"verified_open_at":{"type":["string","null"]},"source_tier":{"type":["string","null"]},"refreshability":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"]},"source_status":{"type":["string","null"]},"source_freshness":{"type":["string","null"]},"source_enabled":{"type":"boolean"},"id":{"type":["string","null"]},"active":{"type":"boolean"},"first_seen_at":{"type":["string","null"]},"last_seen_at":{"type":["string","null"]}},"required":["source_id","source_url","apply_url","source_kind","observed_open_at","verified_open_at","source_tier","refreshability","source_last_synced_at","source_status","source_freshness","source_enabled","id","active","first_seen_at","last_seen_at"],"additionalProperties":false}},"countries":{"type":"array","items":{"type":"object","properties":{"country_code":{"type":["string","null"]},"eligibility_type":{"type":["string","null"]},"evidence":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"confidence":{"type":["number","null"]}},"required":["country_code","eligibility_type","evidence","updated_at","confidence"],"additionalProperties":false}}},"required":["job","postings","countries"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/companies":{"get":{"operationId":"search_companies","summary":"Find employers","description":"Search indexed employers. Headquarters and active_jobs do not prove Swiss vacancies. Use search_jobs to find Swiss positions.","parameters":[{"name":"q","in":"query","required":false,"description":"Employer keywords. Maximum 120 UTF-8 bytes.","schema":{"description":"Employer keywords. Maximum 120 UTF-8 bytes.","type":"string","maxLength":120}},{"name":"country","in":"query","required":false,"description":"Headquarters country code, e.g. CH. This is not job location.","schema":{"description":"Headquarters country code, e.g. CH. This is not job location.","type":"string","pattern":"^[A-Z]{2}$"}},{"name":"sector","in":"query","required":false,"description":"Sector contains this text. Maximum 40 UTF-8 bytes.","schema":{"description":"Sector contains this text. Maximum 40 UTF-8 bytes.","type":"string","minLength":1,"maxLength":40}},{"name":"swiss_jobs","in":"query","required":false,"description":"When true, only employers with a recorded domain and active Swiss-eligible jobs from enabled sources. Does not imply source freshness.","schema":{"description":"When true, only employers with a recorded domain and active Swiss-eligible jobs from enabled sources. Does not imply source freshness.","type":"string","enum":["true","false"]}},{"name":"has_jobs","in":"query","required":false,"description":"Filter on canonical active job count; not restricted to Swiss or fresh sources.","schema":{"description":"Filter on canonical active job count; not restricted to Swiss or fresh sources.","type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"Results per page (1–50).","schema":{"default":20,"description":"Results per page (1–50).","type":"integer","minimum":1,"maximum":50}},{"name":"offset","in":"query","required":false,"description":"Use next_offset from the previous response; maximum 5000.","schema":{"default":0,"description":"Use next_offset from the previous response; maximum 5000.","type":"integer","minimum":0,"maximum":5000}}],"responses":{"200":{"description":"Success. Missing source values are null. Search count is null; use next_offset.","headers":{"X-RateLimit-Limit":{"description":"30 anonymous or 120 keyed requests per minute per Cloudflare location. Keyed traffic also shares an IP gate of 120/minute.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"null"},"page_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"has_more":{"type":"boolean"},"next_offset":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"snapshot_at":{"type":"string"},"query":{"type":"string"},"companies":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"canonical_name":{"type":["string","null"]},"domain":{"type":["string","null"]},"headquarters_city":{"type":["string","null"]},"headquarters_country_code":{"type":["string","null"]},"careers_url":{"type":["string","null"]},"company_type":{"type":["string","null"]},"description":{"type":["string","null"]},"description_source_url":{"type":["string","null"]},"description_fetched_at":{"type":["string","null"]},"sectors":{"type":"array","items":{"type":"string"}},"active_jobs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","canonical_name","domain","headquarters_city","headquarters_country_code","careers_url","company_type","description","description_source_url","description_fetched_at","sectors","active_jobs"],"additionalProperties":false}}},"required":["count","page_count","limit","offset","has_more","next_offset","snapshot_at","query","companies"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/companies/{id}/jobs":{"get":{"operationId":"get_company_jobs","summary":"Get an employer’s active and past Swiss jobs","description":"Exact employer identity, active Swiss jobs or past jobs, source health and last checked dates. Past listings are not a complete hiring history.","parameters":[{"name":"id","in":"path","required":true,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path.","schema":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path."}},{"name":"status","in":"query","required":false,"description":"Active Swiss jobs from enabled sources, or separate inactive Swiss jobs; not a complete hiring history.","schema":{"default":"active","description":"Active Swiss jobs from enabled sources, or separate inactive Swiss jobs; not a complete hiring history.","type":"string","enum":["active","past"]}},{"name":"limit","in":"query","required":false,"description":"Results per page (1–50).","schema":{"default":20,"description":"Results per page (1–50).","type":"integer","minimum":1,"maximum":50}},{"name":"offset","in":"query","required":false,"description":"Use next_offset from the previous response; maximum 5000.","schema":{"default":0,"description":"Use next_offset from the previous response; maximum 5000.","type":"integer","minimum":0,"maximum":5000}}],"responses":{"200":{"description":"Success. Missing source values are null. Search count is null; use next_offset.","headers":{"X-RateLimit-Limit":{"description":"30 anonymous or 120 keyed requests per minute per Cloudflare location. Keyed traffic also shares an IP gate of 120/minute.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"null"},"page_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"has_more":{"type":"boolean"},"next_offset":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"snapshot_at":{"type":"string"},"company":{"type":"object","properties":{"id":{"type":["string","null"]},"canonical_name":{"type":["string","null"]},"domain":{"type":["string","null"]},"headquarters_city":{"type":["string","null"]},"headquarters_country_code":{"type":["string","null"]},"careers_url":{"type":["string","null"]},"company_type":{"type":["string","null"]},"description":{"type":["string","null"]},"description_source_url":{"type":["string","null"]},"description_fetched_at":{"type":["string","null"]},"sectors":{"type":"array","items":{"type":"string"}}},"required":["id","canonical_name","domain","headquarters_city","headquarters_country_code","careers_url","company_type","description","description_source_url","description_fetched_at","sectors"],"additionalProperties":false},"status":{"type":"string","enum":["active","past"]},"jobs":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"company_id":{"type":["string","null"]},"company":{"type":["string","null"]},"domain":{"type":["string","null"]},"title":{"type":["string","null"]},"location_text":{"type":["string","null"]},"location_class":{"type":["string","null"]},"market_scope":{"type":["string","null"]},"geography_class":{"type":["string","null"]},"city":{"type":["string","null"]},"canton":{"type":["string","null"]},"country_code":{"type":["string","null"]},"workplace_type":{"type":["string","null"]},"employment_type":{"type":["string","null"]},"department":{"type":["string","null"]},"language":{"type":["string","null"]},"salary_text":{"type":["string","null"]},"job_url":{"type":["string","null"]},"published_at":{"type":["string","null"]},"first_seen_at":{"type":["string","null"]},"last_seen_at":{"type":["string","null"]},"location_confidence":{"type":["number","null"]},"source_id":{"type":["string","null"]},"source_url":{"type":["string","null"]},"apply_url":{"type":["string","null"]},"source_kind":{"type":["string","null"]},"observed_open_at":{"type":["string","null"]},"verified_open_at":{"type":["string","null"]},"source_tier":{"type":["string","null"]},"refreshability":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"]},"source_status":{"type":["string","null"]},"source_freshness":{"type":["string","null"]},"source_enabled":{"type":"boolean"},"active":{"type":"boolean"}},"required":["id","company_id","company","domain","title","location_text","location_class","market_scope","geography_class","city","canton","country_code","workplace_type","employment_type","department","language","salary_text","job_url","published_at","first_seen_at","last_seen_at","location_confidence","source_id","source_url","apply_url","source_kind","observed_open_at","verified_open_at","source_tier","refreshability","source_last_synced_at","source_status","source_freshness","source_enabled","active"],"additionalProperties":false}},"sources":{"type":"array","items":{"type":"object","properties":{"source_id":{"type":["string","null"]},"source_kind":{"type":["string","null"]},"source_tier":{"type":["string","null"]},"refreshability":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"]},"source_status":{"type":["string","null"]},"source_freshness":{"type":["string","null"]},"source_enabled":{"type":"boolean"}},"required":["source_id","source_kind","source_tier","refreshability","source_last_synced_at","source_status","source_freshness","source_enabled"],"additionalProperties":false}}},"required":["count","page_count","limit","offset","has_more","next_offset","snapshot_at","company","status","jobs","sources"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/companies/{id}":{"get":{"operationId":"get_company","summary":"Get an employer","description":"Read a public employer profile by ID with official domain and description provenance.","parameters":[{"name":"id","in":"path","required":true,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path.","schema":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque ID returned by search. URL-encode when used in an HTTP path."}}],"responses":{"200":{"description":"Success. Missing source values are null. Search count is null; use next_offset.","headers":{"X-RateLimit-Limit":{"description":"30 anonymous or 120 keyed requests per minute per Cloudflare location. Keyed traffic also shares an IP gate of 120/minute.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":["string","null"]},"canonical_name":{"type":["string","null"]},"domain":{"type":["string","null"]},"headquarters_city":{"type":["string","null"]},"headquarters_country_code":{"type":["string","null"]},"careers_url":{"type":["string","null"]},"company_type":{"type":["string","null"]},"description":{"type":["string","null"]},"description_source_url":{"type":["string","null"]},"description_fetched_at":{"type":["string","null"]},"sectors":{"type":"array","items":{"type":"string"}}},"required":["id","canonical_name","domain","headquarters_city","headquarters_country_code","careers_url","company_type","description","description_source_url","description_fetched_at","sectors"],"additionalProperties":false}},"required":["company"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/cv-check":{"post":{"operationId":"check_cv","summary":"Review CV readability and job-advert wording","security":[],"description":"Deterministic text evidence review, not an employer ATS simulation, compatibility score or hiring prediction. Anonymous, five requests per minute per IP per Cloudflare location; API keys do not raise this limit. No persistence. Pasted text can also be reviewed locally in the browser at /tools/ats-checker/. PDF/DOCX conversion uses Cloudflare Workers AI on explicit submission. Input and downloaded reports may contain private candidate data; never place them in analytics or public logs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cv_text":{"type":"string","minLength":25,"maxLength":50000},"job_text":{"default":"","type":"string","maxLength":30000},"mode":{"default":"readability","type":"string","enum":["readability","job_match"]},"vendor":{"default":"general","type":"string","enum":["general","greenhouse","workday","successfactors"]}},"required":["cv_text","job_text","mode","vendor"],"additionalProperties":false}},"multipart/form-data":{"schema":{"type":"object","additionalProperties":false,"required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"PDF, DOCX or UTF-8 TXT; at most 2097152 bytes. Send file or cv_text, never both."},"job_text":{"type":"string","maxLength":30000},"mode":{"type":"string","enum":["readability","job_match"],"default":"readability"},"vendor":{"type":"string","enum":["general","greenhouse","workday","successfactors"],"default":"general"}}}}}},"responses":{"200":{"description":"Private versioned review. Contains extracted CV text and evidence quotes; no account or server-side record is created.","content":{"application/json":{"schema":{"type":"object","properties":{"schema_version":{"type":"string","const":"1.2"},"method":{"type":"string","const":"deterministic_text_review"},"mode":{"type":"string","enum":["readability","job_match"]},"vendor":{"type":"string","enum":["general","greenhouse","workday","successfactors"]},"extracted_text":{"type":"string"},"input":{"type":"object","properties":{"source":{"type":"string","enum":["text","txt","pdf","docx"]},"character_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"line_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["source","character_count","line_count"],"additionalProperties":false},"parsing":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["email","phone","link"]},"value":{"type":"string"},"line":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["kind","value","line"],"additionalProperties":false}},"dates":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"quote":{"type":"string"}},"required":["line","quote"],"additionalProperties":false}}},"required":["contacts","dates"],"additionalProperties":false},"sections":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"found":{"type":"boolean"}},"required":["name","found"],"additionalProperties":false}},"findings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"level":{"type":"string","enum":["review","information"]},"title":{"type":"string"},"detail":{"type":"string"}},"required":["code","level","title","detail"],"additionalProperties":false}},"requirements":{"type":"array","items":{"type":"object","properties":{"statement":{"type":"string"},"line":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"priority":{"type":"string","enum":["required","preferred","mixed","unspecified"]},"terms":{"type":"array","items":{"type":"string"}},"unmatched_terms":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["wording_found","partial_wording","review_needed"]},"evidence":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"quote":{"type":"string"},"matched_terms":{"type":"array","items":{"type":"string"}}},"required":["line","quote","matched_terms"],"additionalProperties":false}},"interpretation":{"type":"string"}},"required":["statement","line","priority","terms","unmatched_terms","status","evidence","interpretation"],"additionalProperties":false}},"limitations":{"type":"array","items":{"type":"string"}},"vendor_guidance":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"detail":{"type":"string"},"source_url":{"type":"string","format":"uri"}},"required":["title","detail","source_url"],"additionalProperties":false}}},"required":["schema_version","method","mode","vendor","extracted_text","input","parsing","sections","findings","requirements","limitations","vendor_guidance"],"additionalProperties":false}}}},"400":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"405":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Request failed. 429 responses include Retry-After: 60. A 503 is not an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}}}}