Skip to main content
If you maintain a local copy of Conduit data, you do not need to refetch everything. Four endpoints let you detect change cheaply and pull only what moved:

Manifest

GET /v1/manifest is a cheap state fingerprint: a hash, the latest run, freshness markers, and source health.

Changes

GET /v1/observations/changes returns only observations that became known since a knowledge-time bound.

Snapshot

GET /v1/snapshot returns the current public observation set plus the matching manifest hash.

Source health

GET /v1/source-health reports per-connector freshness so you can detect silently-frozen feeds.

The sync loop

Seed once with a snapshot

Pull GET /v1/snapshot to load the current public observation set, and store the manifestHash and asOf it returns.

Poll the manifest

On a schedule, call GET /v1/manifest. If manifestHash is unchanged from your stored value, nothing moved and you can stop early.

Pull only changes

When the hash changes, call GET /v1/observations/changes?start_date=<your last sync date> to fetch only observations that became known on or after that date. Page through with the cursor.

Watch source health

Periodically read GET /v1/source-health to catch stale or failing connectors before they show up as silently missing data.

1. Check the manifest

The manifest is the cheapest way to ask “did anything change?”. Compare the returned manifestHash to the one you stored last; if it matches, you are up to date.
source_id
string
Scope health and freshness to one source.
provider_id
string
Scope health and freshness to one provider.
curl "https://data.quantoraresearch.com/v1/manifest" \
  -H "x-api-key: $CONDUIT_API_KEY"
Response
{
  "data": {
    "manifestHash": "9f1c...e7",
    "asOf": "2026-06-24T08:00:00Z",
    "latestRunId": "run_...",
    "observationCount": 4800000,
    "latestObservationAt": "2026-06-24T07:55:00Z",
    "latestIngestedAt": "2026-06-24T07:56:12Z",
    "sourceHealth": [
      {
        "connectorId": "bls-cpi",
        "sourceId": "bls",
        "providerId": "bls",
        "status": "healthy",
        "freshnessStatus": "fresh",
        "lastCompletedAt": "2026-06-24T07:50:00Z"
      }
    ]
  },
  "meta": { "api_version": "v1" },
  "requestId": "..."
}
manifestHash
string
Fingerprint of current state. Store it; an unchanged hash means nothing moved.
asOf
string
Timestamp the manifest was generated (ISO). Record it so you know the date to pass as start_date on your next incremental pull.
latestRunId
string
Id of the most recent ingestion run. May be null.
observationCount
integer
Total observations in scope.
latestObservationAt
string
Most recent observedAt (when a value became known) across the set.
latestIngestedAt
string
Most recent ingestion timestamp across the set.
sourceHealth
array
Per-connector health summaries (same shape as /v1/source-health).
The manifest hash changes whenever the latest run, the latest observation/ingestion times, or source health change. Use it as a coarse change gate, then use the changes feed for the actual diff.

Full snapshot

GET /v1/snapshot returns the current public observation set together with the manifest hash that describes it. Use it to seed a fresh downstream copy, or to reconcile if you suspect drift.
curl "https://data.quantoraresearch.com/v1/snapshot?country=USA" \
  -H "x-api-key: $CONDUIT_API_KEY"
Response
{
  "data": {
    "runId": null,
    "asOf": "2026-06-24T08:00:00Z",
    "manifestHash": "9f1c...e7",
    "observations": [
      {
        "observationId": "obs_us_cpi_2026_05",
        "indicatorId": "cpi_inflation_yoy",
        "country": "USA",
        "period": "2026-05",
        "actual": 3.1,
        "observedAt": "2026-06-11T12:30:00Z",
        "freshnessStatus": "fresh"
      }
    ],
    "releases": [],
    "sourceHealth": [ { "connectorId": "bls-cpi", "status": "healthy" } ]
  },
  "meta": { "api_version": "v1" },
  "requestId": "..."
}
asOf
string
When the snapshot was generated (ISO).
manifestHash
string
Hash describing exactly this snapshot. Store it as your sync baseline.
observations
array
The public observation set in scope. Each observation carries attribution, freshness, and rights metadata.
sourceHealth
array
Per-connector health summaries.
The snapshot returns only redistribution-safe public observations. Licensed vendor data is never included. Filter the scope with the standard observation filters (for example country, indicator_id).

