{"openapi":"3.1.0","info":{"title":"VeilPoint Opportunity Exchange public API","version":"1","description":"VeilPoint Opportunity Exchange is economic-intelligence infrastructure for businesses, places, industries, workforce, demand and supply, with governed public evidence, a structured economic graph, and AI-ready access. It connects municipal economies, industries, businesses, workforce demand, wages, housing, trade, facilities, training and emerging activity; job postings are analyzed as labour-demand evidence rather than marketplace inventory. The model is geographically extensible; Saskatchewan is the current evidence footprint, alongside national occupational, wage, vacancy and housing reference data. Keyless, read-only JSON; free, no account, CORS-open. First-class entities carry typed links[] with stable target identities and human/API routes; the contract and relationship vocabulary are published by /api/v1/catalog. Generous per-client rate limit on /api/v1, /data and /mcp: every limited response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and a 429 carries Retry-After. All responses share one envelope: { meta: { platform, canonical, retrievedAt, dataStatus, evidence, provenance?, citeAs }, data }. `meta.evidence` is the compact machine contract: truthState, scenarioType, recordType, isActionable, status, synthetic flag, confidence, source kinds, as-of date, qualification, and assumptions. `truthState` uses a closed vocabulary — preview (synthetic demonstration records, never evidence of current conditions), measured_aggregate (statistical survey estimates), snapshot (authoritative published data for a stated period, not real-time), live (current provider-backed evidence), mixed (derived results inherit their weakest material input), metadata (platform self-description). `isActionable` is resource-specific and must be read independently: hiring records are labour-demand evidence and never an OEX application surface. `observed_hiring_signal` explicitly identifies current hiring evidence that is live but non-transactional. `scenarioType` must be read instead of inferring state from display text. `dataStatus` is its human-readable explanation. Derived resources also include full structured `provenance`: status (`derived` or `placeholder`), weakest confidence tier, conservative observation date, method, assumptions, and contributing sources. `citeAs` is a ready-made resource attribution string. Atomic public graph facts and relationships additionally carry `citation.id` and `citation.resolver`; resolve either through `/api/v1/citations/{citationId}` to recover the exact entity, assertion, source, time, truth state, confidence, scope, methodology and provenance. Bulk one-fetch snapshots (same envelope) live outside this spec at /data/catalog.json, /data/occupations.json, /data/noc.json, /data/municipalities.json, /data/sectors.json, /data/jobs.json, /data/advertised-demand.json, /data/occupational-profiles.json, /data/business-counts.json, /data/cost-baskets.json, /data/housing-evidence.json, /data/occupational-outlook.json, /data/education-pipeline.json, /data/training-pathways.json, /data/signals.json, /data/real-estate.json, /data/economy.json, /data/trade.json, /data/wages.json, /data/rents.json, /data/sources.json, /data/providers.json, /data/models.json. This list is generated from the same dataset registry as the catalogue and capability manifest. Markdown twins of the human pages are indexed at https://veilpoint.ca/llms.txt."},"servers":[{"url":"https://veilpoint.ca/"}],"paths":{"/.well-known/agent-capabilities.json":{"get":{"summary":"Agent capability manifest: discovery links, supported interfaces, MCP configuration and tools, authentication, evidence, citation, and privacy policies.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/catalog":{"get":{"summary":"Machine-facing dataset catalogue: identifiers, typed cross-link contract, entity relationships, methodologies, versioning, bulk files, and operational endpoints.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/business-health":{"get":{"summary":"Run the twenty-two Business Health checks against a business described in the query string. No account, no key, nothing stored: OEX holds no record of the business and asserts nothing about it. Checks requiring a stored or verified identity report why they could not run, never as a pass. Add format=markdown for the hand-off form.","parameters":[{"name":"name","in":"query","description":"Required. The business name.","schema":{"type":"string"},"required":true},{"name":"website","in":"query","description":"Domain or URL. Worth supplying: nine checks available to the free run inspect the site, and the site is one side of every interface comparison.","schema":{"type":"string"}},{"name":"address","in":"query","description":"Street address, as the business would state it.","schema":{"type":"string"}},{"name":"category","in":"query","description":"What the business does.","schema":{"type":"string"}},{"name":"description","in":"query","description":"How the business describes itself.","schema":{"type":"string"}},{"name":"phone","in":"query","description":"Contact telephone number.","schema":{"type":"string"}},{"name":"format","in":"query","description":"Set to 'markdown' for the document form; JSON otherwise.","schema":{"type":"string","enum":["markdown"]}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/business-study":{"get":{"summary":"Run the Guided Business Study: Business Health, then three analytical instruments over the same evidence — Negative Space (structure that would be expected here and is not observed), Boundary Fracture (a value the business's own website publishes that never crossed into its record) and Strategic Node Finder (the single change addressing several findings at once). Every conclusion cites the evidence beneath it; one citing nothing is withheld rather than shown, and evidence OEX could not read is reported as unknown rather than as zero. Supplying website matters most here — without it there is no interface for Boundary Fracture to assess. No account, no key, nothing stored.","parameters":[{"name":"name","in":"query","description":"Required. The business name.","schema":{"type":"string"},"required":true},{"name":"website","in":"query","description":"Domain or URL. Worth supplying: nine checks available to the free run inspect the site, and the site is one side of every interface comparison.","schema":{"type":"string"}},{"name":"address","in":"query","description":"Street address, as the business would state it.","schema":{"type":"string"}},{"name":"category","in":"query","description":"What the business does.","schema":{"type":"string"}},{"name":"description","in":"query","description":"How the business describes itself.","schema":{"type":"string"}},{"name":"phone","in":"query","description":"Contact telephone number.","schema":{"type":"string"}},{"name":"format","in":"query","description":"Set to 'markdown' for the document form; JSON otherwise.","schema":{"type":"string","enum":["markdown"]}},{"name":"objective","in":"query","description":"What the business is trying to accomplish, in its own words.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/investigate":{"post":{"summary":"Plan and execute a bounded economic investigation over existing governed OEX evidence. No hosted model is invoked and no prose conclusion is generated.","description":"The response exposes deterministic intent classification, exact entity resolution, every selected graph/data call, nested evidence envelopes, citations, limitations, and the synthesis contract. Questions are request-scoped, no-store, and should not contain personal or confidential information. retrievalStatus describes resource retrieval, not answerability. An exact registered catalogue question is evidence_ready only when its governed resolution is answered and retrieval is complete; unknown decisive evidence gives awaiting_evidence, a conditional or disputed answer is partial, and successful free-form retrieval is evidence_available (answerability not established). activeInquiries identifies exact catalogue matches. evidenceAssessment.whatWouldChangeAssessment includes public evidence requirements.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["question"],"additionalProperties":false,"properties":{"question":{"type":"string","maxLength":1000},"entities":{"type":"array","maxItems":4,"items":{"type":"object","required":["type","id"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["occupation","municipality","geography","sector","training-program","noc-unit-group","data-source","data-provider","economic-region","census-division","trade-region","naics-industry","industrial-facility","open-source-signal","organization","project","procurement-notice","product-or-service","job-posting","employer","business-source-observation","establishment","business"]},"id":{"type":"string","maxLength":200}}}},"minimumConfidence":{"type":"string","enum":["A","B","C","D"]},"depth":{"type":"integer","minimum":1,"maximum":3,"default":2},"maxEvidenceCalls":{"type":"integer","minimum":1,"maximum":8,"default":6}}}}}},"responses":{"200":{"description":"A no-store deterministic plan and citation-ready evidence bundle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"400":{"description":"Invalid question, entity hint, confidence, depth, or call budget."},"405":{"description":"Use POST so the question is not placed in the URL."}}}},"/api/v1/frontier":{"get":{"summary":"The governed knowledge frontier for one subject: the registered questions OEX asked, what it could not conclude and why, the governed dependency standing in the way where every instance of its scope kind is public by nature, what class of evidence would resolve it, and which registered question logically follows. Every field is a typed governed value or a fixed catalogue constant — no model is invoked and nothing is derived from prose. NOT a task list: no identifiers to act on, no ordering that implies priority, and no endpoint accepts a report that a dependency was addressed. A dependency whose scope kind requires a per-instance publishability decision is not named, not counted and not acknowledged, so an empty unresolvedNeeds list is never evidence that none exist. evidenceRequirements are public catalogue prerequisites, not private source inventories. progress.state is inquiry_available, awaiting_evidence, complete, terminal_unknown, or refused. Stop on awaiting_evidence and resume only when admissible evidence changes. Known evaluated targets and cycles lead to blockers instead of repeated nextInquiries.","parameters":[{"name":"subjectKind","in":"query","description":"Required. Kinds a registered inquiry type asks about are listed in the response under admissibility.inquirableSubjectKinds.","schema":{"type":"string"},"required":true},{"name":"subjectId","in":"query","description":"Required canonical OEX identifier for the subject, such as a municipality slug.","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/entities/resolve":{"get":{"summary":"Resolve a human name, alternate title, local slug, NOC code, SGC code, training program or governed source id to a canonical platform identity and its best follow-up resource. Businesses, employers, job postings, establishments and source observations are NOT enumerated here: they live in the knowledge graph and resolve by name through /api/v1/graph/query?entity=<name>. A zero-match response for one of those types carries guidance naming that endpoint, and is not evidence the record is absent.","parameters":[{"name":"q","in":"query","description":"Required name, slug, or official identifier.","schema":{"type":"string"}},{"name":"type","in":"query","description":"Optional entity-type constraint.","schema":{"type":"string","enum":["occupation","municipality","geography","sector","training-program","noc-unit-group","data-source","data-provider","economic-region","census-division","trade-region","naics-industry","industrial-facility","open-source-signal","organization","project","procurement-notice","product-or-service","job-posting","employer","business-source-observation","establishment","business"]}},{"name":"limit","in":"query","description":"Maximum matches (default 8, maximum 20).","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/entities/context":{"get":{"summary":"Fetch one exact resolved entity through its governed resource, preserving the same evidence and provenance envelope used by the dedicated API and MCP tools.","parameters":[{"name":"type","in":"query","description":"Required entity type.","schema":{"type":"string","enum":["occupation","municipality","geography","sector","training-program","noc-unit-group","data-source","data-provider","economic-region","census-division","trade-region","naics-industry","industrial-facility","open-source-signal","organization","project","procurement-notice","product-or-service","job-posting","employer","business-source-observation","establishment","business"]}},{"name":"id","in":"query","description":"Exact canonical id, local slug, or name returned by entity resolution.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/graph/query":{"get":{"summary":"Bounded semantic-graph query. Resolve one entity and return its typed facts and both relationship directions, query one metric across entities, or query one predicate across the graph. Missing records mean unknown, never zero or false.","parameters":[{"name":"entity","in":"query","description":"Exact name, slug, graph id, NOC code, SGC code, source id, or provider id.","schema":{"type":"string"}},{"name":"geography","in":"query","description":"Optional exact municipality name, slug, or SGC code for geography-scoped facts.","schema":{"type":"string"}},{"name":"bundle","in":"query","description":"Bounded metric preset; requires one exact entity.","schema":{"type":"string","enum":["municipal-economic-profile-v1"]}},{"name":"type","in":"query","description":"Optional entity-type constraint.","schema":{"type":"string","enum":["occupation","municipality","geography","sector","training-program","noc-unit-group","data-source","data-provider","economic-region","census-division","trade-region","naics-industry","industrial-facility","open-source-signal","organization","project","procurement-notice","product-or-service","job-posting","employer","business-source-observation","establishment","business"]}},{"name":"metric","in":"query","description":"Repeat or comma-separate fact metrics, e.g. population.","schema":{"type":"string"}},{"name":"predicate","in":"query","description":"Repeat or comma-separate relationship predicates, e.g. classified_as or serves.","schema":{"type":"string"}},{"name":"truthState","in":"query","description":"Repeat or comma-separate graph truth states.","schema":{"type":"string","enum":["live","snapshot","measured_aggregate","derived","mixed","metadata","unavailable"]}},{"name":"minimumConfidence","in":"query","description":"Weakest accepted confidence tier.","schema":{"type":"string","enum":["A","B","C","D"]}},{"name":"periodStart","in":"query","description":"Inclusive ISO-8601 lower reference-period bound.","schema":{"type":"string"}},{"name":"periodEnd","in":"query","description":"Inclusive ISO-8601 upper reference-period bound.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum records per result family (default 25, maximum 100).","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/citations/{citationId}":{"get":{"summary":"Resolve a versioned OEX citation id for one currently public graph fact or relationship. The response projects the existing governed assertion and never discloses private or aggregate-only records; it is not a second claim store or immutable historical evidence lock.","parameters":[{"name":"citationId","in":"path","required":true,"description":"citation.id token returned beside a public graph assertion.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/graph/status":{"get":{"summary":"Current graph inventory by entity type, predicate and metric plus deterministic reconciliation of every core entity, alias, relationship and fact.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/graph/municipalities/compare":{"get":{"summary":"Align the newest governed fact per metric across 2–10 exact municipalities. comparable=true only when every resolved municipality has the same unit and reference period.","parameters":[{"name":"entity","in":"query","description":"Repeat or comma-separate 2–10 municipality names, slugs, or SGC codes.","schema":{"type":"string"}},{"name":"bundle","in":"query","description":"Metric preset; defaults to municipal-economic-profile-v1.","schema":{"type":"string","enum":["municipal-economic-profile-v1"]}},{"name":"metric","in":"query","description":"Repeat or comma-separate up to 20 additional fact metrics.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/roles":{"get":{"summary":"Occupation catalogue: id, title, NOC, sector, wage, demand.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/roles/{id}":{"get":{"summary":"One role in full: market, requirements, working conditions, training programs, and per-community outcomes (net and discretionary monthly income at the median wage).","parameters":[{"name":"id","in":"path","required":true,"description":"Role id from /api/v1/roles.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/sectors":{"get":{"summary":"Sector rollups: provider-qualified hiring-record counts, median wage, occupation demand and evidence state. Candidate profiles are excluded.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/sectors/{slug}":{"get":{"summary":"One sector: occupations, provider-qualified hiring-record counts by community, and notable employers.","parameters":[{"name":"slug","in":"path","required":true,"description":"Sector id from /api/v1/sectors.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/jobs":{"get":{"summary":"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.","parameters":[{"name":"q","in":"query","description":"Free-text search over title, employer and description.","schema":{"type":"string"}},{"name":"region","in":"query","description":"Exact region name.","schema":{"type":"string"}},{"name":"municipality","in":"query","description":"Exact municipality name.","schema":{"type":"string"}},{"name":"occupation","in":"query","description":"Role id from the occupation catalogue.","schema":{"type":"string"}},{"name":"sector","in":"query","description":"Sector id from the sector list.","schema":{"type":"string"}},{"name":"type","in":"query","description":"Employment type.","schema":{"type":"string","enum":["full-time","part-time","seasonal","casual","contract"]}},{"name":"minWage","in":"query","description":"Minimum hourly wage, CAD.","schema":{"type":"number"}},{"name":"postedWithinDays","in":"query","description":"Only postings newer than this many days.","schema":{"type":"integer"}},{"name":"limit","in":"query","description":"Page size, 1-200 (default 50).","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"Pagination offset (default 0).","schema":{"type":"integer"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/municipalities":{"get":{"summary":"The 20-municipality reference set: real census names, coordinates, populations.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/municipalities/{id}":{"get":{"summary":"One community profile: census reference, modeled GDP and sector shares, housing trend, and business directory. Suppressed GDP estimates remain withheld.","parameters":[{"name":"id","in":"path","required":true,"description":"Municipality id from /api/v1/municipalities.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/outcomes":{"get":{"summary":"The wage-vs-cost join: what an hourly wage leaves over each month, community by community, after tax, housing, utilities and commuting. Pass exactly one of occupation or wage.","parameters":[{"name":"occupation","in":"query","description":"Role id — models that role's median wage, with posting counts (truth state in meta.evidence).","schema":{"type":"string"}},{"name":"wage","in":"query","description":"Explicit hourly wage, CAD.","schema":{"type":"number"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/communities/rank":{"get":{"summary":"Communities ranked by monthly discretionary income. Pass exactly one of occupation or wage.","parameters":[{"name":"occupation","in":"query","description":"Role id whose median wage should be modelled.","schema":{"type":"string"}},{"name":"wage","in":"query","description":"Explicit positive hourly wage in CAD.","schema":{"type":"number","exclusiveMinimum":0}},{"name":"limit","in":"query","description":"Number of ranked communities, 1-20 (default 10).","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/employers/search":{"get":{"summary":"Search the public business directory by name, sector, municipality and provider-qualified hiring evidence. Every row declares evidenceStatus, synthetic and scenarioType.","parameters":[{"name":"q","in":"query","description":"Case-insensitive text search over employer and sector names.","schema":{"type":"string"}},{"name":"municipality","in":"query","description":"Municipality id from /api/v1/municipalities.","schema":{"type":"string"}},{"name":"sector","in":"query","description":"Sector-group id from /api/v1/sectors.","schema":{"type":"string"}},{"name":"hiring","in":"query","description":"true to filter on the disclosed hiring flag; preview providers expose modelled scenarios.","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Result limit, 1-100 (default 25).","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/insights/credential-demand":{"get":{"summary":"Occupational credential requirements associated with provider-qualified hiring records. Candidate and holder counts are excluded.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/insights/sector-demand":{"get":{"summary":"Sector hiring activity and occupation demand indicators. Candidate profiles are excluded and no supply ratio is claimed.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/labour-demand":{"get":{"summary":"Governed labour-demand engine: observed SaskJobs opening totals by broad occupation and service region, Job Bank monthly detail by NOC and city, modelled sector variables, and a capped GDP sector-composition sensitivity scenario that preserves the official provincial GDP total. Sector-dollar tilts are suppressed below the 50-opening publication floor. Elasticity 0.05 is assumed and unvalidated, not empirically estimated. Openings are never counted as GDP.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/trade":{"get":{"summary":"Saskatchewan merchandise exports by NAPCS section. Station-level CGC rows are excluded pending commercial redistribution permission.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/wages":{"get":{"summary":"Measured wages and vacancies on the NOC spine (Statistics Canada, real published data): LFS median/average hourly wages by occupation group × province, JVWS vacancies and offered wages by NOC 2021 unit group × geography. No parameters: national overview. Wage medians are group-level; each per-NOC estimate names the published grouping that answered. Suppressed vacancy cells are absent, never zero.","parameters":[{"name":"noc","in":"query","description":"Five-digit NOC 2021 unit-group code from /api/v1/noc — that group across geographies.","schema":{"type":"string"}},{"name":"province","in":"query","description":"SGC 2021 code, postal abbreviation (e.g. SK), or \"canada\" — that geography's full wage table and top vacancies.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/economy":{"get":{"summary":"Saskatchewan economic overview: eight official province-level headline series with exact units, adjustment and release status; official provincial GDP structure by industry; regional coverage; and modeled community GDP allocated across all 951 census subdivisions by measured activity weights. Community figures are structured estimates, not official measurements.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/economy/coverage":{"get":{"summary":"Evidence availability, confidence tiers and next data actions for all 17 Saskatchewan cities and 149 towns. Coverage states are evidence operations, not municipal performance scores.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/economy/{code}":{"get":{"summary":"One community’s GDP report by 7-digit 2021 SGC census subdivision code (e.g. 4708004): central estimate with income/production range and every sector’s allocated amount and percentage share, or the suppression reason where the data cannot support a point estimate.","parameters":[{"name":"code","in":"path","required":true,"description":"7-digit 2021 SGC census subdivision code from /api/v1/economy.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/models":{"get":{"summary":"Governed registry of published derived models and bounded scenarios, including version, material source IDs, formula, assumptions, confidence/freshness inheritance, sensitivity limits, validation state, back-test status and prohibited interpretations.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/signals":{"get":{"summary":"Official CanadaBuys tender and Canadian Impact Assessment Registry lifecycle signals with explicit Saskatchewan scope. Non-actionable, organization/project level, excluded from pathway ranking, and not evidence of spending, approval, award, construction, hiring or local impact.","parameters":[{"name":"limit","in":"query","description":"Page size (maximum 1000). Omit for the complete checked timeline.","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"Zero-based page offset.","schema":{"type":"integer"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/procurement":{"get":{"summary":"Official CanadaBuys procurement observations with Saskatchewan in the published delivery regions. Returns source-scoped buyers, notices, UNSPSC product/service categories, current and historical lifecycle state, amendments, conflicts, freshness, and provenance. Non-actionable; no supplier fit, award, spending, municipality, or local impact is inferred.","parameters":[{"name":"buyerId","in":"query","description":"Exact source-scoped organization id from entity resolution.","schema":{"type":"string"}},{"name":"categoryCode","in":"query","description":"Exact eight-digit UNSPSC code.","schema":{"type":"string","pattern":"^\\d{8}$"}},{"name":"noticeId","in":"query","description":"Exact source-stable procurement-notice id.","schema":{"type":"string"}},{"name":"includeHistory","in":"query","description":"Include closed historical demand observations; default true.","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Maximum observations returned; default 100.","schema":{"type":"integer","minimum":0,"maximum":500}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/studio/procurement":{"post":{"summary":"The Economic Studio's evidence baseline for one published business and one published supply category: the business's public category declaration, and the official CanadaBuys notices whose requested categories overlap it.","description":"Read-only and no-store. The body carries exactly two identifiers; economic assumptions such as price, cost or volume are refused, because the Studio computes with them in the browser and they never reach the server. The response is the standard envelope: meta.dataStatus and meta.evidence state at the resource level whether a baseline was bound. Inside data, baseline.state, records[].reference.truthState and the limitations carry the detail. Category overlap is compatibility only. It establishes no eligibility, demand, award likelihood or supplier relationship, and an empty overlap is not evidence of absent demand.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessId","categoryCode"],"additionalProperties":false,"properties":{"businessId":{"type":"string","pattern":"^business:[^\\s]{1,190}$"},"categoryCode":{"type":"string","pattern":"^\\d{8}$"}}}}}},"responses":{"200":{"description":"The envelope. data is a frozen evidence baseline (state available, missing, withheld, unavailable or unsupported) with its reason, records, compatibility findings and limitations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"400":{"description":"Not exactly one canonical business id and one eight-digit UNSPSC code."},"413":{"description":"Body larger than 4 KB."}}}},"/api/v1/businesses/procurement-relevance":{"get":{"summary":"Category overlap between the supply categories one business has published and the categories official buyers have requested. Classed as inferred_compatibility and never stored: it establishes no qualification, eligibility, supplier relationship, competitiveness, or likelihood of award. Capabilities a business withheld from publication are excluded, so this is not a complete picture of what it can supply.","parameters":[{"name":"businessId","in":"query","description":"Exact graph business id, e.g. business:<canonical-id>, from entity resolution.","schema":{"type":"string"},"required":true},{"name":"includeHistory","in":"query","description":"Include closed notices as historical demand evidence; default false.","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Maximum overlapping notices returned; default 50.","schema":{"type":"integer","minimum":0,"maximum":200}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/businesses/suppliers":{"get":{"summary":"Businesses whose published supply categories match the categories one business has published as things it buys. Returns potential_compatibility only: no relationship is asserted, neither party has said they have done business, and nothing is matched on industry. Withheld categories on either side are excluded, so an empty result is not evidence that no counterparty exists.","parameters":[{"name":"businessId","in":"query","description":"Exact graph business id, e.g. business:<canonical-id>, from entity resolution.","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/businesses/customers":{"get":{"summary":"Businesses whose published purchasing categories match the categories one business has published as things it can supply. Returns potential_compatibility only: it is not a customer list, and a business appearing in it has expressed no interest in anything.","parameters":[{"name":"businessId","in":"query","description":"Exact graph business id, e.g. business:<canonical-id>, from entity resolution.","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/workforce-demand":{"get":{"summary":"Occupational demand, credential demand, training availability and a training-route constraint indicator, reported separately and never combined into a shortage claim. A shortage is a claim about labour supply and requires a credential-holder denominator OEX does not hold. Advertised record counts are counts of advertisements, not of unfilled positions or people needed, and are not deduplicated across employers.","parameters":[{"name":"limit","in":"query","description":"Maximum rows per view; default 50.","schema":{"type":"integer","minimum":0,"maximum":200}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/rents":{"get":{"summary":"Measured rental markets (CMHC Rental Market Survey via Statistics Canada, real published data): average rents by unit type and rental vacancy rates for every surveyed centre in Canada, October survey. No parameters: national overview with Saskatchewan detail and national extremes. Suppressed cells are null and unsurveyed centres absent, never zero.","parameters":[{"name":"province","in":"query","description":"SGC 2021 code or postal abbreviation (e.g. SK) — every surveyed centre in that province.","schema":{"type":"string"}},{"name":"centre","in":"query","description":"CMHC/StatCan geography code (cmhcCode) — one centre.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/real-estate":{"get":{"summary":"Housing scenarios by community: modelled median price, listing volume, velocity, and own-vs-rent monthly cost on the local wage. Read meta.evidence and each row’s evidenceStatus, synthetic and scenarioType fields.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/real-estate/{id}":{"get":{"summary":"One community housing scenario in full: modelled price trend, home types, the ownership model, and explicit evidenceStatus, synthetic and scenarioType fields.","parameters":[{"name":"id","in":"path","required":true,"description":"Municipality id from /api/v1/real-estate.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/noc":{"get":{"summary":"The complete NOC 2021 classification: 516 unit groups, bilingual titles, TEER tiers, platform coverage flags. Real published data (Statistics Canada Open Licence).","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/evaluate":{"post":{"summary":"POST-only decision endpoint for stated credentials, education, experience, driver licence, relocation radius or destination allowlist, housing and household needs, savings, and retraining time. Returns pass/conflict/unknown feasibility plus the same ordered evidence panel used by the human and MCP surfaces. Ranking uses versioned Job Bank demand and Statistics Canada wage inputs; OSINT, placeholder postings, placeholder training and synthetic market forecasts are excluded. Send Accept: text/markdown for the no-store markdown representation. Constraints stay in the request body rather than access-log-visible URLs; never cached or stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"credentials":{"type":"array","maxItems":30,"items":{"type":"string"}},"educationLevel":{"type":"string","enum":["Secondary school","Secondary plus short certificate","Secondary plus trade certificate","Apprenticeship or journeyperson","Diploma","Bachelor degree"]},"experienceAreas":{"type":"array","maxItems":30,"items":{"type":"string","enum":["mechanical_systems","safety_systems","field_operations","process_monitoring","electrical_basics","coordination_admin","care_delivery","customer_service","digital_systems","logistics_handling","physical_operations"]}},"licenceClass":{"type":"string","enum":["None","Class 5","Class 3","Class 1A"]},"currentMunicipalityId":{"type":"string","enum":["saskatoon","regina","prince-albert","moose-jaw","swift-current","yorkton","north-battleford","weyburn","estevan","lloydminster","warman","martensville","humboldt","melfort","meadow-lake","melville","kindersley","nipawin","rosetown","la-ronge"]},"allowedMunicipalityIds":{"type":"array","maxItems":30,"uniqueItems":true,"items":{"type":"string","enum":["saskatoon","regina","prince-albert","moose-jaw","swift-current","yorkton","north-battleford","weyburn","estevan","lloydminster","warman","martensville","humboldt","melfort","meadow-lake","melville","kindersley","nipawin","rosetown","la-ronge"]}},"maximumRelocationKm":{"type":"number","minimum":0,"maximum":2500},"housingBudgetMonthly":{"type":"number","minimum":1,"maximum":50000},"bedroomsRequired":{"type":"string","enum":["bachelor","oneBedroom","twoBedroom","threeBedroomPlus"]},"incomeEarners":{"type":"integer","minimum":1,"maximum":8},"householdSize":{"type":"integer","minimum":1,"maximum":10},"vehicleAvailable":{"type":"boolean"},"savingsDollars":{"type":"number","minimum":0,"maximum":1000000},"maximumRetrainingWeeks":{"type":"number","minimum":0,"maximum":520},"targetOccupationId":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"A private, no-store pathway evaluation envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"400":{"description":"Invalid constraint; no value is silently discarded."},"404":{"description":"Unknown target occupation id."}}}},"/api/v1/sources":{"get":{"summary":"Governed upstream source registry only: publishers, datasets, licence decisions, approved and excluded uses, checked releases, refresh controls and materialization bindings.","parameters":[{"name":"id","in":"query","description":"Optional exact registered source or runtime provider id. Returns only that source and its lineage.","schema":{"type":"string"}}],"responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/v1/providers":{"get":{"summary":"Runtime delivery contracts grouped as evidence, preview, planned, first-party and derived. Empty and synthetic providers are never included in the evidence group.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/health":{"get":{"summary":"Liveness: infrastructure is responding. This is not a public-launch approval.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/readiness":{"get":{"summary":"Traffic readiness: the configured database and providers can serve their declared contract, including clearly-labelled preview data.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/public-service-readiness":{"get":{"summary":"Public-service assurance register: deployment-scoped Privacy Impact Assessment, security, penetration-test, accessibility, Canadian data-residency, and official-languages evidence. Missing, invalid, mismatched, or expired evidence returns 503.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}},"/api/public-launch-status":{"get":{"summary":"Public-launch promotion gate: data, environment, moderation, production-provider, and public-service assurance blockers. A 503 can mean intentionally not launch-approved while liveness and traffic readiness remain healthy.","responses":{"200":{"description":"The envelope described above.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEnvelope"},"example":{"meta":{"platform":"VeilPoint Opportunity Exchange","canonical":"https://veilpoint.ca/api/v1/jobs","retrievedAt":"2026-07-29T12:00:00.000Z","dataStatus":"Synthetic placeholder: every posting served is sample corpus, not a real vacancy.","evidence":{"status":"placeholder","truthState":"preview","scenarioType":"preview_scenario","recordType":"job-posting","isActionable":false,"synthetic":true,"confidence":"D","sourceKinds":["placeholder"],"asOf":null,"qualification":"Preview scenario: synthetic demonstration postings, never actionable.","assumptions":[]},"citeAs":"VeilPoint Opportunity Exchange, “Hiring activity evidence.”"},"data":{"recordPurpose":"hiring_activity_evidence","total":1,"postings":[{"id":"sample-posting","recordPurpose":"hiring_activity_evidence","isActionable":false,"observationDate":"2026-07-28T00:00:00.000Z","lastVerifiedAt":"2026-07-29T00:00:00.000Z","evidenceStatus":"preview","synthetic":true,"scenarioType":"preview_scenario"}]}}}}},"304":{"description":"Not modified (If-None-Match matched the data ETag)."},"400":{"description":"Invalid parameter value, with an error naming the parameter."},"404":{"description":"Unknown id or missing required parameter, with an error hint."},"429":{"description":"Rate limited. Retry-After and the RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers state when to resume."}}}}},"components":{"schemas":{"EvidenceSummary":{"type":"object","required":["status","truthState","scenarioType","recordType","isActionable","synthetic","confidence","sourceKinds","asOf","qualification","assumptions"],"properties":{"status":{"type":"string","enum":["published","derived","mixed","placeholder"]},"truthState":{"type":"string","enum":["preview","snapshot","measured_aggregate","mixed","live","metadata"]},"scenarioType":{"type":"string","enum":["preview_scenario","published_snapshot","measured_aggregate","mixed_evidence","actionable_record","observed_hiring_signal","platform_metadata"]},"recordType":{"type":"string"},"isActionable":{"type":"boolean"},"synthetic":{"type":"boolean"},"confidence":{"anyOf":[{"type":"string","enum":["A","B","C","D"]},{"type":"null"}]},"sourceKinds":{"type":"array","items":{"type":"string"}},"asOf":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"qualification":{"type":"string"},"assumptions":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"PublicEnvelope":{"type":"object","required":["meta","data"],"properties":{"meta":{"type":"object","required":["platform","canonical","retrievedAt","dataStatus","evidence","citeAs"],"properties":{"platform":{"type":"string","const":"VeilPoint Opportunity Exchange"},"canonical":{"type":"string","format":"uri"},"retrievedAt":{"type":"string","format":"date-time"},"dataStatus":{"type":"string"},"evidence":{"$ref":"#/components/schemas/EvidenceSummary"},"provenance":{"type":"object"},"citeAs":{"type":"string"}}},"data":{"type":"object"}}}}}}