Employer Documentation

JSON Feed Schema

Use this format if your company does not publish jobs through a supported ATS. WantRemote can ingest a public JSON feed and turn it into source-driven job imports.

This page describes the current v1 employer JSON feed used by self-serve source onboarding.

Endpoint Requirements

  • The feed must be available at a public `https://` URL.
  • The response body must be valid JSON.
  • The root object must contain a `jobs` array.
  • Each item in `jobs` must represent one vacancy.
  • The feed must contain only remote jobs. If non-remote jobs are detected, the feed may be blocked.
  • The feed should stay stable across requests so the same job keeps the same `url`.

Required Vacancy Fields

Field Type Notes
url string Canonical job URL on your website. Must remain stable for the same job.
title string Human-readable vacancy title.
location object Either `{ "type": "worldwide" }` or `{ "type": "countries", "countries": ["US", "CA"] }`.
employmentType string Must match one of the supported enum values listed below.
description string HTML or plain text job description. Keep it substantive and complete.
applyUrl string Direct application URL on the employer website.
salary object Optional. Include currency and any available min/max compensation values.

Remote-Only Policy

WantRemote only accepts remote jobs through the JSON feed. Do not include hybrid or onsite roles in the same feed.

  • Use the feed only for remote vacancies.
  • Represent availability through `location.type = "worldwide"` or `location.type = "countries"`.
  • If non-remote jobs are included, the feed may be blocked until corrected.

employmentType Enum

Use one of the existing employment type enum values supported by the platform.

full_time part_time contractor temporary intern volunteer per_diem other

Location Format

`location` must be one of two shapes:

  • { "type": "worldwide" }
  • { "type": "countries", "countries": ["US", "CA", "GB"] }

`countries` must contain ISO 3166-1 alpha-2 country codes. Example supported codes: US, CA, GB, DE, NL, PL, AU.

The platform country enum currently supports codes such as AF, AX, AL, DZ, AS, AD, AO, AI, AQ, AG, AR, AM and many others.

Optional Salary Format

Salary is optional, but recommended when available.

{
  "salary": {
    "currency": "USD",
    "min": 140000,
    "max": 180000,
    "interval": "year"
  }
}

Example Payload

This is a valid example of the JSON structure expected by the current self-serve onboarding flow.

{
  "jobs": [
    {
      "url": "https://jobs.example.com/senior-backend-engineer",
      "title": "Senior Backend Engineer",
      "location": {
        "type": "worldwide"
      },
      "employmentType": "full_time",
      "description": "<p>Build and scale backend systems for a fully remote product team...</p>",
      "applyUrl": "https://jobs.example.com/senior-backend-engineer/apply",
      "salary": {
        "currency": "USD",
        "min": 140000,
        "max": 180000,
        "interval": "year"
      }
    },
    {
      "url": "https://jobs.example.com/product-designer",
      "title": "Product Designer",
      "location": {
        "type": "countries",
        "countries": ["GB", "DE", "NL", "PL"]
      },
      "employmentType": "full_time",
      "description": "<p>Design user flows, interfaces, and experiments for remote-first products...</p>",
      "applyUrl": "https://jobs.example.com/product-designer/apply"
    }
  ]
}

v1 Schema Reference

Use this simplified schema as an implementation guide for backend teams exposing a compatible feed.

{
  "type": "object",
  "required": ["jobs"],
  "properties": {
    "jobs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["url", "title", "location", "employmentType", "description", "applyUrl"],
        "properties": {
          "url": { "type": "string", "format": "uri" },
          "title": { "type": "string", "minLength": 1 },
          "location": {
            "oneOf": [
              {
                "type": "object",
                "required": ["type"],
                "properties": {
                  "type": { "const": "worldwide" }
                }
              },
              {
                "type": "object",
                "required": ["type", "countries"],
                "properties": {
                  "type": { "const": "countries" },
                  "countries": {
                    "type": "array",
                    "minItems": 1,
                    "items": { "type": "string", "pattern": "^[A-Z]{2}$" }
                  }
                }
              }
            ]
          },
          "employmentType": {
            "type": "string",
            "enum": ["full_time", "part_time", "contractor", "temporary", "intern", "volunteer", "per_diem", "other"]
          },
          "description": { "type": "string", "minLength": 120 },
          "applyUrl": { "type": "string", "format": "uri" },
          "salary": {
            "type": "object",
            "required": ["currency"],
            "properties": {
              "currency": { "type": "string", "pattern": "^[A-Z]{3}$" },
              "min": { "type": "number" },
              "max": { "type": "number" },
              "interval": { "type": "string", "enum": ["hour", "day", "week", "month", "year"] }
            }
          }
        }
      }
    }
  }
}

Please confirm

Are you sure you want to continue?