Hanzo

Research

Package research is every experiment you have ever run, kept and comparable.

Package research is every experiment you have ever run, kept and comparable.

Base URLhttps://api.hanzo.ai
Operations8
AuthAuthorization: Bearer $HANZO_API_KEY

research

Retrieve an artifact's bytes by content hash (org-scoped)

GET /v1/research/artifacts/{sha256}

ParameterInTypeRequiredDescription
sha256pathstringyesThe artifact content hash.
projectquerystring

ListResearchArtifacts returns the caller org's research-diary feed newest-first — the snapshots and reports tied to its runs, as metadata and content addresses; the bytes themselves are fetched by hash.

GET /v1/research/artifacts

ListResearchArtifacts returns the caller org's research-diary feed newest-first — the snapshots and reports tied to its runs, as metadata and content addresses; the bytes themselves are fetched by hash. ?run= narrows to one run, ?project= to one project (default the caller's project scope), and ?since= to a unix second.

ParameterInTypeRequiredDescription
projectquerystringProject narrows to one project.
runquerystringRun narrows to one run's artifacts by its stable id.
sincequeryintegerSince bounds the feed to artifacts recorded at or after this unix second.

RecordResearchArtifact records one research-diary artifact — a board snapshot or a generated report — CONTENT-ADDRESSED inside the trust boundary.

POST /v1/research/artifacts

RecordResearchArtifact records one research-diary artifact — a board snapshot or a generated report — CONTENT-ADDRESSED inside the trust boundary. The caller submits the bytes as base64 content; the SERVER hashes them and THAT hash is the identity and the ref, so the address can never be poisoned by a client-asserted one. A client-supplied sha256, if present, must match the bytes. The project is the SERVER's value and visibility is forced private. Re-posting the same bytes is a no-op that reports created=false.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
contentstringbase64 bytes on write; the server hashes + stores them (never returned)
git_branchstring
git_dirtyboolean
git_shastring
kindstring
lib_versions
projectstring
refstringserver-derived content address (sha256:<hash>)
retention_classstring
run_idstring
sha256stringSERVER-derived on write; the identity
tsinteger
visibilitystring

ListExperiments returns the caller org's CANONICAL experiments — the deterministic deduped view over the versioned history.

GET /v1/research/experiments

ListExperiments returns the caller org's CANONICAL experiments — the deterministic deduped view over the versioned history. With no ?project= it reads the org's whole set across projects (the ops board's cross-project view, since a project is a sub-scope of the one tenant); ?project= narrows to one and ?kind= to one discriminator.

ParameterInTypeRequiredDescription
projectquerystringProject narrows to one project.
kindquerystringKind narrows to one discriminator: benchmark, kernel-perf, training, ablation or policy-eval.

IngestExperiments appends one batch of experiment and attempt versions to the caller org's evidence store, idempotently by content, then rolls it up to the analytics plane best-effort.

POST /v1/research/experiments

IngestExperiments appends one batch of experiment and attempt versions to the caller org's evidence store, idempotently by content, then rolls it up to the analytics plane best-effort. The project is the SERVER's value and visibility is forced private — an upload grants no training or publication right, which is a separate call. A run carrying a BYO endpoint is SSRF-checked before the store is touched. The answer carries BOTH the canonical (deduped) and retained (full history) counts, so a caller sees the versioned truth rather than a dedup that reads as loss.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
attemptscloud_Attempt[]
experimentscloud_Experiment[]

POST /v1/research/grants

GrantResearchVisibility records the SEPARATE authorization an upload never implies: a record's visibility (private, org or public) and, for a run, its training and commons-publication consent. Address a run by its stable id or an artifact by its sha256; an artifact grant sets visibility only. The ORG is the tenant boundary and comes from the validated principal, so a caller can only ever grant within its own org; project locates WHICH record inside it and defaults to the caller's project scope.

Request bodyapplication/json (required)

FieldTypeRequiredDescription
idstringan experiment (run) stable id
projectstring
publishableboolean
sha256stringOR an artifact content hash
trainableboolean
visibilitystring

ListResearchProjects returns every research project in the caller's org with its real totals — canonical and retained side by side — which is the ops board's "every project + real totals" view.

GET /v1/research/projects

ListResearchProjects returns every research project in the caller's org with its real totals — canonical and retained side by side — which is the ops board's "every project + real totals" view.

GetResearchTotals returns the caller org's headline aggregate plus a per-kind breakdown — the observatory's poll target.

GET /v1/research/totals

GetResearchTotals returns the caller org's headline aggregate plus a per-kind breakdown — the observatory's poll target. Canonical and retained counts travel together, so a deduped view never reads as loss. ?project= narrows to one project.

ParameterInTypeRequiredDescription
projectquerystringProject narrows the aggregate to one project.

All Hanzo APIs · Interactive reference

How is this guide?

On this page