---
title: "Upload a material property dataset"
method: POST
path: "/material_property_datasets"
tags: ["Material Property Datasets"]
---

# Upload a material property dataset

`POST /material_property_datasets`

Upload a parquet or CSV file as a material property dataset.

The file must contain at least the columns declared in ``columns``. All
values are coerced to Float64; non-parseable cells are stored as NaN. The
raw file is preserved in storage alongside the processed parquet.

The ``columns`` field must be a JSON-encoded array, e.g.::

    [
        {"name": "c_e", "unit": "mol/L"},
        {"name": "kappa", "unit": "S/m"},
        {"name": "diffusivity", "unit": "m^2/s"}
    ]

## Response `201`

Successful Response

- MaterialPropertyDataset — Material property dataset record as returned by the API.
  - `material_id` string, required — ID of the parent material
  - `project_id` string, required — ID of the project this property is scoped to
  - `name` string, required — User-provided dataset name, e.g. 'Electrolyte transport'
  - `columns` ColumnSpec[], required — All columns in the dataset with their units.
    - `name` string, required — Display name stored in the processed parquet
    - `unit` string — Physical unit, e.g. 'mol.L-1' or 'S.m-1'. Empty string for unitless quantities.
    - `source_column_index` integer, required — 0-based column position in the uploaded file. The column at this position is selected and stored under ``name``. Required for all uploads regardless of whether the file has a header row.
  - `id` string, required — Unique identifier
  - `organization_id` string, required — Organization that owns this record
  - `storage_path` string, required — Path to the processed parquet file in the material-property-datasets bucket.
  - `original_path` string, nullable — Path to the raw original file in the material-property-datasets bucket. NULL only for records created before this field was introduced.
  - `data_version` integer, required — Increments on every data-changing operation (file replacement or column re-processing). Downstream code can store this alongside computed results and compare against the current value to detect staleness.
  - `nan_counts` object, nullable — Number of NaN/null values per column, keyed by display name. Computed at upload time. ``None`` for records uploaded before this field was introduced.
  - `no_header` boolean — True when the uploaded CSV had no header row. Column positions are mapped via ``source_column_index`` on each column spec.
  - `created_by` string, nullable — User ID of the uploader
  - `created_at` string, date-time, required — Upload timestamp
  - `updated_at` string, date-time, required — Last update timestamp
  - `source_pipeline_id` string, nullable — FK to the pipeline this dataset was computed from.
  - `source_simple_pipeline_id` string, nullable — FK to the simple pipeline this dataset was computed from.
  - `source_analysis_id` string, nullable — FK to the analysis this dataset was computed from.
  - `source_label` string, nullable — Free-text provenance note.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/ionworks/apis/fastapi.md) · [All operations](https://skmtc.dev/ionworks/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ionworks/fastapi/revisions/7337a3cbdaf2/schema)
