Skip to main content
A cell measurement represents a single experiment or test performed on a cell instance. Every measurement has a measurement_type that determines what data it stores and how you create it.

Measurement types

Common fields

Every measurement — regardless of type — accepts these optional metadata fields:

Recording what a measurement ran

Two fields describe the test, and they are not interchangeable: Prefer protocol_id. It points at a definition the platform can act on: resolve to a name, link to in the app, simulate, or convert to a cycler file. The dict is unvalidated text, so two runs of the same test can spell it differently and nothing reconciles them. Use the protocol dict when you have no full protocol. That is common and not a failure: data imported from a cycler export often records “1C discharge at 25 °C” and nothing reconstructable into an executable definition. Recording what you know beats dropping it. Setting both is the best record — protocol_id for what the run was supposed to execute, the dict for the conditions it actually ran under. One protocol serves many runs at different temperatures, and only the dict captures which.
When you set protocol_id, do not put a name in the protocol dict. The protocol already has one, the two can disagree, and the app suppresses the dict’s name once protocol_id is set.
protocol_id can also be attached later, once the protocol a run executed is known, via client.cell_measurement.update().

Time series

Time series is the default measurement type. It carries high-resolution cycling data and auto-generates step and cycle summaries on upload. The time series DataFrame must follow the data format — recognized columns include Time [s], Voltage [V], Current [A], Step count, and Cycle count.
create() returns a MeasurementBundle containing the measurement record plus metadata like steps_created. See uploading data for the full upload workflow — protocol and test-setup metadata, on-machine validation, and idempotent create_or_get — and reading data to fetch a measurement back with its full time series, steps, and cycles.

Properties

Properties measurements store key-value pairs directly in the record — no file upload. Use them for manual or one-off measurements like thickness, weight, or internal resistance. Properties-specific fields:
You can include any of the common metadata fields (protocol, test_setup, start_time, notes) alongside the properties.
create_properties returns a Measurement directly, not a MeasurementBundle. Properties measurements have no steps or file uploads, so the bundle wrapper isn’t needed.

File

File measurements attach files (images, PDFs, numpy arrays, or any other file type) to a measurement record. Useful for microscopy images, SEM photos, X-ray CT scans, or post-mortem analysis documents. File-specific fields:
To enable client-side image validation:
To access files from an existing file measurement:
File measurements use a signed URL upload flow internally. The client handles the multi-step process (initiate, upload, confirm) automatically.

Previewing files in Studio

When you open a file measurement in Studio, attached files are shown as a gallery beneath the measurement details:
  • Images (.png, .jpg, .webp, etc.) render as inline thumbnails. Click a thumbnail to open it in a full-screen lightbox.
  • Non-image files (PDFs, numpy arrays, CSVs, etc.) appear as cards with a download button.
This makes it easy to review SEM photos, X-ray CT scans, and other microscopy images directly in the browser without downloading them first.

Next steps

Uploading data

End-to-end upload workflow: specs, instances, and measurements.

Reading data

List, filter, and retrieve measurements with their full data.