Skip to content

Create the Feed

An oJobPub feed is a JSON object containing employer metadata and a list of jobs. See the field reference for all properties.

Minimal example

Only required fields:

{
  "version": "1.0",
  "lastUpdated": "2026-09-01T08:00:00Z",
  "employer": {
    "name": "Example Ltd",
    "location": { "city": "Bern", "country": "CH" }
  },
  "jobs": [
    {
      "title": "Carpenter",
      "language": "en",
      "publishedAt": "2026-09-01",
      "jobType": "permanent",
      "locations": [{ "city": "Bern", "country": "CH" }],
      "url": "https://example.com/jobs/carpenter"
    }
  ]
}

With no open positions, publish the feed with an empty list: "jobs": []. That keeps the domain healthy in SourceTracker, and consumers can tell "no openings" apart from "no feed".

Static or generated

The feed doesn't have to be a static file. Any endpoint that returns the document works, for example:

  • a file written by a CI job or build step (static site generators),
  • a route in your CMS or application that renders it from the database,
  • an export from your applicant tracking system, uploaded to object storage.

Publisher does this for you: manage jobs in a web UI and get a feed URL, either on the hosted instance or on your own server.

Validate

Validate against the JSON Schema before publishing. You can do it locally:

pip install check-jsonschema
check-jsonschema \
  --schemafile https://raw.githubusercontent.com/letsemploy/schema/main/v1/ojobpub.json \
  ojobpub.json

Or paste the document into the online Validator.

Common mistakes

Mistake Correct
"version": 1.0 (number) "version": "1.0" (string)
Unknown properties such as salaryText, email Additional properties are rejected at the top level, in employer and in job
"country": "Switzerland" ISO 3166-1 alpha-2: "CH"
"language": "en-US" ISO 639-1: "en"
"publishedAt": "2026-09-01T08:00:00Z" date format: "2026-09-01" (only lastUpdated is date-time)
HTML in description Plain text only. SourceTracker rejects markup and scripts
Stale lastUpdated Update it on every content change
"locations": [] At least one location is required