---
title: "Compatibility endpoint for hiring-activity evidence: structured observations of hiring demand, not job inventory. data.recordPurpose and every row recordPurpose are hiring_activity_evidence; every row isActionable=false and carries observation, verification, source and provenance fields. OEX does not host applications or hiring transactions. Rows with synthetic=true are preview corpus. Invalid filter values are a 400, never silently ignored."
method: GET
path: "/api/v1/jobs"
---

# Compatibility endpoint for hiring-activity evidence: structured observations of hiring demand, not job inventory. data.recordPurpose and every row recordPurpose are hiring_activity_evidence; every row isActionable=false and carries observation, verification, source and provenance fields. OEX does not host applications or hiring transactions. Rows with synthetic=true are preview corpus. Invalid filter values are a 400, never silently ignored.

`GET /api/v1/jobs`

## Request

- Base URL: `https://veilpoint.ca`
- URL: `https://veilpoint.ca/api/v1/jobs`
- Auth: none declared

## Query parameters

- `q` string
- `region` string
- `municipality` string
- `occupation` string
- `sector` string
- `type` 'full-time' | 'part-time' | 'seasonal' | 'casual' | 'contract'
- `minWage` number
- `postedWithinDays` integer
- `limit` integer
- `offset` integer

## Response `200`

The envelope described above.

- PublicEnvelope
  - `meta` object, required
    - `platform` 'VeilPoint Opportunity Exchange', required
    - `canonical` string, uri, required
    - `retrievedAt` string, date-time, required
    - `dataStatus` string, required
    - `evidence` EvidenceSummary, required
      - `status` 'published' | 'derived' | 'mixed' | 'placeholder', required
      - `truthState` 'preview' | 'snapshot' | 'measured_aggregate' | 'mixed' | 'live' | 'metadata', required
      - `scenarioType` 'preview_scenario' | 'published_snapshot' | 'measured_aggregate' | 'mixed_evidence' | 'actionable_record' | 'observed_hiring_signal' | 'platform_metadata', required
      - `recordType` string, required
      - `isActionable` boolean, required
      - `synthetic` boolean, required
      - `confidence` 'A' | 'B' | 'C' | 'D', nullable, required
      - `sourceKinds` string[], required
      - `asOf` string, date-time, nullable, required
      - `qualification` string, required
      - `assumptions` string[], required
    - `provenance` object
    - `citeAs` string, required
  - `data` object, required

## Other responses

- `304`: Not modified (If-None-Match matched the data ETag).
- `400`: Invalid parameter value, with an error naming the parameter.
- `404`: Unknown id or missing required parameter, with an error hint.
- `429`: Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume.

---

[API](https://skmtc.dev/veilpoint/apis/veilpoint-opportunity-exchange-public-api.md) · [All operations](https://skmtc.dev/veilpoint/apis/veilpoint-opportunity-exchange-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/veilpoint/apis/veilpoint-opportunity-exchange-public-api/revisions/fa1381cfa886?raw)
