{
  "service": "notflat-compatible public API",
  "version": "v1",
  "auth": "none — public, read-only",
  "description": "Every endpoint reads our own ledger (receipts, observations, corpus registry). No upstream calls are made per request.",
  "domains": [
    "air",
    "earth",
    "sea",
    "agriculture",
    "urban",
    "global-context"
  ],
  "endpoints": [
    {
      "path": "/api/public/v1/model",
      "desc": "Model registry: family, method, inputs, horizon, uncertainty, provider, licence",
      "params": [
        "domain",
        "model",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/accuracy",
      "desc": "Scored accuracy per model/producer: MAE, bias, interval coverage, n",
      "params": [
        "domain",
        "producer",
        "hours",
        "lead"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/meta",
      "desc": "Channel registry: unit, class, provider, product, resolution, publication lag",
      "params": [
        "domain",
        "provider",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/receipts",
      "desc": "Paginated raw forecast ledger, including Open-Meteo live and archived forecasts, outcomes, errors, and provenance",
      "params": [
        "domain",
        "site",
        "producer",
        "state",
        "channel",
        "origin",
        "hours",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/observations",
      "desc": "First-hand observations by domain/channel/site",
      "params": [
        "domain",
        "channel",
        "site",
        "hours",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/sites",
      "desc": "Monitored sites with H3 cells and domain coverage",
      "params": [
        "domain",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/relationships",
      "desc": "Earth + model network edges: lag, effect size, verdict",
      "params": [
        "subject",
        "verdict",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/health",
      "desc": "Feed freshness, ledger counts, last training run",
      "evidenceClass": "operational"
    },
    {
      "path": "/api/public/v1/layers",
      "desc": "World-state layer definitions: units, cadence, evidence role, claim posture, recipe inputs",
      "params": [
        "domain",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/global-context",
      "desc": "Global-context evidence records from GDACS, ReliefWeb, World Bank, WHO GHO, GBIF, OBIS, UCDP",
      "params": [
        "source",
        "theme",
        "country",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/compound-risk",
      "desc": "Active cross-domain compound risk events with severity, evidence and validity window",
      "params": [
        "domain",
        "severity",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/model-weights",
      "desc": "Our own NF-Learn learned heads: weights, features, samples seen, residual sigma, interval scale",
      "params": [
        "head",
        "scope",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/model-scores",
      "desc": "Per-prediction scoring rows from our models: error, abs error, interval hit, horizon",
      "params": [
        "model",
        "domain",
        "hours",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/training-runs",
      "desc": "NF-Learn training history: ingestion, forecasts issued/scored, train samples, metrics",
      "params": [
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/grid-cells",
      "desc": "H3 discrete global grid cells with fused per-domain state",
      "params": [
        "domain",
        "res4",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/source-health",
      "desc": "Feed freshness log: status, age vs expected cadence, last upstream update",
      "params": [
        "feed",
        "status",
        "hours",
        "limit"
      ],
      "evidenceClass": "operational"
    },
    {
      "path": "/api/public/v1/predictions",
      "desc": "Raw prediction records with intervals, before observation matching",
      "params": [
        "domain",
        "model",
        "channel",
        "entity",
        "hours",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/corpus/census",
      "desc": "Model Reliability Corpus readiness: evidence census, frozen contracts, split manifest, leakage checks, admission gate",
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/exports",
      "desc": "Immutable training export snapshots — cite a snapshot id in training configs for reproducibility",
      "params": [
        "id",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/training",
      "desc": "Paginated Zeno training rows. Use version=v2&population=qualifying for the same prospective-only population certified by readiness.",
      "params": [
        "version",
        "population",
        "limit",
        "offset",
        "split",
        "gate"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/snapshots",
      "desc": "Development snapshot manifests: schema/feature/target/split versions, row count, content hash, census, artifact files. Omit id for the newest COMPLETE snapshot.",
      "params": [
        "id"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/snapshot-rows",
      "desc": "Snapshot-bound paginated observable model states — every state observable at its cutoff, with future labels attached only where they exist. population=observable|labelled.",
      "params": [
        "id",
        "population",
        "split",
        "limit",
        "offset"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/snapshot-file",
      "desc": "Immutable snapshot artifact download (gzip JSONL) with its recorded SHA-256",
      "params": [
        "id",
        "path"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/upstream/receipts",
      "desc": "Verified upstream forecast/outcome receipts: five separate clocks, both values, revisions kept as new rows",
      "params": [
        "domain",
        "family",
        "entity",
        "from",
        "to",
        "scored",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/upstream/scorecards",
      "desc": "The upstream platform's own published accuracy claims per model, stored as its claim — compare, do not merge",
      "params": [
        "domain",
        "family",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/upstream/status",
      "desc": "Ingestion mode (live or archive), per-endpoint copy age against expected cadence, and stored receipt/scorecard counts",
      "evidenceClass": "operational"
    },
    {
      "path": "/api/public/v1/upstream/prospective/pairs",
      "desc": "Upstream prospective forecast/outcome pairs, one family at a time (seismic, pm25, sea_sst, urban_heat, agriculture_seasonal): native probability or value, every clock, emission/support state, outcome vintage. Zones, thresholds and horizons stay separate; abstentions are never read as zero",
      "params": [
        "family",
        "zone",
        "threshold",
        "horizon",
        "scoreable",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/upstream/prospective/state",
      "desc": "Per-family state of the upstream prospective lane: contract deployed or not, nothing-matured-yet versus rows, provider metric claims kept as claims, and how many pairs we hold",
      "params": [
        "family"
      ],
      "evidenceClass": "operational"
    },
    {
      "path": "/api/public/v1/contract",
      "desc": "Machine-readable model-behaviour evidence contract: clocks, availability basis, resources, and what is deliberately not published",
      "params": [],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/model-identity",
      "desc": "Model identity, versions and lineage in one payload: training cutoff, corpus id, feature/preprocessing hashes, supersession, lineage edges",
      "params": [
        "domain",
        "model",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/target-contracts",
      "desc": "What counts as truth per target: source priority, matching rule, tolerance, aggregation, finality",
      "params": [
        "domain",
        "channel"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/peers",
      "desc": "Peer comparison sets with each member model's own forecast and error — individual predictions, not a spread",
      "params": [
        "domain",
        "site",
        "channel",
        "target",
        "lead",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/model-behaviour/forecasts",
      "desc": "Distributional forecast events: quantiles, probabilities, ensemble summary, input cutoff, abstentions, supersession chain",
      "params": [
        "task",
        "forecaster",
        "status",
        "available_after",
        "available_before",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/evaluations",
      "desc": "Stored versioned evaluation records: metric, metric version, window, sample count, baseline, matching rule, missing-data policy, aggregation",
      "params": [
        "model",
        "domain",
        "channel",
        "metric",
        "target",
        "limit",
        "offset"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/handoff",
      "desc": "Start here: newest complete model_behaviour_v2 artifact, readiness verdict, provenance and freshness; development-only remains explicit",
      "params": [
        "snapshot",
        "kind"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/contract",
      "desc": "Timing contract: per-object availability rules, the shared reference-selection rule and the conformance fixtures both sides can run",
      "params": [],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/snapshots",
      "desc": "Frozen eligible-history panels: window, row and lifecycle counts, per-part hashes and manifest hash",
      "params": [
        "panel_id"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/census",
      "desc": "How much of a frozen panel is usable: eligible rows separated from inventory, clock basis of eligible rows, lineage-days, calendar and task coverage, eligibility funnel and exclusion reasons",
      "params": [
        "panel_id",
        "group_by",
        "lineage"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/handoff",
      "desc": "Versioned panel handoff: eligible lineage membership, clock basis, calendar and task coverage, and the versions to pin; training_eligible stays false",
      "params": [
        "panel_id"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/audit",
      "desc": "Timing audit for a panel build: admitted, excluded and violating values, with the exclusion reason counted rather than hidden",
      "params": [
        "from",
        "to"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/file",
      "desc": "Immutable panel part, served byte-for-byte with its recorded hash",
      "params": [
        "panel_id",
        "part"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/panel/closures",
      "desc": "Append-only closure records citing a frozen artifact's original manifest hash; manifests themselves are never rewritten",
      "params": [
        "artifact_id"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/evaluation/collection",
      "desc": "The untouched prospective evaluation collection for the registered transfer study: per-decision-day capture with labels stripped at capture and attached only after their own availability clocks pass, pinned feature version 1.4.0, freeze progress against the registered requirements; row-level contents become readable only at freeze",
      "params": [
        "day",
        "manifest"
      ],
      "evidenceClass": null
    },
    {
      "path": "/api/public/v1/corpus/qualification-snapshot",
      "desc": "Immutable v0.16a qualification record; explicitly waits until every gate truly passes",
      "params": [
        "id"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/corpus/readiness",
      "desc": "Whether the corpus currently qualifies for a certified training run: gate conditions, validation size against the floor, accrual projection",
      "params": [],
      "evidenceClass": "operational"
    },
    {
      "path": "/api/public/v1/corpus/models",
      "desc": "Corpus model registry: which watched models have qualifying evidence, their families, versions and evidence counts",
      "params": [
        "domain",
        "family",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/model-corpus",
      "desc": "Per-model corpus rollup: evidence volume, channels covered and reliability records held for each watched model",
      "params": [
        "model",
        "domain",
        "limit"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/model-behaviour/tasks",
      "desc": "Model-behaviour task definitions: what is being forecast about model behaviour, its target contract, horizon and decision deadline",
      "params": [
        "status",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/datasets",
      "desc": "Registered third-party datasets as references: host, upstream source, purpose, revision, licence, access state — originals are loaded from the host, not mirrored",
      "params": [
        "state",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/dataset-rows",
      "desc": "Rows from the one pilot-loaded external dataset, kept separate from our own ledger and never fused into it",
      "params": [
        "dataset",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/contract",
      "desc": "Pinned task contract per external source: round definition, declared submission deadline and timezone, horizon convention, target interval and outcome series",
      "params": [
        "source_key"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/external/forecast-tasks",
      "desc": "Forecast packets: one predictive distribution per row, with completeness status and quality flags — the correct unit for counting decisions",
      "params": [
        "source_key",
        "model_id",
        "forecast_round",
        "distribution_status",
        "task_classification",
        "deadline_before",
        "deadline_after",
        "limit",
        "after_id"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/events",
      "desc": "Component-level external forecast rows (quantile levels, PMF categories, sample trajectories) with per-row clock provenance and licence-aware payloads",
      "params": [
        "source_key",
        "model_id",
        "availability_basis",
        "available_before",
        "available_after",
        "limit",
        "after_id"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/relations",
      "desc": "Directed relations between external model identities: aliases, ensemble membership, post-processing, shared drivers and shared team background",
      "params": [
        "source_key",
        "relation_type",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/participation",
      "desc": "Per-model per-round participation: the denominator behind any comparison, with roster basis — a missing round is never a zero score",
      "params": [
        "source_key",
        "model_id",
        "forecast_round",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/external/census",
      "desc": "Identity and overlap census over forecast packets: lineages under an explicit dependency policy, comparable-group overlap, distribution integrity and clock support",
      "params": [
        "source_key"
      ],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/ledger",
      "desc": "Index of the six canonical append-only evidence objects — ingest these rather than scraping every endpoint",
      "params": [],
      "evidenceClass": "derived_evidence"
    },
    {
      "path": "/api/public/v1/ledger/identity",
      "desc": "Canonical ledger: model identity, versions and lineage",
      "params": [
        "domain",
        "model",
        "limit"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/ledger/forecast-events",
      "desc": "Canonical ledger: one row per forecast issuance with identity keys, five clocks, emission state and transformation",
      "params": [
        "domain",
        "model",
        "channel",
        "site",
        "gateway",
        "available_after",
        "available_before",
        "clock_ok",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/ledger/outcome-vintages",
      "desc": "Canonical ledger: truth as it stood when it became readable, paged on the outcome availability clock",
      "params": [
        "channel",
        "site",
        "model",
        "available_after",
        "available_before",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/ledger/model-events",
      "desc": "Canonical ledger: deployments, version changes, retirements and warnings",
      "params": [
        "model",
        "action",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/ledger/peers",
      "desc": "Canonical ledger: peer sets with each member's own forecast, error and series key",
      "params": [
        "domain",
        "site",
        "channel",
        "target",
        "lead",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    },
    {
      "path": "/api/public/v1/ledger/context",
      "desc": "Canonical ledger: what was knowable about the world, with the clock on which it became knowable",
      "params": [
        "source",
        "theme",
        "country",
        "subject",
        "limit",
        "offset"
      ],
      "evidenceClass": "primitive_evidence"
    }
  ],
  "evidenceClasses": {
    "primitive_evidence": "raw recorded events — safe to build canonical ledgers and training views from",
    "derived_evidence": "our own computation over the primitives — diagnostic metadata, not primitive truth",
    "operational": "ingest and quality control — use to gate a pull, never as a training feature"
  },
  "ledgerIndex": "https://offdiagonal.space/api/public/v1/ledger",
  "contract": "https://offdiagonal.space/api/public/v1/contract",
  "aliases": {
    "/api/public/model": "/api/public/v1/model",
    "/api/public/accuracy": "/api/public/v1/accuracy"
  },
  "generatedAt": "2026-09-09T22:04:49.162Z",
  "self": "https://offdiagonal.space/api/public/v1"
}