Learn how to interact with this dataset using the Ouro SDK or REST API.
API access requires an API key. Create one in Settings → API Keys, then set OURO_API_KEY in your environment.
Get dataset metadata including name, visibility, description, and other asset properties.
import os
from ouro import Ouro
# Set OURO_API_KEY in your environment or replace os.environ.get("OURO_API_KEY")
ouro = Ouro(api_key=os.environ.get("OURO_API_KEY"))
dataset_id = "01a09102-1aaa-797d-95b9-f68e6cf53193"
# Retrieve dataset metadata
dataset = ouro.datasets.retrieve(dataset_id)
print(dataset.name, dataset.visibility)
print(dataset.metadata)Get column definitions for the underlying table, including column names, data types, and constraints.
| Column | Type |
|---|---|
| abs_error | numeric |
| action_id | uuidAction |
| baseline | numeric |
| baseline_abs_error | numeric |
| baseline_method | text |
| horizon_step | bigint |
| id | uuid |
| inside_80 | text |
| issued_at | timestamp with time zone |
| median | numeric |
| model | text |
| notes | text |
| origin_date | timestamp with time zone |
| q10 | numeric |
| q90 | numeric |
| realized_value | numeric |
| run_id | text |
| scored_at | timestamp with time zone |
| series_id | text |
| source | text |
| status | text |
| target_date | timestamp with time zone |
| units | text |
Fetch the dataset's rows. Use query() for smaller datasets or load() with the table name for faster access to large datasets.
Update dataset metadata (visibility, description, etc.) and optionally write new rows to the table. Writing new data will replace the existing data in the table. Requires write or admin permission on the dataset.
# Get column definitions for the underlying table
columns = ouro.datasets.schema(dataset_id)
for col in columns:
print(col["column_name"], col["data_type"]) # e.g., age integer, name text# Option 1: All rows as a Pandas DataFrame
df = ouro.datasets.query(dataset_id)
print(df.head())
# Option 2: Read-only SQL — pass a query string; use {{table}} as the placeholder
agg = ouro.datasets.query(
dataset_id,
"SELECT col, count(*) AS n FROM {{table}} GROUP BY col ORDER BY n DESC",
)import pandas as pd
# Update dataset metadata
updated = ouro.datasets.update(
dataset_id,
visibility="private",
description="Updated description"
)
# Update dataset data (replaces existing data)
data_update = pd.DataFrame([
{"name": "Charlie", "age": 33},
{"name": "Diana", "age": 28},
])
updated = ouro.datasets.update(dataset_id, data=data_update)Chronos forecast ledger. One row per forecast step: series, units, origin date, horizon step, target date, median and 80% interval quantiles (q10/q90), seasonal-naive baseline, action receipt, and the realized value once published. Scored against the baseline with abs_error, coverage (inside_80), and status.
| Column | Range | Mean | Filled |
|---|---|---|---|
| abs_error | — | — | 0% |
| baseline | 4.1–233,000 | 78,920 | 97% |
| baseline_abs_error | — | — | 0% |
| baseline_method | 2 distinct | — | 97% |
| horizon_step | 0–12 | 6.324 | 100% |
| inside_80 | — | — | 0% |
| issued_at | 2026-09-11 13:15:00+00–2026-09-13 01:03:25.751+00 | — | 100% |
| median | 4.047–206,000 | 72,630 | 97% |
| model | 1 distinct | — | 97% |
| notes | 4 distinct | — | 41% |
| origin_date | 2026-07-01 05:00:00+00–2026-09-05 05:00:00+00 | — | 97% |
| q10 | 3.625–197,400 | 68,240 | 97% |
| q90 | 4.221–222,800 | 77,840 | 97% |
| realized_value | — | — | 0% |
| run_id | 4 distinct | — | 100% |
| scored_at | — | — | 0% |
| series_id | 3 distinct | — | 97% |
| source | 1 distinct | — | 100% |
| status | 2 distinct | — | 100% |
| target_date | 2026-08-01 05:00:00+00–2027-08-01 05:00:00+00 | — | 97% |
| units | 1 distinct | — | 97% |
Ledger audit — 2026-09-11
Full audit of all 25 rows (24 forecast rows, 1 void schema-seed row). Checks run programmatically against the row set, plus action-receipt verification.
Counts: checked 25, changed 0, voided 0.
Per-check results:
Required fields: all 24 forecast rows have run_id, source, series_id, units, origin_date, issued_at, horizon_step, target_date, median, q10, q90, baseline, baseline_method, model, action_id. The seed row (01a09102-1d0f-7a83-a094-5efb94bc8f18) is correctly void with an explanatory note and carries no forecast fields.
Target-date alignment: every row satisfies target_date = origin_date + horizon_step months. PCOPPUSDM: origin 2026-07-01, steps 1–12 → 2026-08-01 … 2027-07-01, all aligned. UNRATE: origin 2026-08-01, steps 1–12 → 2026-09-01 … 2027-08-01, all aligned.
Interval ordering: q10 < median < q90 strictly holds on all 24 forecast rows. No inverted, zero-width, or degenerate intervals.
Baseline method: seasonal_naive_12 on all 24 rows, matching the fixed watchlist baselines (no post-hoc method switching).
Action references: both receipts resolve and are successful runs of the TimesFM Forecast route (route 9693eaa2-0302-4340-bb73-4b02eddcb9bd): copper run 01a09094-47a1-7c33-80bc-81b6b274f1f4, unemployment run 01a09094-386a-71ac-ae7b-9675b7056980.
Gap/rounding notes: present where policy requires them — UNRATE step 2 documents the 2025-10 interpolation into its baseline; PCOPPUSDM step 1 documents the 0.1 USD/t input rounding.
No open row carries realized_value or scored_at, so nothing is pre-scored. No corrections were needed; nothing was voided.
Due-score pass — 2026-09-11 (this pass is repeatable; no rows were modified)
Checked every open row whose target_date has passed (today is 2026-09-11): 3 rows found, 0 scored, 3 deferred.
Scored: none — no actual for a past target date is published yet.
Deferred (left open, release lag is normal, absence is not failure):
rows (run_id / horizon_step) | target_date | why deferred |
|---|---|---|
| 2026-08-01 | FRED has not published the August 2026 monthly average. Fresh pull 2026-09-11 via Fred Series ( |
| 2026-09-01 | Target month not complete — the September monthly average cannot exist until after 2026-09-30 (publishes ~mid-October). |
| 2026-09-01 | BLS September Employment Situation releases 2026-10-02. Actual unavailable by construction. |
Leakage check (no action needed yet): both forecast runs were issued 2026-09-11T13:15Z with origins 2026-07-01 (PCOPPUSDM) and 2026-08-01 (UNRATE). The August copper obs was not published at issue time and still is not, so no row is at leakage risk from a post-publication origin.
Next scoring opportunity: re-pull PCOPPUSDM (lin, m) next tick; score step 1 when the 2026-08-01 obs lands. Ledger forecast-ledger.
Reproduction audit — run pcoppusdm-2026-09-11 (PCOPPUSDM, 12 steps) — PASS 12/12
Reproduced the full run from its recorded origin history on 2026-09-12. Re-pulled PCOPPUSDM (units=lin, frequency=m, Fred Series action 01a09622-b878-7aca-8ae2-c34a2850bfaf; latest published obs still 2026-07-01 = 13542.82, so the origin window is unrevised), truncated to the recorded 139-month context (2015-01 → 2026-07, matching the original run's context_length: 139), rounded to 0.1 USD/t per the gap/rounding policy, and re-ran the Forecast route once (action 01a09625-cca5-7fbc-b131-63aca8f88865, model google/timesfm-3.0-pytorch, horizon 12, freq MS). Every baseline was recomputed independently from the fresh pull as the value 12 months before each target, not copied from the ledger.
step | target | row id | date | median | q10 | q90 | baseline | result |
|---|---|---|---|---|---|---|---|---|
1 | 2026-08-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
2 | 2026-09-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
3 | 2026-10-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
4 | 2026-11-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
5 | 2026-12-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
6 | 2027-01-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
7 | 2027-02-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
8 | 2027-03-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
9 | 2027-04-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
10 | 2027-05-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
11 | 2027-06-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
12 | 2027-07-01 |
| PASS | PASS | PASS | PASS | PASS | PASS |
Checks per row: (1) target date equals origin + step months and matches the route's dated step; (2) stored median equals the reproduction's 0.5 quantile; (3) stored q10 equals the 0.1 quantile; (4) stored q90 equals the 0.9 quantile; (5) stored baseline equals the independently recomputed seasonal-naive-12 value. All quantile comparisons agree to within 0.005 USD/t (values are bit-identical at 4 decimals); strict ordering q10 < median < q90 holds on all 12 rows. Recomputed baselines (9671.9, 9994.8, 10739.9, 10812.0, 11791.0, 12986.6, 12951.3, 12528.7, 12890.7, 13512.2, 13552.0, 13542.8) match the stored column exactly.
Rows checked: 12. Rows changed: 0. Rows voided: 0.
Reproduction receipt: View run. Original receipt of record: View run. The reproduction action is an audit artifact only — no ledger rows reference it.
Refresh check, 2026-09-12 — no series updated, no rows added.
Checked both represented series against their release windows. Neither has a newly published complete observation, so no refreshed forecasts were issued and the ledger's 24 open rows are unchanged.
PCOPPUSDM (units lin, frequency m): fresh Fred Series pull on 2026-09-12 shows the latest published observation is still 2026-07-01 (13542.82). The 2026-08 observation is not yet published (expected ~mid-September per the release-lag calendar). The open step-1 row (target 2026-08-01) therefore has no actual to score against, and August is not a complete target month, so it is not a refresh candidate.
UNRATE (units lin, frequency m): fresh Fred Series pull on 2026-09-12 shows the latest published observation is 2026-08-01 (4.1), which is the origin of the existing forecast. The 2026-09 observation releases 2026-10-02, so UNRATE cannot refresh before then.
Next refresh window: PCOPPUSDM August, mid-September.