{"openapi":"3.1.0","info":{"title":"WFH.team public API","version":"1.0.0","description":"Public discovery and stateless analysis endpoints for WFH.team remote jobs, research datasets, remote companies, public talent profiles, safety checks, compensation evidence, and workspace planning. Private app and admin endpoints are intentionally omitted."},"servers":[{"url":"https://api.new.wfh.team"}],"paths":{"/api/public/research/":{"get":{"operationId":"listResearchDatasets","summary":"Search the WFH.team research catalog","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Search titles, descriptions, sources, and dimensions."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Dataset category filter."}],"responses":{"200":{"description":"Research catalog and latest releases.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/research/datasets/{slug}/":{"get":{"operationId":"getResearchDataset","summary":"Get a versioned research dataset, archive, downloads, embed URL, and citations","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Latest dataset release.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/employer-policies/":{"get":{"operationId":"listEmployerRemotePolicies","summary":"Search current employer remote-work policies and hiring trends","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"classification","in":"query","schema":{"type":"string","enum":["fully_remote","hybrid","remote_friendly","office_first","unknown"]}},{"name":"trend","in":"query","schema":{"type":"string","enum":["increasing","decreasing","stable","new"]}},{"name":"country","in":"query","schema":{"type":"string"}},{"name":"timezone","in":"query","schema":{"type":"string"}},{"name":"benefit","in":"query","schema":{"type":"string"}},{"name":"worldwide","in":"query","schema":{"type":"boolean"}},{"name":"salary","in":"query","schema":{"type":"boolean"}},{"name":"index","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated current policy observations with methodology.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/employer-policies/{slug}/":{"get":{"operationId":"getEmployerRemotePolicy","summary":"Get an employer policy dossier, history, sources, and reviewed changes","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Source-backed employer policy dossier.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/employer-policies/indexes/":{"get":{"operationId":"listEmployerRemotePolicyIndexes","summary":"Get current expanding, remote-first, policy-clarity, winner, and decliner indexes","responses":{"200":{"description":"Six current publishable employer policy indexes.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/employer-policies.csv":{"get":{"operationId":"downloadEmployerRemotePoliciesCsv","summary":"Download filtered current employer remote policy observations as CSV","responses":{"200":{"description":"Current employer policy CSV export.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/api/public/job-scam-radar/analyze/":{"post":{"operationId":"analyzeRemoteJobScamRisk","summary":"Analyze remote job evidence for explainable scam-risk signals","description":"Accepts one or more evidence fields. Raw messages, job descriptions, recruiter addresses, and URL query strings are not retained.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_url":{"type":"string","format":"uri"},"recruiter":{"type":"string"},"description":{"type":"string","maxLength":20000},"message":{"type":"string","maxLength":20000}}}}}},"responses":{"201":{"description":"Explainable risk score, individual signals, positive verification checks, privacy statement, official link, and share URL.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid or missing evidence."},"429":{"description":"Rate limit exceeded."}}}},"/api/public/job-scam-radar/checks/{public_id}/":{"get":{"operationId":"getSharedRemoteJobScamCheck","summary":"Get a privacy-safe shared verification result","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Shared verification without the submitted message or recruiter address.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/job-scam-radar/checks/{public_id}/report/":{"post":{"operationId":"reportRemoteJobScamEvidence","summary":"Add a privacy-safe categorized community report","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["categories"],"properties":{"categories":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["fake_check","money_request","identity_request","task_job","reshipping","impersonation","other"]}}}}}}},"responses":{"201":{"description":"Report recorded."},"409":{"description":"A report from this browser or network was already recorded for this check."}}}},"/api/public/job-scam-radar/indicators/":{"get":{"operationId":"listRemoteJobScamIndicators","summary":"Search verified and thresholded community-reported domains","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","enum":["verified","community_flagged"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Paginated public infrastructure ledger with explicit verification status.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/job-scam-radar/indicators.csv":{"get":{"operationId":"downloadRemoteJobScamIndicatorsCsv","summary":"Download the public scam-infrastructure ledger as CSV","responses":{"200":{"description":"Verified and thresholded public entries.","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/api/public/job-scam-radar/trends/":{"get":{"operationId":"getRemoteJobScamTrends","summary":"Get privacy-thresholded weekly scam-check trends","responses":{"200":{"description":"Thirteen weeks of aggregate risk levels and signals. Weeks below 10 checks and report counts below three are suppressed.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/compensation-explorer/":{"get":{"operationId":"exploreRemoteCompensation","summary":"Compare remote salary, eligibility, competition, and target-salary opportunity","description":"Analyzes active confirmed remote jobs and privacy-thresholded candidate expectations. Contractor and benefits-adjusted figures are labeled estimates with published assumptions.","parameters":[{"name":"role","in":"query","required":true,"schema":{"type":"string","maxLength":100}},{"name":"seniority","in":"query","schema":{"type":"string","enum":["entry","mid","senior","lead","executive"]}},{"name":"location","in":"query","schema":{"type":"string","maxLength":80}},{"name":"industry","in":"query","schema":{"type":"string","maxLength":80}},{"name":"employment_type","in":"query","schema":{"type":"string","enum":["full_time","part_time","contract","internship"]}},{"name":"timezone","in":"query","schema":{"type":"string","maxLength":40}},{"name":"target_salary","in":"query","schema":{"type":"integer","minimum":20000,"maximum":1000000}}],"responses":{"200":{"description":"Salary percentiles, candidate expectations, access constraints, opportunity counts, history, matching jobs, and methodology.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"A role is required."}}}},"/api/public/wfh-setup-planner/plan/":{"post":{"operationId":"buildPersonalizedWfhSetupPlan","summary":"Build a personalized ergonomic, equipment, and cost plan","description":"Stateless calculation using OSHA-informed fit checks, transparent planning estimates, entered cost assumptions, and the WFH.team Gear Lab catalog.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"location":{"type":"string"},"height_cm":{"type":"number","minimum":120,"maximum":220},"room_width_cm":{"type":"number","minimum":100,"maximum":1000},"room_depth_cm":{"type":"number","minimum":100,"maximum":1000},"work_style":{"type":"string","enum":["focus","meetings","creative","mobile","mixed"]},"existing_equipment":{"type":"array","items":{"type":"string"}},"budget_usd":{"type":"number","minimum":0},"electricity_rate_usd_kwh":{"type":"number","minimum":0},"internet_monthly_usd":{"type":"number","minimum":0},"coworking_day_rate_usd":{"type":"number","minimum":0},"coworking_days_per_week":{"type":"number","minimum":0,"maximum":7}}}}}},"responses":{"200":{"description":"Measurements, priorities, tiers, recurring costs, coworking comparison, products, reimbursement checklist, methodology, and sources.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/wfh-setup-planner/plan.pdf":{"post":{"operationId":"downloadPersonalizedWfhSetupPlan","summary":"Generate a printable personalized WFH setup plan","responses":{"200":{"description":"Printable PDF plan.","content":{"application/pdf":{"schema":{"type":"string","contentEncoding":"binary"}}}}}}},"/api/public/gear-lab/":{"get":{"operationId":"listWfhGearLabProducts","summary":"List the transparent WFH Gear Lab product catalog","responses":{"200":{"description":"Products, official links, checked prices, fit notes, and disclosure.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/meeting-cost-calculator/":{"post":{"operationId":"calculateRecurringMeetingCost","summary":"Calculate recurring meeting cost and async alternatives","description":"Stateless calculation of salary-derived labor cost, hidden time, annual cadence, savings scenarios, and purpose-specific async workflows.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"meeting_name":{"type":"string"},"purpose":{"type":"string","enum":["status_update","decision","brainstorm","planning","one_on_one","training","social","incident","interview","other"]},"frequency":{"type":"string","enum":["daily","weekly","biweekly","monthly","quarterly","annually","custom"]},"duration_minutes":{"type":"number","minimum":5,"maximum":480},"working_weeks_per_year":{"type":"number","minimum":1,"maximum":52},"prep_minutes":{"type":"number","minimum":0},"followup_minutes":{"type":"number","minimum":0},"context_switch_minutes":{"type":"number","minimum":0},"loaded_cost_multiplier":{"type":"number","minimum":1,"maximum":3},"attendee_groups":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"count":{"type":"integer","minimum":1},"annual_salary_usd":{"type":"number","minimum":0}}}}}}}}},"responses":{"200":{"description":"Normalized inputs, group cost breakdown, annual cost, four savings scenarios, async workflow, checklist, formula, and limitations.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/team-benchmarks/":{"get":{"operationId":"getRemoteTeamBenchmarkSchema","summary":"Get the anonymous team benchmark schema and privacy-safe pooled baseline","responses":{"200":{"description":"Questions, broad cohort attributes, privacy rules, pooled team benchmark, and compatible quarterly worker-survey evidence.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/team-benchmarks/create/":{"post":{"operationId":"createRemoteTeamBenchmark","summary":"Create an anonymous team benchmark cohort","description":"Creates a cohort without a company name, person name, or email and returns a one-time private report token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["industry","team_size","work_model","timezone_span","region"],"additionalProperties":false}}}},"responses":{"201":{"description":"Participation path, private report path, and one-time report token.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/public/team-benchmarks/{public_id}/":{"get":{"operationId":"getRemoteTeamBenchmark","summary":"Get a cohort's anonymous survey and threshold progress","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Survey questions and response threshold progress without team metadata or results."}}}},"/api/public/team-benchmarks/{public_id}/responses/":{"post":{"operationId":"submitRemoteTeamBenchmarkResponse","summary":"Submit one anonymous team response","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Anonymous response recorded."},"409":{"description":"A response from this browser or network was already recorded."}}}},"/api/public/team-benchmarks/{public_id}/report/":{"get":{"operationId":"getPrivateRemoteTeamBenchmarkReport","summary":"Get a privacy-thresholded private team report","description":"Requires the X-WFH-Report-Token header. Results remain null until 10 responses.","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-WFH-Report-Token","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Threshold progress or aggregate team results and pooled comparison."},"403":{"description":"Invalid private report token."}}}},"/api/public/team-benchmarks.csv":{"get":{"operationId":"downloadRemoteTeamBenchmarkCsv","summary":"Download privacy-safe pooled team benchmark dimensions","responses":{"200":{"description":"Current pooled dimension scores after the public sample threshold.","content":{"text/csv":{"schema":{"type":"string"}}}},"404":{"description":"Public sample threshold has not been reached."}}}},"/api/public/jobs/":{"get":{"operationId":"listPublicRemoteJobs","summary":"List public remote jobs","description":"Search public remote job listings by keyword, company, location, skill, seniority, salary visibility, page, and page size.","parameters":[{"name":"search","in":"query","schema":{"type":"string"},"description":"Keyword search across title, company, and job content."},{"name":"company","in":"query","schema":{"type":"string"},"description":"Company name filter."},{"name":"location","in":"query","schema":{"type":"string"},"description":"Country, region, timezone, or remote-location filter."},{"name":"skill","in":"query","schema":{"type":"string"},"description":"Skill or tool filter."},{"name":"seniority","in":"query","schema":{"type":"string"},"description":"Seniority filter."},{"name":"salary","in":"query","schema":{"type":"string"},"description":"Salary visibility or range filter."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Pagination page."},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":50},"description":"Results per page."}],"responses":{"200":{"description":"Paginated public remote job listings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPublicJobs"},"examples":{"remoteCustomerSuccess":{"value":{"count":1,"next":null,"previous":null,"results":[{"id":123,"title":"Customer Success Manager","company":"Example Remote Co","description_excerpt":"Support remote customers across onboarding, renewals, and product adoption.","remote_policy":"Remote","countries":["United States"],"timezones":["Americas"],"employment_types":["Full-time"],"seniority":"mid","skills":["Customer Success","SaaS","Communication"],"salary_min_usd":90000,"salary_max_usd":130000,"first_seen_at":"2026-05-01T12:00:00Z","last_seen_at":"2026-05-30T12:00:00Z","logo_url":"https://api.new.wfh.team/company-logos/remote-company/example.png"}]}}}}}}}}},"/api/public/jobs/{id}/":{"get":{"operationId":"getPublicRemoteJob","summary":"Get a public remote job","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Public remote job detail.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublicJob"},{"type":"object","properties":{"description":{"type":"string"}}}]}}}}}}},"/api/public/companies/":{"get":{"operationId":"listPublicRemoteCompanies","summary":"List public remote companies","description":"Browse public remote-company profiles.","responses":{"200":{"description":"Paginated company profiles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPublicCompanies"}}}}}}},"/api/public/companies/{slug}/":{"get":{"operationId":"getPublicRemoteCompany","summary":"Get a public remote company profile","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Public remote company profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCompany"}}}}}}},"/api/public/talent/":{"get":{"operationId":"listPublicTalent","summary":"List public candidate profiles","description":"Browse public candidate profiles when candidates have enabled public visibility.","responses":{"200":{"description":"Paginated public talent profiles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPublicTalent"}}}}}}},"/api/blog-posts/":{"get":{"operationId":"listBlogPosts","summary":"List published blog posts","responses":{"200":{"description":"Published WFH.team blog posts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}}}}}}}},"/api/newsletter-issues/":{"get":{"operationId":"listNewsletterIssues","summary":"List public newsletter issues","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"search","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated public newsletter issues.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}},"components":{"schemas":{"PaginatedPublicJobs":{"type":"object","properties":{"count":{"type":"integer"},"next":{"type":["string","null"]},"previous":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/PublicJob"}}},"required":["count","next","previous","results"]},"PublicJob":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"company":{"type":"string"},"description_excerpt":{"type":"string"},"remote_policy":{"type":"string"},"countries":{"type":"array","items":{"type":"string"}},"timezones":{"type":"array","items":{"type":"string"}},"employment_types":{"type":"array","items":{"type":"string"}},"seniority":{"type":"string"},"skills":{"type":"array","items":{"type":"string"}},"salary_min_usd":{"type":["integer","null"]},"salary_max_usd":{"type":["integer","null"]},"first_seen_at":{"type":"string","format":"date-time"},"last_seen_at":{"type":"string","format":"date-time"},"logo_url":{"type":"string"}}},"PaginatedPublicCompanies":{"type":"object","properties":{"count":{"type":"integer"},"next":{"type":["string","null"]},"previous":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/PublicCompany"}}}},"PublicCompany":{"type":"object","additionalProperties":true,"properties":{"slug":{"type":"string"},"name":{"type":"string"},"website":{"type":"string"},"description":{"type":"string"},"logo_url":{"type":"string"}}},"PaginatedPublicTalent":{"type":"object","properties":{"count":{"type":"integer"},"next":{"type":["string","null"]},"previous":{"type":["string","null"]},"results":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"BlogPost":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"publishedAt":{"type":"string","format":"date"},"readTime":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"hero":{"type":"string"},"sections":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}