# OnlyRemoteJobs > OnlyRemoteJobs is a job board for remote and work-from-home roles. Listings are aggregated from public job sources, normalised, and classified and filtered by role, seniority, region, contract type, and salary. ## Primary entry points - [Home — Remote jobs feed](https://reativa.dev/): Browse all remote jobs hiring now. Filters: role, seniority, region (LatAm, North America, Europe, worldwide), contract (full-time, part-time, contract, internship), and minimum USD salary. - [Remote jobs directory](https://reativa.dev/remote-jobs): Browse canonical SEO landing pages by role, country, category, employment type, and worldwide availability. - [Remote jobs by role](https://reativa.dev/remote-jobs/roles): Browse count-positive curated roles. - [Remote jobs by country](https://reativa.dev/remote-jobs/countries): Browse count-positive country landings. - [Remote jobs by experience level](https://reativa.dev/remote-jobs/experience): Browse entry-level, junior, mid-level, senior, and lead remote landings. - [Career resources](https://reativa.dev/resources): Guides on finding remote work, remote resumes, cover letters, and remote interview questions. - [About OnlyRemoteJobs](https://reativa.dev/about): What the board is, where listings come from, how it is funded, and how to verify it. - [Post a job](https://reativa.dev/post-a-job): How employers get a remote role listed and corrected. - [Subscribe](https://reativa.dev/subscribe): Paid plan unlocks the full job feed. - [Privacy policy](https://reativa.dev/policy): Personal-data, tracking, storage, provider, and privacy-rights disclosures. - [Terms of service](https://reativa.dev/terms): Account, subscription, billing, acceptable-use, and job-listing terms. ## URL patterns - `/` — Remote jobs index. Query params are interactive feed state, not substitutes for canonical SEO landings. - `/remote-jobs` — Canonical landing directory hub. - All `/remote-jobs` landing feeds are remote-only: every route locks `locationType=remote` before applying its role, country, category, or employment filter. - `/remote-jobs/worldwide` — all jobs explicitly classified as remote. - `/remote-jobs/{employment-type}` — Canonical employment landing, including `full-time`, `part-time`, `contract`, and `internship`. - `/remote-jobs/countries/{country}` — Canonical country landing. Country aliases normalize to an ISO-2 identity; for example, Brazil and Brasil both resolve as `BR`. - `/remote-jobs/roles/{role}` — Canonical curated role landing. - `/remote-jobs/categories/{category}` — Canonical editorial category landing. - `/remote-jobs/categories/{category}/{role}` — Canonical role within an editorial category. - `/remote-jobs/experience/{level}` — Canonical seniority landing: `entry-level`, `junior`, `mid-level`, `senior`, `lead`. The path segment is also the feed's `seniority` filter value. - `/resources` — Career resource directory. `/resources/{guide}` — one long-form guide per canonical slug. - `/about`, `/post-a-job` — Company pages. Public and classified as `career-resource`. - `/jobs/{id}` — Individual remote job detail. Schema.org `JobPosting` JSON-LD attached. - `/policy` — Privacy policy. Public and classified as `legal`. - `/terms` — Terms of service. Public and classified as `legal`. ## Canonicalization and pagination - Flat keyword aliases such as `/full-time-remote-jobs` return a bodyless HTTP 301 to their immutable `/remote-jobs/...` canonical URL; aliases never render duplicate HTML. - Exact legacy query-only role or employment links redirect only when the complete query maps to one canonical definition. Combined interactive filters remain on the feed. - Landing page 1 has no `page` query in its canonical URL. Page 2 and later use `?page=N`, self-canonicalize with that query, and expose `rel="prev"` and `rel="next"` links where adjacent pages exist. - Explicit `?page=1` permanently redirects to the same URL without `page`. Malformed or out-of-range page values return HTTP 404 instead of rendering duplicate page-one content or an unbounded previous-page chain. - Known zero-result landings return HTTP 200 with `noindex, follow`, remain usable by people and agents, and are excluded from every sitemap and count-positive directory. ## Structured data Every public page ships JSON-LD: - Home: `WebSite` + `SearchAction` + `ItemList` of current jobs. - SEO jobs landing: `CollectionPage` containing the rendered `ItemList`, plus a separate `BreadcrumbList`. - Job detail: `JobPosting` (title, hiringOrganization, datePosted, employmentType, jobLocationType, baseSalary). - Legal pages: `Organization` + `WebSite` + `BreadcrumbList`. - Career resource pages: `Article` + `FAQPage` + `BreadcrumbList`. Every `

