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

Manifest

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

Changes

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

Snapshot

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

Source health

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

The sync loop

Seed once with a snapshot

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

Poll the manifest

On a schedule, call GET /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 /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 /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.
string
Scope health and freshness to one source.
string
Scope health and freshness to one provider.
Response
string
Fingerprint of current state. Store it; an unchanged hash means nothing moved.
string
Timestamp the manifest was generated (ISO). Record it so you know the date to pass as start_date on your next incremental pull.
string
Id of the most recent ingestion run. May be null.
integer
Total observations in scope.
string
Most recent observedAt (when a value became known) across the set.
string
Most recent ingestion timestamp across the set.
array
Per-connector health summaries (same shape as /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 /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.
Response
string
When the snapshot was generated (ISO).
string
Hash describing exactly this snapshot. Store it as your sync baseline.
array
The public observation set in scope. Each observation carries attribution, freshness, and rights metadata.
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 /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.
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.
string
Scope to one country (ISO 3).
string
Scope to one or more canonical indicators (comma-separated).
integer
default:"100"
Page size, 1 to 500.
string
Opaque pagination cursor from meta.pagination.next_cursor.
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; Financial Data API 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 Financial Data API learned of a value, which is the right basis for incremental sync.

Monitor source health

GET /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.
string
Filter to one source.
string
Filter to one provider.
integer
default:"100"
Page size, 1 to 500.
Response
string
Connector identifier.
string
Connector status, e.g. healthy, degraded, stale, disabled, never_run, unknown.
string
Per-frequency freshness verdict for the feed: fresh, stale, or unknown.
string
When the last run finished (ISO). May be null.
string
When the connector last succeeded. Null if it has not succeeded recently.
array
Machine-readable issue codes, e.g. stale_source, connector_errors, connector_warnings.
string
Most recent error message, when present.
string
Newest knowledge-time the connector has produced.
string
Newest period the connector has covered.
string
When the connector is next scheduled to run. May be null.
For a per-series liveness verdict across every connector, also check GET /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

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.
Every list response carries meta.pagination. Follow next_cursor while has_more is true. The TypeScript SDK does this for you via async iteration.

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.