Aerovy Platform logo

Ingest thing data (compact columnar)

POSThttps://spectra.api.aerovy.com/v2/thing/{thingId}/data/columnar

A space-efficient alternative to POST /v2/thing/{thingId}/data for high-volume or wide payloads. The column names are declared once in columns (which must contain exactly one reserved timestamp column — Unix epoch milliseconds — plus one or more metric names), and each entry in rows is a positional value array aligned to those columns. This avoids repeating metric-name keys on every reading. Metric names are matched (case-insensitively) against the thing's ThingTypeDefinition and mapped to their immutable metric ids; values may be numbers, booleans, or strings (coerced to each metric's data type), and null means "not reported in this row". Requires an API key with the write action scoped to the thing.

Loading code example
Loading code example

Authorizations

apiKeystringheaderrequired

API key passed in the header.

Path Parameters

thingIdstringrequired

The thing to ingest data for.

Body

The columnar batch (column schema + value rows).

columnsarray<string>required

The column schema, declared once. Exactly one column must be the reserved `timestamp` column (Unix epoch milliseconds, UTC); every other column is a metric name matched against the thing's ThingTypeDefinition. Column order is arbitrary.

Required array length: >= 2 elements
rowsarray<array>required

The rows. Each row is a value array the same length as `columns`, positionally aligned to it. Values are scalars — number, boolean, or string — coerced to each metric's declared data type; `null` means "not reported in this row".

Required array length: >= 1 elements

Response

application/json

Data accepted and written; returns an ingest summary.

thingIdstring

The thing the data was written for.

framesIngestedinteger | string<int32>

The number of data frames written.

Pattern: ^-?(?:0|[1-9]\d*)$
metricsarray<string>

The distinct metric names that were ingested across the frames.