` is phrased as the question it answers and is published as a `Question`/`Answer` pair anchored to that heading's fragment, so an extracted answer and the visible text are the same string at the same URL. - Site footer: one `ItemList` of `SiteNavigationElement` entries describing every navigable destination that is currently published. ## Selector conventions Every page implements the AI-friendly page contract — stable, machine-readable selectors for agents: - `
` carries `data-page` (stable route identity, e.g. `/jobs/{id}`) and `data-page-type` (taxonomy, e.g. `jobs-index`, `job-detail`, `seo-jobs-landing`, `subscribe-landing`, `legal`, `career-resource`, `career-resource-hub`). SEO landing pages therefore expose `data-page-type="seo-jobs-landing"`. - Sections are anchored with `data-section` (e.g. `hero`, `pricing`, `faq`). - Predictable `data-testid` selectors: - `job-card-{id}` — job listing card on the index - `jobs-feed-error` — jobs index recovery card when `GET /jobs/feed` fails; `data-error-kind` is `invalid-request`, `result-window`, `temporarily-unavailable`, `timeout`, or `network` - `cta-pricing` — pricing call-to-action - `funnel-step-{id}` — multi-step funnel step container - `funnel-input-{field}` — funnel form input - `apply-job-cta` — apply button on job detail - `link-card-{label}` — link cards on the links hub - `data-footer-section={id}` — one footer navigation group per browsing axis (`search`, `jobs-by-country`, `popular-jobs`, `jobs-by-type`, `jobs-by-category`, `resources`, `company`, `legal`) - `data-section="answer"` — the answer-first summary paragraph on a career resource page - `data-section="key-takeaways"` — the extractable takeaway list on a career resource page - Primary CTAs declare intent via `data-action` (e.g. `apply-job`, `start-checkout`). - A skip link is the first focusable element on every page and targets `#main-content`. ## Crawling guidance - Allowed: `/`, `/remote-jobs/*`, `/jobs/*`, `/resources/*`, `/about`, `/post-a-job`, `/subscribe`, `/policy`, `/terms`. - `/policy` and `/terms` emit `noindex,nofollow` while legal entity fields remain unresolved. - Disallowed: `/admin`, `/account`, `/protected`, `/sign-in`, `/sign-up`, `/test/*`, `/api/*`. - Sitemap index: https://reativa.dev/sitemap-index.xml - Dynamic job sitemap index: https://reativa.dev/sitemap-jobs.xml. Its `/sitemaps/jobs/{partition}.xml` children contain at most 50,000 canonical job-detail URLs each. - Dynamic count-positive landing sitemap: https://reativa.dev/sitemap-seo-landings.xml. Alias and zero-result URLs are excluded. - All content is server-rendered HTML — no JavaScript required to read or extract job data. ## Read-only API dependencies - `GET /jobs/feed` returns the filtered, paginated job rows rendered by the feed and landing pages. - `GET /jobs/seo/facets` returns deterministic remote-only role, category, country, and employment counts used to publish count-positive directories and landing URLs. - `GET /jobs/seo/sitemap?offset={offset}&limit={limit}` returns stable job IDs and creation timestamps for XML generation; it never exposes the full job payload. ## Contact - Site: https://reativa.dev