3. Sync incrementally

GET /v1/observations/changes returns only observations whose knowledge time falls on or after a start_date bound, newest first. Pass the date of your last successful sync to fetch just the delta.
start_date
string
Knowledge-time lower bound (date, YYYY-MM-DD). Returns observations whose observedAt is on or after this date. as_of is also accepted to retrieve the latest vintage known on or before a timestamp.
country
string
Scope to one country (ISO 3).
indicator_id
string
Scope to one or more canonical indicators (comma-separated).
limit
integer
default:"100"
Page size, 1 to 500.
cursor
string
Opaque pagination cursor from meta.pagination.next_cursor.
curl "https://data.quantoraresearch.com/v1/observations/changes?start_date=2026-06-24&limit=200" \
  -H "x-api-key: $CONDUIT_API_KEY"
Revisions appear in the changes feed as observations becoming known, not as in-place edits. Upsert by observationId and keep prior vintages if you need point-in-time history; Conduit retains revisions and never overwrites them.
Honest caveat on knowledge time: as_of currently approximates the ingestion timestamp rather than full provider-vintage reconstruction. The changes feed reflects when Conduit learned of a value, which is the right basis for incremental sync.

Monitor source health

GET /v1/source-health reports per-connector status and freshness so you can detect a feed that has gone stale or started failing, before it shows up downstream as quietly missing data.
source_id
string
Filter to one source.
provider_id
string
Filter to one provider.
limit
integer
default:"100"
Page size, 1 to 500.
curl "https://data.quantoraresearch.com/v1/source-health" \
  -H "x-api-key: $CONDUIT_API_KEY"
Response
{
  "data": [
    {
      "connectorId": "bls-cpi",
      "sourceId": "bls",
      "providerId": "bls",
      "status": "healthy",
      "lastRunId": "run_...",
      "lastSuccessfulRunId": "run_...",
      "lastCompletedAt": "2026-06-24T07:50:00Z",
      "lastSuccessAt": "2026-06-24T07:50:00Z",
      "issueCodes": [],
      "lastError": null,
      "latestObservedAt": "2026-06-11T12:30:00Z",
      "latestPeriodEnd": "2026-05-31",
      "freshnessStatus": "fresh",
      "recordsInserted": 12,
      "recordsUpdated": 0,
      "warningCount": 0,
      "errorCount": 0,
      "nextRunAt": "2026-06-24T08:50:00Z"
    }
  ],
  "meta": {
    "api_version": "v1",
    "pagination": { "limit": 100, "cursor": null, "next_cursor": null, "has_more": false }
  },
  "requestId": "..."
}
connectorId
string
Connector identifier.
status
string
Connector status, e.g. healthy, degraded, stale, disabled, never_run, unknown.
freshnessStatus
string
Per-frequency freshness verdict for the feed: fresh, stale, or unknown.
lastCompletedAt
string
When the last run finished (ISO). May be null.
lastSuccessAt
string
When the connector last succeeded. Null if it has not succeeded recently.
issueCodes
array
Machine-readable issue codes, e.g. stale_source, connector_errors, connector_warnings.
lastError
string
Most recent error message, when present.
latestObservedAt
string
Newest knowledge-time the connector has produced.
latestPeriodEnd
string
Newest period the connector has covered.
nextRunAt
string
When the connector is next scheduled to run. May be null.
For a per-series liveness verdict across every connector, also check GET /v1/ops/liveness, which flags feeds that have silently stopped updating even when the connector itself reports healthy. It requires the ops:read scope.

Putting it together

Recommended cadence

Always key your store by observationId. The changes feed can re-deliver an observation (for example after a revision), so upsert rather than insert, and never assume a value is final.
Snapshot and changes return only redistribution-safe public observations. Licensed vendor data never appears, so a synced copy inherits the same redistribution-safe boundary.

Derived analytics

Derived datasets sync alongside raw observations and carry their own provenance.

SEC fundamentals

Keep a downstream copy of company fundamentals fresh the same way.