Skip to main content
GET
/
api
/
public
/
v1
/
jobs
/
changes
curl -sS "https://app.opentrain.ai/api/public/v1/jobs/changes?since=2026-06-11T00:00:00Z"
{
  "since": "2026-06-11T00:00:00.000Z",
  "until": "2026-06-12T08:00:00.000Z",
  "changes": [
    {
      "jobId": "<JOB_ID>",
      "eventType": "PUBLISHED",
      "occurredAt": "2026-06-11T14:22:05.000Z"
    },
    {
      "jobId": "<OTHER_JOB_ID>",
      "eventType": "CLOSED",
      "occurredAt": "2026-06-12T06:10:41.000Z"
    }
  ],
  "generatedAt": "2026-06-12T08:00:00.000Z"
}
Incremental change feed for the public marketplace: which jobs were published, updated, or closed since a timestamp. Designed for keeping an external job index in sync without re-fetching everything — store the response’s until and pass it back as the next since. Only the latest event per job is returned (a job published then updated in the window appears once, as UPDATED). The feed is capped at 5,000 events per call; if you hit the cap, advance since to the returned until and poll again. Tokenless, CORS-enabled, and edge-cached the same way as search. This feed covers public marketplace listings only — for events about your own account (proposals, messages, contracts), use GET /updates. Requirements: none — no token, no scope, no feature flag. Rate limited to 120 requests/minute per IP.

Request

since
string
required
ISO 8601 timestamp. Changes at or after this instant are returned. Missing or invalid → 400.

Response

since
string
Echo of the requested window start.
until
string
Window end (now). Persist this and pass it as the next call’s since.
changes
object[]
One entry per changed job — the latest event in the window.
generatedAt
string
ISO timestamp when the response was generated.

Errors

StatuscodeMeaning
400BAD_REQUESTMissing or unparseable since
429RATE_LIMITEDOver 120 requests/minute from one IP
curl -sS "https://app.opentrain.ai/api/public/v1/jobs/changes?since=2026-06-11T00:00:00Z"
{
  "since": "2026-06-11T00:00:00.000Z",
  "until": "2026-06-12T08:00:00.000Z",
  "changes": [
    {
      "jobId": "<JOB_ID>",
      "eventType": "PUBLISHED",
      "occurredAt": "2026-06-11T14:22:05.000Z"
    },
    {
      "jobId": "<OTHER_JOB_ID>",
      "eventType": "CLOSED",
      "occurredAt": "2026-06-12T06:10:41.000Z"
    }
  ],
  "generatedAt": "2026-06-12T08:00:00.000Z"
}