Skip to main content
GET
/
api
/
public
/
v1
/
jobs
/
{id}
curl -sS https://app.opentrain.ai/api/public/v1/jobs/<JOB_ID>
{
  "id": "<JOB_ID>",
  "slug": "spanish-audio-annotation",
  "title": "Spanish Audio Annotation",
  "companyName": "Acme AI",
  "descriptionText": "Transcribe and annotate Spanish call-center audio...",
  "descriptionHtml": "<p>Transcribe and annotate Spanish call-center audio...</p>",
  "seoTitle": null,
  "summary": null,
  "status": "OPEN",
  "datePosted": "2026-06-01T12:00:00.000Z",
  "validThrough": "2026-07-27T12:00:00.000Z",
  "updatedAt": "2026-06-10T09:30:00.000Z",
  "employmentTypes": ["CONTRACTOR"],
  "countries": [],
  "languages": ["Spanish"],
  "category": "Audio Annotation",
  "dataType": "Audio",
  "labelTypes": ["Transcription"],
  "labelingSoftware": null,
  "experienceLevel": "Intermediate",
  "skills": ["Transcription"],
  "pay": {
    "paymentType": "PAY_PER_HOUR",
    "currency": "USD",
    "hourlyRate": 12,
    "hourlyMin": null,
    "hourlyMax": null,
    "fixedPrice": null,
    "perLabelRate": null
  },
  "url": "https://app.opentrain.ai/jobs/spanish-audio-annotation-<JOB_ID>",
  "applyUrl": "https://app.opentrain.ai/api/out?job=<JOB_ID>&src=www_seo"
}
Fetches one public marketplace job by ID. Same job object shape as search. Tokenless, CORS-enabled, edge-cached. A job that exists but is no longer publicly listed (closed, archived, or otherwise unlisted) returns 404 with a minimal {id, status: "closed"} body — distinct from the standard error envelope you get for a nonexistent ID. Requirements: none — no token, no scope, no feature flag. Rate limited to 120 requests/minute per IP.

Request

id
string
required
Job ID (from search, the changes feed, or your own job list). Empty or longer than 64 characters → 400.

Response

A single job object — see the search page for every field: id, slug, title, companyName, descriptionText, descriptionHtml, seoTitle, summary, status, datePosted, validThrough, updatedAt, employmentTypes, countries, languages, category, dataType, labelTypes, labelingSoftware, experienceLevel, skills, pay, url, applyUrl.

Errors

StatuscodeMeaning
400BAD_REQUESTInvalid ID (empty or over 64 characters)
404NOT_FOUNDNo such job (standard error envelope)
404Job exists but is closed/unlisted — body is {"id": "...", "status": "closed"}
429RATE_LIMITEDOver 120 requests/minute from one IP
curl -sS https://app.opentrain.ai/api/public/v1/jobs/<JOB_ID>
{
  "id": "<JOB_ID>",
  "slug": "spanish-audio-annotation",
  "title": "Spanish Audio Annotation",
  "companyName": "Acme AI",
  "descriptionText": "Transcribe and annotate Spanish call-center audio...",
  "descriptionHtml": "<p>Transcribe and annotate Spanish call-center audio...</p>",
  "seoTitle": null,
  "summary": null,
  "status": "OPEN",
  "datePosted": "2026-06-01T12:00:00.000Z",
  "validThrough": "2026-07-27T12:00:00.000Z",
  "updatedAt": "2026-06-10T09:30:00.000Z",
  "employmentTypes": ["CONTRACTOR"],
  "countries": [],
  "languages": ["Spanish"],
  "category": "Audio Annotation",
  "dataType": "Audio",
  "labelTypes": ["Transcription"],
  "labelingSoftware": null,
  "experienceLevel": "Intermediate",
  "skills": ["Transcription"],
  "pay": {
    "paymentType": "PAY_PER_HOUR",
    "currency": "USD",
    "hourlyRate": 12,
    "hourlyMin": null,
    "hourlyMax": null,
    "fixedPrice": null,
    "perLabelRate": null
  },
  "url": "https://app.opentrain.ai/jobs/spanish-audio-annotation-<JOB_ID>",
  "applyUrl": "https://app.opentrain.ai/api/out?job=<JOB_ID>&src=www_seo"
}