Companion Docs
Find an object… ⌘K
Sandbox
Source Trace ↗
Fetch · The Canonical Intelligence Exchange

The Canonical
Intelligence Exchange

One contract. Many observations. Persistent intelligence.

Fetch lets systems contribute observations, retrieve qualified signals, consume interpretations, and participate in a shared continuity network. It is not an API wrapped around a database — it is the exchange through which behavioural truth becomes accountable intelligence.

The flow of intelligence
{{ p.no }}
{{ p.name }}
{{ p.sub }}

Click any object to inspect it. Every node in Fetch descends to the raw partner observation that produced it.

Why Fetch exists
{{ w.title }}
{{ w.body }}
Section 01 →
Core Concepts
Understand the model before the interface. Observations, signals, interpretations, consumers.
Section 03 →
Quickstart
Receive your first qualified signal in under fifteen minutes. Six steps, real shapes.
Section 01 · Core Concepts

The model before the interface

Fetch is built on a small set of objects that compose into intelligence. Master these eleven concepts and every endpoint, contract, and webhook becomes self-evident. Each carries provenance, so nothing in the exchange is unaccountable.

{{ c.name }}
{{ c.kind }}
{{ c.oneLiner }}
← All concepts

{{ activeConcept.name }}

{{ activeConcept.kind }}

{{ activeConcept.oneLiner }}

Definition

{{ activeConcept.definition }}

Why it exists

{{ activeConcept.why }}

Example object
{{ activeConcept.example }}
⊙ Inspect & source-trace this object
Linked concepts
{{ r.name }} →
Section 02 · Architecture

The exchange, end to end

Observations enter from partner systems and leave as interpretations consumed by external platforms. Select any stage to see its purpose, inputs, outputs, and dependencies.

{{ t.label }} {{ t.sub }}
{{ n.no }}
{{ n.name }}
{{ n.out }}
↓ {{ t.flow }}
Continuity Runtime and CITC are downstream Companion properties that consume this same exchange — no separate integration required.
{{ activeArch.no }} · Component
{{ activeArch.name }}

{{ activeArch.purpose }}

Input
{{ activeArch.input }}
Output
{{ activeArch.output }}
Depends
{{ activeArch.deps }}
⊙ Inspect a live object here →
Section 03 · Quickstart

Your first signal in fifteen minutes

Six steps from credential to qualified signal. Every request runs against the sandbox with synthetic Companion data — no partner systems required.

{{ qsLabel }}
{{ t.n }}
{{ qsCur.tag }}

{{ qsCur.title }}

Why

{{ qsCur.why }}

{{ l.label }}
{{ qsCur.method }} {{ qsCur.path }}
{{ qsCode }}
{{ qsCur.method }} · sandbox · synthetic data
● 200 OK Response · {{ qsCur.ms }}
{{ qsCur.response }}
⊙ Inspect {{ qsTraceLabel }} · trace to source →
← Previous
{{ qsNextLabel }} →
Section 06 · Endpoint Catalogue

Endpoints, organised by capability

Fetch is not a CRUD surface. Endpoints are grouped by the role they play in the exchange — contribute, qualify, interpret, deliver, trace, replay. Each one reinforces a canonical object, and every example object can be traced to its raw partner source.

{{ g.no }} {{ g.label }}
{{ epGroupLabel }}
{{ e.method }} {{ e.path }}
{{ epGroupNote }}
{{ epCur.method }} {{ epCur.path }}

{{ epCur.purpose }}

Returns ⊙ {{ epCur.objectLabel }}
Inputs
{{ i.k }} {{ i.v }}
Outputs
{{ o.k }} {{ o.v }}
Example request
Example response
{{ epPanelLabel }} {{ epCur.method }} {{ epCur.path }}
{{ epPanelBody }}
Error conditions
{{ er.code }} {{ er.msg }}
Related objects — click to inspect
⊙ {{ r.label }}
Section 03 · Authentication

The Fetch authentication model

Authentication in Fetch is not a token — it is a contract boundary. A key does not merely identify you; it scopes exactly which observations you may contribute, which intelligence you may consume, and which environment you operate in. Trust is enforced at the credential, not the request.

A credential carries its environment, its scope, and its contract. Nothing in the exchange acts outside what its key permits.

Environment separation
{{ e.name }}
{{ e.prefix }}
{{ e.desc }}

Sandbox and live keys are cryptographically distinct and never interchangeable. A sandbox key cannot read production continuity; a live key cannot be issued until your contract is certified.

Authenticating a request
Bearer credential
curl https://api.fetch.companion.health/v1/account \
  -H "Authorization: Bearer sk_sandbox_3f9a..."

# the key resolves to its environment, scope, and contract
# → { "environment": "sandbox", "contract": "ctr_happy_pet_v2" }
What a key governs
{{ p.k }}
{{ p.v }}
Rate limiting
{{ r.v }}
{{ r.k }}

Limits are enforced per key and returned on every response via X-Fetch-RateLimit-Remaining. Exceeding a limit returns 429 rate_limited with a Retry-After header — never a dropped observation.

From sandbox to production
{{ c.no }}
{{ c.name }}
{{ c.desc }}
Section 04 · Webhooks

An event system, not a callback

Production systems do not poll Fetch — they subscribe. When the exchange qualifies a signal or constructs an interpretation, it emits an event to every consumer whose contract admits it. Each event carries a fully traceable object, signed and delivered with explicit guarantees.

