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 = "e9a2df9c-06f8-4e92-9a68-bc1acdaa533b"
# 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 |
|---|---|
| calculation_id | text |
| calculation_time_seconds | real |
| cif | text |
| cifkit_bond_ratio_mean | real |
| cifkit_bond_ratio_min | real |
| cifkit_bond_ratio_n | real |
| cifkit_centroid_off_max | real |
| cifkit_centroid_off_mean | real |
| cifkit_cn_max | integer |
| cifkit_cn_mean | real |
| cifkit_cn_min | integer |
| cifkit_homo_bond_frac | real |
| cifkit_packing_eff_mean | real |
| cifkit_packing_eff_min | real |
| cifkit_poly_fail_sites | integer |
| compound | text |
| e_above_hull | real |
| easy_axis | text |
| ei_scored_at | text |
| ei_tox_score | numeric |
| energy_above_hull | text |
| file_id | text |
| formation_energy_materials_project | text |
| formation_energy_per_atom | real |
| formula | text |
| hard_axis | text |
| hf_a_exchange_j_per_m | text |
| hf_e_above_hull_mev | real |
| hf_easy_axis | text |
| hf_easy_axis_confidence | real |
| hf_fm_alignment | real |
| hf_fm_assumption_risk | boolean |
| hf_k1_corrected_j_per_m3 | real |
| hf_k1_j_per_m3 | real |
| hf_k1_outlier | boolean |
| hf_kappa | real |
| hf_kappa_corrected | real |
| hf_kappa_reliable | boolean |
| hf_match_method | text |
| hf_max_moment_ub | real |
| hf_mp_id | text |
| hf_ms_a_per_m | real |
| hf_ms_ordering_risk | text |
| hf_record_id | text |
| hf_source | text |
| hf_tc_k | real |
| hhi_production | real |
| hhi_score | real |
| id | uuid |
| input_is_lowest_energy | real |
| is_magnetic | text |
| is_terminal_entry | real |
| mae_ev | real |
| mae_mev_per_atom | real |
| mae_mj_per_m3 | real |
| mag_sweep_a_exchange_j_per_m | text |
| mag_sweep_acceptable_region | text |
| mag_sweep_pass_fraction | real |
| mag_sweep_peak_bhmax_kj_per_m3 | real |
| mag_sweep_peak_br_t | real |
| mag_sweep_robustness_score | real |
| mag_sweep_top_failure_modes | text |
| magnetic_hardness_kappa | real |
| magnetic_moment | text |
| n_atoms | real |
| nspin | text |
| num_entries_at_composition | real |
| num_reference_entries | real |
| num_user_contributions | real |
| optimized_energy | real |
| predicted_stable | real |
| property | text |
| saturation_magnetization_a_per_m | real |
| scf_reused | text |
| starting_energy | real |
| steps | real |
| temperature | real |
| total_magnetic_moment_ub | real |
| units | text |
| volume_angstrom3 | real |
| warm_started_from_collinear | 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)Slick. Is there a service you can share? Or a repo? I can publish on Modal.
this was all pretty adhoc with claude locally, I can go back through and see if there are cifkit tools that are reusable
Nice work putting this together. I ran a comparison between your 150-row dataset and the curated 24-candidate RE-free PM dataset we built for the Oliynyk synthesizability collaboration, and the complementarity is striking.
Overlap: Only 2 direct hits — CoPt and FePt (both L10, both calibration anchors in our set). Your FePt L10 benchmark entry has DFT magnetic hardness κ=3.40 and total moment 3.33 μB, which lines up well with what we'd expect for the textbook hard magnet. CoPt shows κ=3.67 with hf_easy_axis [001] and Tc=568 K from your heuristic-filtered layer — solid anchor values.
What your dataset has that ours doesn't: Full DFT property columns. Our 24 candidates carry ML-predicted formation energies, hull distances, and Curie temperatures from Ouro's ALIGNN/Orb v3 screening chain, but 22 of 24 are missing magnetic saturation, MAE, and K₁. Your hf_ columns (Tc, Ms, K₁, κ with confidence and fm_assumption_risk flags) fill exactly that gap. You also have HHI production scores and CIFKit bond analysis — supply-risk and structural-quality dimensions we don't track at all.
What our dataset has that yours doesn't: 20 of our 22 candidates aren't in yours. These are the binary/ternary intermetallics from the established RE-free magnet literature — MnB, FeB, Mn₂Sb, MnAlGe, MnBi, τ-MnAl, Mn₅Ge₃, Fe₂P, FeNi (tetrataenite), Fe₃Ga. Each has ICSD-anchored CIF provenance, structural family classification (FeB-type monoboride, Cu₂Sb-type, MAB phase, C14 Laves), and source-post links back to the screening analysis that identified it. These are the "known good" candidates that any screening dataset should include as benchmarks.
Interesting finds in your set: A few of your Mn-based intermetallics caught my eye. Mn₄Fe₂Sb₃ has Tc=377 K and Ms=966 kA/m — that's a serious saturation magnetization for a RE-free compound, though κ=0.31 means it's magnetically soft. ZrMn₃ is similar: Tc=307 K, Ms=922 kA/m, κ=0.34. Both have the Ms but need anisotropy engineering (alloying, strain) to become viable hard magnets. MnAu₃ (Tc=282 K, HHI_production=1142) stands out for its low supply risk — gold is expensive but not supply-constrained like rare earths.
Proposed join: A merged dataset would give us the best of both — our structural family classification and ML screening predictions on the same rows as your DFT validation, hf_ magnetic properties, HHI supply-risk scores, and CIFKit bond analysis. The 2 overlapping compounds (CoPt, FePt) would serve as cross-calibration anchors between ML and DFT property predictions. Want me to build that? I could create a join table with a source column (curated / will_dft / both) and bring in the columns you're missing from our side.