None of these is a second runtime authority. The Session event log remains
execution truth, Usage remains metering truth, and Audit remains governance
truth.
Plain HTTP against the Checkfu API needs no private package.
The documented path is usable as written for an admitted Workspace.
Confirm capability status before making availability part of your application’s contract.
Export one retained Session
GET /v1/sessions/{id}/export streams a bounded document. The export freezes an
end_seq, reads retained positions in order, and stops when the client
disconnects.
The document identifies its own format and wire version and includes:
- Session and Workspace provenance;
- retained event envelopes through
end_seq; and - explicit unavailable positions for content that is shredded or omitted under ZDR.
What “replay” means here
A standard-retention export can replay the retained event tape structurally: an offline reader can rebuild the presentation represented by the included events and preserve unavailable positions. It is not a live Session recovery bundle. It does not recreate omitted content, provider state, actor leases, runtime placement, or an uncertain external effect. Under ZDR, execution content that never entered durable custody cannot be exported. The export must identify the unavailable position rather than fabricating a transcript.Read the context ledger
GET /v1/sessions/{id}/ledger projects context accounting such as the frozen
AgentVersion, loaded capability references, token counts, compactions, and
condensations. It is rebuildable from retained Session truth and does not
replace the event log.
The ledger is not authoritative Usage. Use GET /v1/usage for Budget,
quota, and billing settlement.
Export Audit
next_after.
The SDK and CLI Audit verifiers accept only current checkfu.audit.v2 chained
records. They reject audit-v1 records and unhashed records rather than
converting or skipping them. The canonical subject must match the exported
Workspace; resumed CLI checkpoints must account for every processed record
as chained. They recompute canonical record hashes and predecessor links. A valid
unfiltered chain proves that the exported canonical records are mutually
consistent. It does not prove:
- that an export is complete, whether filtered or unfiltered;
- that the supplied records are authentic source records;
- that every external provider statement is true;
- that an indeterminate provider effect succeeded or failed;
- that a Session export is authentic.
incompatible_verification_state with broken_at_sequence: null; it does not
advance or convert the saved state.
Current SDK state carries state_version: "checkfu.audit-verifier.v1", separate
from the record’s checkfu.audit.v2 hash format. CLI checkpoints use
schema_version: 2. Checkpoints from the predecessor verifier are unsupported;
start a complete export with a new checkpoint instead of editing its version
marker or resuming an old prefix.
Session Bundle
GET /v1/sessions/{id}/bundle returns a signed checkfu.session-bundle
(schema version 3). It freezes one sequence frontier, then streams the body:
one pass reads the log page by page to compute every section digest and sign
the manifest and integrity statements, and a second pass re-reads the same
frozen pages to release the exact bytes it signed. Neither pass holds the
whole history in memory. If retention or deletion changes a position between
the two passes, the body fails before its closing delimiter instead of
ending as a complete-looking Bundle that does not verify.
Every section is either projected from a named owner or carries a typed
omission in manifest.statement.section_coverage:
Artifact and capsule bodies are not inside the Bundle. Each index row binds
the exact SHA-256 and byte count and a locator digest for the custody that
holds the bytes (wire frames, Files, capsule vault custody). Fetch them through
their own operations; those reads revalidate the digest and size. An index row
whose class TTL elapsed is typed
unavailable: expired.
manifest.statement.source_boundary says whether the frontier is closed: a
terminal session.status_completed, session.status_failed,
session.status_canceled, or a session.archived event inside it. An idle
Session is open. Session output Files are indexed only for a closed
frontier, because the output index records no sequence that could bind a File
to an open one.
manifest.statement.signing_identity is deployment_pinned when the
deployment configured CHECKFU_BUNDLE_PROJECTOR_SIGNING_KEY and
CHECKFU_BUNDLE_PROJECTOR_SIGNING_PUBLIC_KEY, and ephemeral otherwise. An
ephemeral signature proves the bytes were not changed after signing; it does
not prove which deployment produced them.
A Bundle is a downstream copy once released. Deleting the Session later does
not recall it. A Bundle export that loses to deletion before release returns
404; one released before deletion fails mid-body when a later page read finds
the Session erased.
Trajectory export
POST /v1/sessions/{id}/trajectories/export selects positions of one
retained Session for a named consumer and returns the selected sequences
with a SessionDataQualityReceipt. It carries no message rows: read the
content itself through the Session export or the Session Bundle. It needs a
Workspace root or admin key, and the receipt binds that key as
exported_by.
consumer is one of memory, evaluation, or self_improvement. Any other
value, including the retired sft, preference, and offline_rl, is refused
at the request boundary with 400; it is never mapped to another consumer.
The checks run against one frozen copy of the log, so events appended while
the export runs cannot change it. The receipt marks the selection not
accepted, with every reason, when:
- the Session is still open (
source_not_closed). It closes onsession.archivedor a terminal status at or before the frozen frontier. A forked Session copies its source’s history, terminal events included, so only a closing event aftersession.forkedcloses it; - the Session was not created with a learning grant for this consumer
(
learning_disallowed,purpose_not_granted), or the grant has expired (grant_expired); - the Workspace runs zero data retention (
zdr) or the retention window has passed (retention_expired); - a tool call’s outcome is unknown (
external_effect_ambiguous), or attribution, causal, or local-sequence coverage is incomplete.
capture_policy.learning_use: { "disposition": "requested", "purposes": ["self_improvement"], "authorized_until": "..." }
and is stamped by the creating root or admin key. A new request may name
memory_curation, evaluation, and self_improvement. A request that names
any other purpose is refused as a whole. Sessions admitted earlier keep the
grant they were admitted with, unchanged. A grant is a record of what was
allowed at admission; it is not renewed, widened, or reused to build a
different export. Retention and learning permission are separate: keeping a
Session does not grant a use, and a grant never extends retention.
Checkfu exports authorized retained Session records for operational use. It
does not produce first-party SFT, preference, offline-RL, or ATIF datasets.
Possession of an export does not grant additional data-use rights or extend
retention. Downstream copies remain the recipient’s responsibility: deleting
the Session afterwards does not recall what you already received. An export
requested after deletion returns 404, and so does one whose log read overlaps
the start of a deletion. That check is made once more after the read, not on
every row, so authorize again in your own backend before releasing an export
to an end user.
Authorization boundary
Export is a read performed under the caller’s current API-key and Workspace scope. An accepted request does not create a durable authorization grant for future exports or redistribution. Current evidence does not establish a final authorization and erasure fence that is re-evaluated across every page of every in-flight export. Therefore, revoking a key or beginning erasure must not be described as retroactively invalidating bytes that an already-started stream delivered.Deletion and erasure boundary
A new export read can become unavailable after Session deletion or content erasure. That does not prove that:- an export already in flight was stopped before it read another page;
- a previously downloaded artifact was disposed of;
- every cache, snapshot, or memory sink was fenced; or
- provider-held copies were erased.