Event catalogue
{{ e.name }}
Subscribe to events when you register a consumer. Each delivery is scoped by your contract.
{{ whCur.name }} {{ whCur.tier }}

{{ whCur.purpose }}

Carries ⊙ {{ whCur.objectLabel }}
Delivered payload
POST → your endpoint {{ whCur.name }}
{{ whCur.payload }}
Related objects — click to inspect
⊙ {{ r.label }}
Delivery model
{{ g.title }}
{{ g.body }}
Verifying the signature
Fetch-Signature header · HMAC-SHA256
Fetch-Signature: t=1736006400,v1=4f8a9c...

# verify before trusting any payload
const signed = `${t}.${rawBody}`;
const expected = hmacSHA256(signed, endpoint_secret);
if (expected !== v1) reject(); // discard unsigned or stale events
Section 06 · API Status & Reliability

All systems operational

Fetch is infrastructure. Reliability is a contract term, not a marketing claim. Figures below are sandbox-representative of the production exchange over a trailing 90-day window.

{{ m.k }}
{{ m.v }}
{{ m.sub }}
Service components
{{ c.name }} {{ c.uptime }} {{ c.state }}
Incident history · trailing 90 days
No incidents recorded
The exchange has operated without degradation or outage across the reporting window. Incident disclosures, when they occur, are published here with full post-mortem and replay impact.
Section 04 · Fetch Contracts

How a partner gets to live

A Fetch Contract is a canonical object, not a business process bolted on. It governs which observations a partner may contribute, which signals it may consume, and the certification it must pass before a live key is issued. This is the path from first conversation to first signal.

⊙ ctr_204
Happy Pet · production contract
inspect the contract object →
Expected time to first signal
{{ ttfsTotal }}

Aggregate of the five stages below, for a typical partner with structured telemetry. Each stage states its own duration, owner, and gate.

{{ s.idx }}
{{ s.name }}
{{ s.duration }}
{{ ctCur.tag }}

{{ ctCur.name }}

{{ ctCur.duration }} Owner · {{ ctCur.owner }}

{{ ctCur.desc }}

Deliverables
{{ d }}
Advances when

{{ ctCur.gate }}

Contract state
{{ ctCur.stateLabel }}
Emits event {{ ctCur.emits }}
Section 03 · Sandbox

Run the exchange yourself

This is the exchange, live, on synthetic data. Contribute an observation, watch it qualify, retrieve the signal it produces, read the interpretation, and trace the whole chain to source. The qualification logic the docs describe runs in front of you — change the input and the outcome changes with it.

Observation to contribute water_bowl_ml · sub_9f2a1 · dev_8821
{{ p.value }} ml
{{ p.label }}
{{ sbBaselineNote }}
{{ s.glyph }}
{{ s.name }}
{{ s.meta }}
Reset
Sandbox response feed
Awaiting first request
Run a step to contribute an observation
{{ f.method }} {{ f.path }} {{ f.status }}
{{ f.body }}
⊙ {{ f.traceLabel }}
Section 06 · SDKs & Versioning

Install, pin, and stay current

Official SDKs wrap the exchange in idiomatic clients. The API is versioned and stable — you pin a version, and breaking changes are announced with a fixed notice period and a long support window.

Install
{{ s.lang }} {{ s.cmd }} {{ s.status }}

Go and Java clients are on the roadmap. Until then, the API is plain REST + JSON — any HTTP client works, and every endpoint in the catalogue shows a cURL example.

API versioning
{{ v.k }}
{{ v.v }}
{{ v.sub }}

The version is set per request via the Fetch-Version header, or pinned once in the SDK constructor. Unversioned requests resolve to your account's default. Canonical object shapes never change within a major version — fields are only ever added, never removed or repurposed.

Section 06 · Changelog

What changed, and when

Every documented capability of the exchange, in reverse order. Additive changes ship continuously; breaking changes are versioned and announced with notice.

{{ c.ver }}
{{ c.date }}
{{ c.tag }}
{{ c.title }}
{{ c.body }}
{{ lifeView.eyebrow }}

{{ lifeView.title }}

{{ lifeView.lead }}

Operating on ⊙ {{ lifeView.objectLabel }} · subject ⊙ {{ lifeView.subjectLabel }}
Reset
{{ s.idx }}
{{ s.name }}
Stage {{ lifeCur.idx }} / {{ lifeView.total }}
{{ lifeCur.name }}

{{ lifeCur.desc }}

Object state
{{ lifeCur.state }}
Contributing objects — click to trace
⊙ {{ ch.label }}
⊙ {{ lifeView.traceLabel }} →
Source Trace Explorer
{{ cr.label }}
{{ traceCur.kind }} {{ traceCur.id }}
{{ traceCur.title }}
confidence {{ traceCur.conf }}
{{ f.k }}
{{ f.v }}
{{ traceCur.descendLabel }}
{{ ch.kind }}
{{ ch.title }}
{{ ch.id }}
Terminal object · raw partner source
End of trace. This is the original observation as contributed by the partner device. Nothing in Fetch exists upstream of a real, attributable event.
esc
{{ r.kind }}
{{ r.title }}
{{ r.id }}
⊙ Inspect
No object matches that identifier in the sandbox network. Try a subject, signal, interpretation, observation, raw event, or partner-source id.
Every object in the exchange is addressable, inspectable, and traceable to source.