Ingest service#
The Ingest Service handles the data ingestion into Nominal/data store.
OpenAPI file: IngestService.json
Endpoints#
Ingest#
POST /ingest/v1/ingest
Triggers an ingest job, allowing either creating a new dataset or uploading to an existing one. This endpoint is meant to supersede all other ingestion endpoints as their functionality gets migrated to this one.
Body
optionsIngestOptionsrequired
Set
typeto"dataflash".dataflashDataflashOpts
Fields of
DataflashOptssourceIngestSourcerequired
Set
typeto"s3".s3S3IngestSource
Fields of
S3IngestSourcepathstring required
Set
typeto"gcs".gcsGcsIngestSource
Fields of
GcsIngestSourcepathstring required
Set
typeto"presignedFile".presignedFilePresignedFileIngestSource
Fields of
PresignedFileIngestSourceurlstring required
Set
typeto"fileStore".fileStoreFileStoreIngestSource
Fields of
FileStoreIngestSourcefileRevisionRidstring (RID) required
targetDatasetIngestTargetrequired
Set
typeto"new".newNewDatasetIngestDestination
Fields of
NewDatasetIngestDestinationdatasetNamestring
datasetDescriptionstring
propertiesmap ofPropertyNameto string
labelsarray of string
channelConfigChannelConfig
Fields of
ChannelConfigprefixTreeDelimiterstringIf set, will construct a prefix tree for channels of the dataset using the given delimiter.
workspacestring (RID)The workspace in which to create the dataset. If not provided, the dataset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
markingRidsarray of string (RID)The markings to apply to the created dataset. If not provided, the dataset will be visible to all users in the same workspace.
Set
typeto"existing".existingExistingDatasetIngestDestination
Fields of
ExistingDatasetIngestDestinationdatasetRidstring (RID) required
expandRunBoundsarray of string (RID)The ingest will keep track of the range of timestamps in the ingested data and update the included run’s time bounds. For runs with no end time (uninitialized), it will always set the start time to the file’s start time and set the end time to the file’s end time. For runs with existing end times, it will only expand the bounds (earliest start time, latest end time).
ignoreInvalidTimestampsbooleanIf true, skips dataflash records whose timestamp cannot be represented (corrupted/out-of-range) instead of failing the entire ingest. If not provided, defaults to false.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
Set
typeto"mcapProtobufTimeseries".mcapProtobufTimeseriesMcapProtobufTimeseriesOpts
Fields of
McapProtobufTimeseriesOptssourceIngestSourcerequired
targetDatasetIngestTargetrequired
channelFilterMcapChannelsrequired
Set
typeto"all".allEmpty
Set
typeto"include".includearray ofMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"exclude".excludearray ofMcapChannelLocator
timestampTypeMcapTimestampTyperequired
Set
typeto"logTime".logTimeLogTime
ignoreInvalidTopicsbooleanIf true, skips invalid MCAP topics during ingestion instead of failing the entire ingest. If not provided, defaults to false.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
Set
typeto"journalJson".journalJsonJournalJsonOpts
Fields of
JournalJsonOptssourceIngestSourcerequired
targetDatasetIngestTargetrequired
channelstringIf provided, ingests logs to the given channel. By default, log data will be ingested to a channel named ‘logs’.
timestampMetadataJournalTimestampMetadataOptional timestamp field for the JSON lines. When provided, each line is timestamped from this field instead of the journald default
__REALTIME_TIMESTAMP, allowing non-journald JSON logs to ingest. Each line must still contain aMESSAGEfield. Only numeric epoch timestamps are supported. When absent, the journald default (__REALTIME_TIMESTAMP, microseconds) is used.Fields of
JournalTimestampMetadatafieldNamestring required
epochOfTimeUnitEpochTimestamprequired
Fields of
EpochTimestamptimeUnitTimeUnitrequired
Values of
TimeUnitDAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
Set
typeto"csv".csvCsvOpts
Fields of
CsvOptssourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampMetadataTimestampMetadatarequired
Fields of
TimestampMetadataseriesNamestring required
timestampTypeTimestampTyperequired
Set
typeto"relative".relativeRelativeTimestamp
Fields of
RelativeTimestamptimeUnitTimeUnitrequired
offsetstring (date-time)Starting timestamp to use when indexing the file. This field is required when uploading a new file to an existing dataset.
Set
typeto"absolute".absoluteAbsoluteTimestamp
Set
typeto"iso8601".iso8601Iso8601Timestamp
Set
typeto"epochOfTimeUnit".epochOfTimeUnitEpochTimestamp
Set
typeto"customFormat".customFormatCustomTimestamp
Fields of
CustomTimestampformatstring requiredThe format string should be in the format of the
DateTimeFormatterclass in Java.defaultYearintegerDefault year is accepted as an optional field for cases like IRIG time format and will be overridden by year in time format.
defaultDayOfYearintegerDefault day of year is accepted as an optional field for cases like IRIG time format and will be overridden by day of year in time format.
channelPrefixstring required
channelNameOverridesmap ofColumnNameto string
tagKeysFromColumnsarray of string deprecatedDeprecated: Deprecated in favor of tagColumns.
tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
excludeColumnsarray of stringA set of column names to exclude from ingestion. These columns will not be ingested as channels. Useful for excluding columns that contain unsupported data types like multidimensional arrays.
Set
typeto"parquet".parquetParquetOpts
Fields of
ParquetOptssourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampMetadataTimestampMetadatarequired
channelPrefixstring required
channelNameOverridesmap ofColumnNameto string
tagKeysFromColumnsarray of string deprecatedDeprecated: Deprecated in favor of tagColumns.
tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
isArchivebooleanIf true, the file is an archive. Supported archive formats include .tar, .tar.gz, and .zip. Only files ending in .parquet within the archive will be ingested. If field not provided, defaults to false.
excludeColumnsarray of stringA set of column names to exclude from ingestion. These columns will not be ingested as channels. Useful for excluding columns that contain unsupported data types like multidimensional arrays.
Set
typeto"video".videoVideoOptsdeprecatedDeprecated: Legacy Video-entity ingest. Use videoV2, which ingests video as a channel on a dataset.
Fields of
VideoOptssourceIngestSourcerequired
targetVideoIngestTargetrequired
Set
typeto"new".newNewVideoIngestDestination
Fields of
NewVideoIngestDestinationtitlestringTitle of the Video that will get created. If not provided, a name is deduced from the ingested file.
descriptionstringDescription that is applied to the newly created video
propertiesmap ofPropertyNameto stringKey-Value properties that are applied to the newly created video
labelsarray of stringLabels that are applied to the newly created video
videoFileDetailsVideoFileIngestDetailsMetadata to associate with any created video file
Fields of
VideoFileIngestDetailsfileDescriptionstringDescription that is applied to the newly created video file. If not provided, defaults to the description used to create the video.
filePropertiesmap ofPropertyNameto string deprecatedKey-Value properties that are applied to the newly created video file. Deprecated: Field is ignored as video files do not have properties. Will be removed after 4/5/2025
fileLabelsarray of string deprecatedLabels that are applied to the newly created video file. Deprecated: Field is ignored as video files do not have labels. Will be removed after 4/5/2025
workspacestring (RID)The workspace in which to create the video. If not provided, the video will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
markingRidsarray of string (RID)The markings to apply to the created video. If not provided, the video will be visible to all users in the same workspace.
Set
typeto"existing".existingExistingVideoIngestDestination
Fields of
ExistingVideoIngestDestinationvideoRidstring (RID) requiredRID of the video to ingest the newly created video file to.
videoFileDetailsVideoFileIngestDetailsMetadata to associate with any created video file
timestampManifestVideoFileTimestampManifestrequired
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocatorrequired
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestvideo.api.NoTimestampManifest
Fields of
video.api.NoTimestampManifeststartingTimestampTimestamprequiredSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64) required
nanosinteger (int64) required
scaleParametervideo.api.ScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
overWriteSegmentsbooleanIf true, overlapping segments from other video files within the same video will be deleted before inserting new segments. The cached segment metadata for affected files will be recomputed.
Set
typeto"videoV2".videoV2VideoOptsV2
Fields of
VideoOptsV2sourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampManifestVideoFileTimestampManifestrequired
channelstring required
tagsmap ofTagNameto string
overWriteSegmentsbooleanIf true, overlapping segments from other dataset files within the same series will be deleted before inserting new segments. The cached segment metadata for affected files will be recomputed.
Set
typeto"containerized".containerizedContainerizedOpts
Fields of
ContainerizedOptssourcesmap ofEnvironmentVariabletoIngestSource
argumentsmap ofEnvironmentVariableto string
extractorRidstring (RID) required
timestampMetadataTimestampMetadata
tagstring
targetDatasetIngestTargetrequired
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
Set
typeto"avroStream".avroStreamAvroStreamOpts
Fields of
AvroStreamOptssourceIngestSourcerequired
targetDatasetIngestTargetrequired
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
timestampTypeAvroNumericTimestampTypeHow to interpret the numeric values in the
timestampsarray. Defaults to epoch-nanoseconds when omitted, matching the original contract of this API.Set
typeto"epoch".epochEpochTimestamp
Set
typeto"relative".relativeRelativeTimestamp
Set
typeto"pointCloud".pointCloudPointCloudOpts
Fields of
PointCloudOptssourceIngestSourcerequired
targetPointCloudIngestTargetrequired
Set
typeto"existing".existingExistingSpatialIngestDestination
Fields of
ExistingSpatialIngestDestinationspatialRidstring (RID) required
daggerImportConfigany JSON value requiredThe Dagger **v2**
ImportRequestbody — everything from that schema exceptsource_uri, which Nominal fills in from the resolved presigned URL forsource. Forwarded to Dagger’sPOST /v2/imports/{model_uuid}. Construct via the language’s generated dagger-client types (e.g.dagger_client.models.ImportRequestin Python). Carries the requiredarchetype(attribute definitions and sampler configuration), an optionalformat(the source format and its format-specific parameters, including thegeometry_typeandcolumnsa CSV source needs; omit it to let Dagger infer the format from the file extension), and an optionalquiche_config— all of which are domain knowledge the client owns when it produced the file. The legacy v1 shape, withgeometry_typeandcolumnsat the top level, is rejected.sensorMetadataPointCloudMetadataSensor metadata to associate with the point cloud.
Fields of
PointCloudMetadatasensorModelstringThe sensor model name, e.g. “Velodyne VLP-16”, “Ouster OS1-128”.
coordinateSystemstringCoordinate reference system identifier, e.g. “EPSG:4326”, “ENU”.
resolutionMmnumberSpatial resolution of the point cloud in millimeters.
scanPatternScanPatternThe scan pattern of the lidar sensor.
Values of
ScanPatternROTATING
SOLID_STATE
FLASH
MECHANICAL
channelstring requiredChannel name for workbook integration.
tagsmap ofTagNameto stringTags to apply to the point cloud series.
Response
detailsIngestDetails
Set
typeto"dataset".datasetIngestDatasetFileDetails
Fields of
IngestDatasetFileDetailsdatasetFileIdstring (UUID)
datasetRidstring (RID)
Set
typeto"video".videoIngestVideoFileDetailsdeprecatedDeprecated: Returned only for legacy Video-entity ingests; videoV2 ingests return dataset details carrying the created dataset file id.
Fields of
IngestVideoFileDetailsvideoFileRidstring (RID)
videoRidstring (RID)
Set
typeto"spatial".spatialIngestSpatialDetails
Fields of
IngestSpatialDetailsspatialRidstring (RID)
ingestJobRidstring (RID)
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"options": {
"type": "dataflash",
"dataflash": {
"source": {
"type": "s3",
"s3": {
"path": "<path>"
}
},
"target": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {
"<key>": "<property value>"
},
"labels": [
"<label>"
],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>"
},
"workspace": "<workspace rid>",
"markingRids": [
"<marking rid>"
]
}
}
}
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest",
headers={"Authorization": "Bearer <api key>"},
json={
"options": {
"type": "dataflash",
"dataflash": {
"source": {"type": "s3", "s3": {"path": "<path>"}},
"target": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>",
},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest",
headers={"Authorization": "Bearer <api key>"},
json={
"options": {
"type": "dataflash",
"dataflash": {
"source": {"type": "s3", "s3": {"path": "<path>"}},
"target": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>",
},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest",
headers={"Authorization": "Bearer <api key>"},
json={
"options": {
"type": "dataflash",
"dataflash": {
"source": {"type": "s3", "s3": {"path": "<path>"}},
"target": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>",
},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"details": {
"type": "dataset",
"dataset": {
"datasetFileId": "<dataset file id>",
"datasetRid": "<dataset rid>"
}
},
"ingestJobRid": "<ingest job rid>"
}
Rerun ingest#
POST /ingest/v1/re-ingest
Triggers an ingest job using an existing ingest job RID. Returns the same response format as the /ingest endpoint.
Only a job that has finished can be re-run: re-running one still in flight races or duplicates the run already in progress. Cancel it first.
Body
ingestJobRidstring (RID) required
Response
detailsIngestDetails
Set
typeto"dataset".datasetIngestDatasetFileDetails
Fields of
IngestDatasetFileDetailsdatasetFileIdstring (UUID)
datasetRidstring (RID)
Set
typeto"video".videoIngestVideoFileDetailsdeprecatedDeprecated: Returned only for legacy Video-entity ingests; videoV2 ingests return dataset details carrying the created dataset file id.
Fields of
IngestVideoFileDetailsvideoFileRidstring (RID)
videoRidstring (RID)
Set
typeto"spatial".spatialIngestSpatialDetails
Fields of
IngestSpatialDetailsspatialRidstring (RID)
ingestJobRidstring (RID)
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/re-ingest" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"ingestJobRid": "<ingest job rid>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/re-ingest",
headers={"Authorization": "Bearer <api key>"},
json={"ingestJobRid": "<ingest job rid>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/re-ingest",
headers={"Authorization": "Bearer <api key>"},
json={"ingestJobRid": "<ingest job rid>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/ingest/v1/re-ingest",
headers={"Authorization": "Bearer <api key>"},
json={"ingestJobRid": "<ingest job rid>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"details": {
"type": "dataset",
"dataset": {
"datasetFileId": "<dataset file id>",
"datasetRid": "<dataset rid>"
}
},
"ingestJobRid": "<ingest job rid>"
}
Ingest run#
POST /ingest/v1/ingest-run
Creates a run and ingests data sources to be added to the run.
Body
ridstring (RID)If a run with the same rid already exists, the run will be updated.
titlestring required
descriptionstring required
startTimeUtcTimestamprequired
Fields of
UtcTimestampsecondsSinceEpochinteger (int64) required
offsetNanosecondsinteger (int64)
endTimeUtcTimestamp
propertiesmap ofPropertyNameto string
labelsarray of string
runPrefixstringfor example, SIM, HTL, FLT
dataSourcesmap ofDataSourceRefNametoIngestRunDataSource
Fields of
IngestRunDataSourcedataSourceIngestDataSourcerequired
Set
typeto"existingDataSource".existingDataSourcestring (RID)
Set
typeto"newDataSource".newDataSourceDeprecatedNewDataSource
Set
typeto"csv".csvDeprecatedNewCsv
Fields of
DeprecatedNewCsvsourceIngestSourcerequired
Set
typeto"s3".s3S3IngestSource
Fields of
S3IngestSourcepathstring required
Set
typeto"gcs".gcsGcsIngestSource
Fields of
GcsIngestSourcepathstring required
Set
typeto"presignedFile".presignedFilePresignedFileIngestSource
Fields of
PresignedFileIngestSourceurlstring required
Set
typeto"fileStore".fileStoreFileStoreIngestSource
Fields of
FileStoreIngestSourcefileRevisionRidstring (RID) required
namestring
propertiesmap of string to string
timeColumnSpecTimestampMetadata
Fields of
TimestampMetadataseriesNamestring required
timestampTypeTimestampTyperequired
Set
typeto"relative".relativeRelativeTimestamp
Fields of
RelativeTimestamptimeUnitTimeUnitrequired
Values of
TimeUnitDAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
offsetstring (date-time)Starting timestamp to use when indexing the file. This field is required when uploading a new file to an existing dataset.
Set
typeto"absolute".absoluteAbsoluteTimestamp
Set
typeto"iso8601".iso8601Iso8601Timestamp
Set
typeto"epochOfTimeUnit".epochOfTimeUnitEpochTimestamp
Fields of
EpochTimestamptimeUnitTimeUnitrequired
Set
typeto"customFormat".customFormatCustomTimestamp
Fields of
CustomTimestampformatstring requiredThe format string should be in the format of the
DateTimeFormatterclass in Java.defaultYearintegerDefault year is accepted as an optional field for cases like IRIG time format and will be overridden by year in time format.
defaultDayOfYearintegerDefault day of year is accepted as an optional field for cases like IRIG time format and will be overridden by day of year in time format.
channelConfigChannelConfig
Fields of
ChannelConfigprefixTreeDelimiterstringIf set, will construct a prefix tree for channels of the dataset using the given delimiter.
Set
typeto"newDataSourceV2".newDataSourceV2NewDataSource
Fields of
NewDataSourcesourceIngestSourcerequired
propertiesmap ofPropertyNameto string
labelsarray of string
descriptionstring
namestring
timeColumnSpecTimestampMetadata
channelConfigChannelConfig
timeOffsetSpecTimeOffsetSpec
Set
typeto"nanos".nanosDuration
Fields of
Durationsecondsinteger (int64) required
nanosinteger (int64) required
workspacestring (RID)The workspace in which to create the dataset. If not provided, the dataset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
Response
runRidstring (RID)
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-run" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"title": "<title>",
"description": "<description>",
"startTime": {
"secondsSinceEpoch": 1
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-run",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startTime": {"secondsSinceEpoch": 1},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-run",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startTime": {"secondsSinceEpoch": 1},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-run",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startTime": {"secondsSinceEpoch": 1},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"runRid": "<run rid>"
}
Ingest video#
POST /ingest/v1/ingest-video
Deprecated: Replaced by ingest.
Ingests video data from a S3 Nominal upload bucket.
Body
sourcesarray ofIngestSource
Set
typeto"s3".s3S3IngestSource
Fields of
S3IngestSourcepathstring required
Set
typeto"gcs".gcsGcsIngestSource
Fields of
GcsIngestSourcepathstring required
Set
typeto"presignedFile".presignedFilePresignedFileIngestSource
Fields of
PresignedFileIngestSourceurlstring required
Set
typeto"fileStore".fileStoreFileStoreIngestSource
Fields of
FileStoreIngestSourcefileRevisionRidstring (RID) required
propertiesmap ofPropertyNameto string
labelsarray of string
titlestring
descriptionstring
timestampsVideoTimestampManifestrequired
Set
typeto"noManifest".noManifestingest.api.NoTimestampManifest
Fields of
ingest.api.NoTimestampManifeststartingTimestampUtcTimestamprequired
Fields of
UtcTimestampsecondsSinceEpochinteger (int64) required
offsetNanosecondsinteger (int64)
scaleParameteringest.api.ScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampUtcTimestampthe timestamp corresponding to absolute starting timestamp plus absolute duration of the video.
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
Set
typeto"timestampManifests".timestampManifestsTimestampManifest
Fields of
TimestampManifestsourcesarray ofIngestSource
workspacestring (RID)The workspace in which to create the video. If not provided, the video will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
Response
videoRidstring (RID)
videoFileRidstring (RID)
asyncHandleAsyncHandledeprecatedDeprecated: Deprecated
Fields of
AsyncHandleridstring (RID)
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-video" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"timestamps": {
"type": "noManifest",
"noManifest": {
"startingTimestamp": {
"secondsSinceEpoch": 1
}
}
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-video",
headers={"Authorization": "Bearer <api key>"},
json={
"timestamps": {
"type": "noManifest",
"noManifest": {"startingTimestamp": {"secondsSinceEpoch": 1}},
},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-video",
headers={"Authorization": "Bearer <api key>"},
json={
"timestamps": {
"type": "noManifest",
"noManifest": {"startingTimestamp": {"secondsSinceEpoch": 1}},
},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-video",
headers={"Authorization": "Bearer <api key>"},
json={
"timestamps": {
"type": "noManifest",
"noManifest": {"startingTimestamp": {"secondsSinceEpoch": 1}},
},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"videoRid": "<video rid>",
"videoFileRid": "<video file rid>",
"asyncHandle": {
"rid": "<rid>"
}
}
Reingest from datasets#
POST /ingest/v1/reingest-dataset-files
Re-ingests data from provided source datasets into either an existing target dataset, or a new one. Only supported for CSV and Parquet dataset files. Will only reingest dataset files and will drop streaming data from datasets.
Body
sourceDatasetsarray of string (RID)The datasets to reingest data from. Can only include tagless, non-streaming datasets (V1). The datasets must be of the same granularity and must only include CSV or Parquet files. Will attempt to reingest from datasets in list order.
targetDatasetDatasetIngestTargetrequiredThe dataset to ingest data into. Can either be a new dataset or an existing dataset RID.
Set
typeto"new".newNewDatasetIngestDestination
Fields of
NewDatasetIngestDestinationdatasetNamestring
datasetDescriptionstring
propertiesmap ofPropertyNameto string
labelsarray of string
channelConfigChannelConfig
Fields of
ChannelConfigprefixTreeDelimiterstringIf set, will construct a prefix tree for channels of the dataset using the given delimiter.
workspacestring (RID)The workspace in which to create the dataset. If not provided, the dataset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
markingRidsarray of string (RID)The markings to apply to the created dataset. If not provided, the dataset will be visible to all users in the same workspace.
Set
typeto"existing".existingExistingDatasetIngestDestination
Fields of
ExistingDatasetIngestDestinationdatasetRidstring (RID) required
expandRunBoundsarray of string (RID)The ingest will keep track of the range of timestamps in the ingested data and update the included run’s time bounds. For runs with no end time (uninitialized), it will always set the start time to the file’s start time and set the end time to the file’s end time. For runs with existing end times, it will only expand the bounds (earliest start time, latest end time).
ingestMetadatamap ofDatasetRidtoIngestMetadataMapping of dataset to ingest metadata. Ingest metadata only needs to be provided in request if it cannot be recovered from prior ingests. See documentation on each field to determine what metadata can be auto-recovered.
Fields of
IngestMetadatatimestampMetadataTimestampMetadataThe timestamp metadata will be recovered from the dataset files if possible. Older datasets may have unrecoverable timestamp metadata. If unrecoverable, reingestion will throw MissingMetadataForReingest if not provided in request.
Fields of
TimestampMetadataseriesNamestring required
timestampTypeTimestampTyperequired
Set
typeto"relative".relativeRelativeTimestamp
Fields of
RelativeTimestamptimeUnitTimeUnitrequired
Values of
TimeUnitDAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
offsetstring (date-time)Starting timestamp to use when indexing the file. This field is required when uploading a new file to an existing dataset.
Set
typeto"absolute".absoluteAbsoluteTimestamp
Set
typeto"iso8601".iso8601Iso8601Timestamp
Set
typeto"epochOfTimeUnit".epochOfTimeUnitEpochTimestamp
Fields of
EpochTimestamptimeUnitTimeUnitrequired
Set
typeto"customFormat".customFormatCustomTimestamp
Fields of
CustomTimestampformatstring requiredThe format string should be in the format of the
DateTimeFormatterclass in Java.defaultYearintegerDefault year is accepted as an optional field for cases like IRIG time format and will be overridden by year in time format.
defaultDayOfYearintegerDefault day of year is accepted as an optional field for cases like IRIG time format and will be overridden by day of year in time format.
channelPrefixstringChannel prefix to use when reingesting the dataset. Defaults to empty string. Not recoverable from prior ingests and must be provided in request if needed.
channelNameOverridesmap ofColumnNameto stringRenames individual columns to explicit channel names. Composes with channelPrefix:
final name = channelPrefix + channelNameOverrides.getOrDefault(column, column). Defaults to empty map. Not recoverable from prior ingests and must be provided in request if needed. At most 1000 entries may be provided. Resolved channel names must be unique across columns; renaming a column onto another column’s name fails the ingest.tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from. Not recoverable from prior ingests and must be provided in request if needed.
additionalFileTagsmap ofTagNameto stringAdditional tags to apply to all dataset files within the the given dataset. Not recoverable from prior ingests and must be provided in request if needed.
Response
datasetsmap ofDatasetRidtoReingestFilesMapping
Fields of
ReingestFilesMappingfileMapmap ofDatasetFileIdtoIngestDetails
Set
typeto"dataset".datasetIngestDatasetFileDetails
Fields of
IngestDatasetFileDetailsdatasetFileIdstring (UUID)
datasetRidstring (RID)
Set
typeto"video".videoIngestVideoFileDetailsdeprecatedDeprecated: Returned only for legacy Video-entity ingests; videoV2 ingests return dataset details carrying the created dataset file id.
Fields of
IngestVideoFileDetailsvideoFileRidstring (RID)
videoRidstring (RID)
Set
typeto"spatial".spatialIngestSpatialDetails
Fields of
IngestSpatialDetailsspatialRidstring (RID)
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/reingest-dataset-files" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"targetDataset": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {
"<key>": "<property value>"
},
"labels": [
"<label>"
],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>"
},
"workspace": "<workspace rid>",
"markingRids": [
"<marking rid>"
]
}
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/reingest-dataset-files",
headers={"Authorization": "Bearer <api key>"},
json={
"targetDataset": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {"prefixTreeDelimiter": "<prefix tree delimiter>"},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/reingest-dataset-files",
headers={"Authorization": "Bearer <api key>"},
json={
"targetDataset": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {"prefixTreeDelimiter": "<prefix tree delimiter>"},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/ingest/v1/reingest-dataset-files",
headers={"Authorization": "Bearer <api key>"},
json={
"targetDataset": {
"type": "new",
"new": {
"datasetName": "<dataset name>",
"datasetDescription": "<dataset description>",
"properties": {"<key>": "<property value>"},
"labels": ["<label>"],
"channelConfig": {
"prefixTreeDelimiter": "<prefix tree delimiter>",
},
"workspace": "<workspace rid>",
"markingRids": ["<marking rid>"],
},
},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"datasets": {
"<key>": {
"fileMap": {
"<key>": {
"type": "dataset",
"dataset": {
"datasetFileId": "<dataset file id>",
"datasetRid": "<dataset rid>"
}
}
}
}
}
}
Delete file#
DELETE /ingest/v1/delete-file/{datasetRid}/file/{fileId}
This is a best effort deletion of the file’s data based on the ingestedAt timestamp. This is an unreversible action. Only v2 dataset file deletion is supported. !!!WARNING!!! It’s possible that the file has overwritten points, in which case, those older points will not be recovered. Only use this endpoint if this is acceptable, the data across files are disjoint, or you’re willing to re-ingest files to manually recover older points.
Path parameters
datasetRidstring (RID) required
fileIdstring (UUID) required
Response
No content (HTTP 204).
Request
curl -X DELETE "https://api.gov.nominal.io/api/ingest/v1/delete-file/<dataset rid>/file/<file id>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.delete(
"https://api.gov.nominal.io/api/ingest/v1/delete-file/<dataset rid>/file/<file id>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.delete(
"https://api.gov.nominal.io/api/ingest/v1/delete-file/<dataset rid>/file/<file id>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.delete(
"https://api.gov.nominal.io/api/ingest/v1/delete-file/<dataset rid>/file/<file id>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Errors#
Errors shows how these errors are sent.
Each error’s errorName is UploadService: followed by its name below.
Status |
Name |
Notes |
|---|---|---|
400 |
|
|
400 |
|
|
400 |
|
|
400 |
|
|
400 |
|
A multipart-upload follow-up call specified a |
400 |
|
Both |
403 |
|
|
404 |
|
The resource referenced by an upload’s |
404 |
|
A multipart-upload follow-up call named a File Store object the ledger has no row for. A malformed key and an unknown one are reported identically, so a caller cannot tell which of the two it supplied. |
Each error’s errorName is IngestService: followed by its name below.
Status |
Name |
Notes |
|---|---|---|
400 |
|
All dataset granularities must match. |
400 |
|
Neither the containerized extractor (or its active container image) nor the ingest request provides timestamp metadata, so the extractor output cannot be indexed. Register the image with default timestamp metadata or supply it on the request. |
400 |
|
|
400 |
|
The dataset file is part of a multi-file ingest job and cannot be deleted on its own. Delete the entire ingest job instead. |
400 |
|
|
400 |
|
|
400 |
|
|
400 |
|
The inputs provided to the ingest job are incompatible with each other |
400 |
|
The ingest job exists but is not compatible to be re-run. |
400 |
|
|
400 |
|
|
400 |
|
|
400 |
|
|
400 |
|
The timestamp metadata required to reingest the dataset is missing and must be provided in the request. |
400 |
|
Cannot ingest multiple datasets in parallel into older datasets. It is recommended to reingest all source datasets and the target dataset into a new dataset destination. |
400 |
|
The target dataset is included in the source datasets. |
400 |
|
The number of files to reingest is too large. |
400 |
|
|
400 |
|
|
400 |
|
|
403 |
|
The user is not authorized to access the containerized extractor password. |
404 |
|
The target dataset file could not be found. |
404 |
|
The target dataset could not be found. |
404 |
|
|
404 |
|
The ingest transform does not exist, or its parent ingest job is not visible to the caller. Returned as NOT_FOUND (rather than PERMISSION_DENIED) to avoid leaking existence information about transforms the caller cannot see. |
404 |
|
|
404 |
|
The streaming session could not be found. |
409 |
|
The ingest job exists but is in a terminal state (COMPLETED, FAILED, or CANCELLED) and therefore cannot be cancelled. |
500 |
|
|
500 |
|
|
500 |
|
A prior ingest job already exists for this idempotency key but never produced a dataset (the original submit did not get far enough). The idempotency key deduplicates to that existing job and does not re-run ingestion; rerun the job identified by ingestJobRid to complete it. |
Types#
AbsoluteTimestamp#
Set type to the name of one of the other fields, and set only that field.
iso8601Iso8601Timestamp
epochOfTimeUnitEpochTimestamp
customFormatCustomTimestamp
AsyncHandle#
ridstring (RID) required
AvroNumericTimestampType#
Describes how the numeric timestamps column in an Avro Stream file should be interpreted. The Avro schema models timestamps as an array of longs, so only numeric timestamp variants are supported (no ISO-8601 / custom string formats).
Set type to the name of one of the other fields, and set only that field.
epochEpochTimestamp
relativeRelativeTimestamp
AvroStreamOpts#
Options for ingesting Avro data with the following schema. This is a “stream-like” file format to support use cases where a columnar/tabular format does not make sense. This closely matches Nominal’s streaming API, making it useful for use cases where network connection drops during streaming and a backup file needs to be created.
If this schema is not used, will result in a failed ingestion. { “type”: “record”, “name”: “AvroStream”, “namespace”: “io.nominal.ingest”, “fields”: [ { “name”: “channel”, “type”: “string”, “doc”: “Channel/series name (e.g., ‘vehicle_id’, ‘col_1’, ‘temperature’)”, }, { “name”: “timestamps”, “type”: {“type”: “array”, “items”: “long”}, “doc”: “Array of numeric timestamps; see timestampType for interpretation”, }, { “name”: “values”, “type”: {“type”: “array”, “items”: [“double”, “string”]}, “doc”: “Array of values. Can either be doubles or strings”, }, { “name”: “tags”, “type”: {“type”: “map”, “values”: “string”}, “default”: {}, “doc”: “Key-value metadata tags”, }, ], }
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
timestampTypeAvroNumericTimestampTypeHow to interpret the numeric values in the
timestampsarray. Defaults to epoch-nanoseconds when omitted, matching the original contract of this API.
ChannelConfig#
prefixTreeDelimiterstringIf set, will construct a prefix tree for channels of the dataset using the given delimiter.
ContainerizedOpts#
sourcesmap ofEnvironmentVariabletoIngestSource
argumentsmap ofEnvironmentVariableto string
extractorRidstring (RID) required
timestampMetadataTimestampMetadata
tagstring
targetDatasetIngestTargetrequired
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
CsvOpts#
Options for ingesting csv files. Supported file formats include .csv, .csv.gz
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampMetadataTimestampMetadatarequired
channelPrefixstring required
channelNameOverridesmap ofColumnNameto string
tagKeysFromColumnsarray of string deprecatedDeprecated: Deprecated in favor of tagColumns.
tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
excludeColumnsarray of stringA set of column names to exclude from ingestion. These columns will not be ingested as channels. Useful for excluding columns that contain unsupported data types like multidimensional arrays.
CustomTimestamp#
formatstring requiredThe format string should be in the format of the
DateTimeFormatterclass in Java.defaultYearintegerDefault year is accepted as an optional field for cases like IRIG time format and will be overridden by year in time format.
defaultDayOfYearintegerDefault day of year is accepted as an optional field for cases like IRIG time format and will be overridden by day of year in time format.
DataflashOpts#
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
ignoreInvalidTimestampsbooleanIf true, skips dataflash records whose timestamp cannot be represented (corrupted/out-of-range) instead of failing the entire ingest. If not provided, defaults to false.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
DatasetIngestTarget#
Set type to the name of one of the other fields, and set only that field.
newNewDatasetIngestDestination
existingExistingDatasetIngestDestination
DeprecatedNewCsv#
sourceIngestSourcerequired
namestring
propertiesmap of string to string
timeColumnSpecTimestampMetadata
channelConfigChannelConfig
DeprecatedNewDataSource#
Set type to the name of one of the other fields, and set only that field.
csvDeprecatedNewCsv
Duration#
secondsinteger (int64) required
nanosinteger (int64) required
Empty#
An empty JSON object, {}.
EpochTimestamp#
timeUnitTimeUnitrequired
ExistingDatasetIngestDestination#
datasetRidstring (RID) required
expandRunBoundsarray of string (RID)The ingest will keep track of the range of timestamps in the ingested data and update the included run’s time bounds. For runs with no end time (uninitialized), it will always set the start time to the file’s start time and set the end time to the file’s end time. For runs with existing end times, it will only expand the bounds (earliest start time, latest end time).
ExistingSpatialIngestDestination#
spatialRidstring (RID) required
ExistingVideoIngestDestination#
videoRidstring (RID) requiredRID of the video to ingest the newly created video file to.
videoFileDetailsVideoFileIngestDetailsMetadata to associate with any created video file
FileStoreIngestSource#
A resolved File Store revision to ingest, whose bytes are read in place from File Store storage.
fileRevisionRidstring (RID) required
GcsIngestSource#
pathstring required
ingest.api.NoTimestampManifest#
startingTimestampUtcTimestamprequired
scaleParameteringest.api.ScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
ingest.api.ScaleParameter#
Set type to the name of one of the other fields, and set only that field.
trueFrameRatenumber
endingTimestampUtcTimestampthe timestamp corresponding to absolute starting timestamp plus absolute duration of the video.
scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
IngestDatasetFileDetails#
datasetFileIdstring (UUID)
datasetRidstring (RID) required
IngestDataSource#
Set type to the name of one of the other fields, and set only that field.
existingDataSourcestring (RID)
newDataSourceDeprecatedNewDataSource
newDataSourceV2NewDataSource
IngestDetails#
Set type to the name of one of the other fields, and set only that field.
datasetIngestDatasetFileDetails
videoIngestVideoFileDetailsdeprecatedDeprecated: Returned only for legacy Video-entity ingests; videoV2 ingests return dataset details carrying the created dataset file id.
spatialIngestSpatialDetails
IngestMetadata#
timestampMetadataTimestampMetadataThe timestamp metadata will be recovered from the dataset files if possible. Older datasets may have unrecoverable timestamp metadata. If unrecoverable, reingestion will throw MissingMetadataForReingest if not provided in request.
channelPrefixstringChannel prefix to use when reingesting the dataset. Defaults to empty string. Not recoverable from prior ingests and must be provided in request if needed.
channelNameOverridesmap ofColumnNameto stringRenames individual columns to explicit channel names. Composes with channelPrefix:
final name = channelPrefix + channelNameOverrides.getOrDefault(column, column). Defaults to empty map. Not recoverable from prior ingests and must be provided in request if needed. At most 1000 entries may be provided. Resolved channel names must be unique across columns; renaming a column onto another column’s name fails the ingest.tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from. Not recoverable from prior ingests and must be provided in request if needed.
additionalFileTagsmap ofTagNameto stringAdditional tags to apply to all dataset files within the the given dataset. Not recoverable from prior ingests and must be provided in request if needed.
IngestOptions#
Set type to the name of one of the other fields, and set only that field.
dataflashDataflashOpts
mcapProtobufTimeseriesMcapProtobufTimeseriesOpts
journalJsonJournalJsonOpts
csvCsvOpts
parquetParquetOpts
videoVideoOptsdeprecatedDeprecated: Legacy Video-entity ingest. Use videoV2, which ingests video as a channel on a dataset.
videoV2VideoOptsV2
containerizedContainerizedOpts
avroStreamAvroStreamOpts
pointCloudPointCloudOpts
IngestRunDataSource#
dataSourceIngestDataSourcerequired
timeOffsetSpecTimeOffsetSpec
IngestSource#
Set type to the name of one of the other fields, and set only that field.
s3S3IngestSource
gcsGcsIngestSource
presignedFilePresignedFileIngestSource
fileStoreFileStoreIngestSource
IngestSpatialDetails#
spatialRidstring (RID) required
IngestVideoFileDetails#
videoFileRidstring (RID) required
videoRidstring (RID) required
Iso8601Timestamp#
An empty JSON object, {}.
JournalJsonOpts#
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
channelstringIf provided, ingests logs to the given channel. By default, log data will be ingested to a channel named ‘logs’.
timestampMetadataJournalTimestampMetadataOptional timestamp field for the JSON lines. When provided, each line is timestamped from this field instead of the journald default
__REALTIME_TIMESTAMP, allowing non-journald JSON logs to ingest. Each line must still contain aMESSAGEfield. Only numeric epoch timestamps are supported. When absent, the journald default (__REALTIME_TIMESTAMP, microseconds) is used.
JournalTimestampMetadata#
fieldNamestring required
epochOfTimeUnitEpochTimestamprequired
LogTime#
An empty JSON object, {}.
McapChannelLocator#
Locator for a channel in an mcap file. Channel name is not guaranteed to be unique, so channel ID should be used for mcap files with duplicate channel names.
Set type to the name of one of the other fields, and set only that field.
topicstring
idinteger
McapChannels#
Set type to the name of one of the other fields, and set only that field.
allEmpty
includearray ofMcapChannelLocator
excludearray ofMcapChannelLocator
McapProtobufTimeseriesOpts#
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
channelFilterMcapChannelsrequired
timestampTypeMcapTimestampTyperequired
ignoreInvalidTopicsbooleanIf true, skips invalid MCAP topics during ingestion instead of failing the entire ingest. If not provided, defaults to false.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
McapTimestampManifest#
Timestamps are derived from the mcap file containing the video frames.
mcapChannelLocatorMcapChannelLocatorrequired
McapTimestampType#
LogTime is default timestamp for MCAP messages and should be used in most cases.
Set type to the name of one of the other fields, and set only that field.
logTimeLogTime
NewDatasetIngestDestination#
datasetNamestring
datasetDescriptionstring
propertiesmap ofPropertyNameto string
labelsarray of string
channelConfigChannelConfig
workspacestring (RID)The workspace in which to create the dataset. If not provided, the dataset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
markingRidsarray of string (RID)The markings to apply to the created dataset. If not provided, the dataset will be visible to all users in the same workspace.
NewDataSource#
sourceIngestSourcerequired
propertiesmap ofPropertyNameto string
labelsarray of string
descriptionstring
namestring
timeColumnSpecTimestampMetadata
channelConfigChannelConfig
NewVideoIngestDestination#
titlestringTitle of the Video that will get created. If not provided, a name is deduced from the ingested file.
descriptionstringDescription that is applied to the newly created video
propertiesmap ofPropertyNameto stringKey-Value properties that are applied to the newly created video
labelsarray of stringLabels that are applied to the newly created video
videoFileDetailsVideoFileIngestDetailsMetadata to associate with any created video file
workspacestring (RID)The workspace in which to create the video. If not provided, the video will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
markingRidsarray of string (RID)The markings to apply to the created video. If not provided, the video will be visible to all users in the same workspace.
ParquetOpts#
Options for ingesting parquet files. Supported file formats include .parquet, .parquet.gz and archives such as .tar, .tar.gz, and .zip (must set the isArchive flag).
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampMetadataTimestampMetadatarequired
channelPrefixstring required
channelNameOverridesmap ofColumnNameto string
tagKeysFromColumnsarray of string deprecatedDeprecated: Deprecated in favor of tagColumns.
tagColumnsmap ofTagNameto stringA map of tag names to column names to derive the tag values from.
additionalFileTagsmap ofTagNameto stringSpecifies a tag set to apply to all data in the file.
isArchivebooleanIf true, the file is an archive. Supported archive formats include .tar, .tar.gz, and .zip. Only files ending in .parquet within the archive will be ingested. If field not provided, defaults to false.
excludeColumnsarray of stringA set of column names to exclude from ingestion. These columns will not be ingested as channels. Useful for excluding columns that contain unsupported data types like multidimensional arrays.
PointCloudIngestTarget#
Set type to the name of one of the other fields, and set only that field.
existingExistingSpatialIngestDestination
PointCloudMetadata#
Metadata about the sensor that captured a point cloud.
sensorModelstringThe sensor model name, e.g. “Velodyne VLP-16”, “Ouster OS1-128”.
coordinateSystemstringCoordinate reference system identifier, e.g. “EPSG:4326”, “ENU”.
resolutionMmnumberSpatial resolution of the point cloud in millimeters.
scanPatternScanPatternThe scan pattern of the lidar sensor.
PointCloudOpts#
Options for ingesting point cloud data into Dagger via Nominal.
sourceIngestSourcerequired
targetPointCloudIngestTargetrequired
daggerImportConfigany JSON value requiredThe Dagger **v2**
ImportRequestbody — everything from that schema exceptsource_uri, which Nominal fills in from the resolved presigned URL forsource. Forwarded to Dagger’sPOST /v2/imports/{model_uuid}. Construct via the language’s generated dagger-client types (e.g.dagger_client.models.ImportRequestin Python). Carries the requiredarchetype(attribute definitions and sampler configuration), an optionalformat(the source format and its format-specific parameters, including thegeometry_typeandcolumnsa CSV source needs; omit it to let Dagger infer the format from the file extension), and an optionalquiche_config— all of which are domain knowledge the client owns when it produced the file. The legacy v1 shape, withgeometry_typeandcolumnsat the top level, is rejected.sensorMetadataPointCloudMetadataSensor metadata to associate with the point cloud.
channelstring requiredChannel name for workbook integration.
tagsmap ofTagNameto stringTags to apply to the point cloud series.
PresignedFileIngestSource#
urlstring required
ReingestFilesMapping#
Maps the source dataset file ID to the destination dataset and file ID.
fileMapmap ofDatasetFileIdtoIngestDetails
RelativeTimestamp#
timeUnitTimeUnitrequired
offsetstring (date-time)Starting timestamp to use when indexing the file. This field is required when uploading a new file to an existing dataset.
S3IngestSource#
pathstring required
ScanPattern#
ROTATING
SOLID_STATE
FLASH
MECHANICAL
TimeOffsetSpec#
Set type to the name of one of the other fields, and set only that field.
nanosDuration
Timestamp#
Deprecated for new APIs. Use google.protobuf.Timestamp for absolute instants in proto APIs.
This legacy nanosecond precision timestamp type is represented by an epoch time in seconds and a nanosecond offset. The nanosecond offset is from the start of the epoch second, so must be less than 1 billion.
secondsinteger (int64) required
nanosinteger (int64) required
TimestampManifest#
The timestamp manifest files will contain a list of absolute timestamps, in nanoseconds, that correspond to each frame in a video. Each file should be of type JSON and store a single list, the length of which equals the number of frames in its corresponding video.
sourcesarray ofIngestSource
TimestampMetadata#
seriesNamestring required
timestampTypeTimestampTyperequired
TimestampType#
Set type to the name of one of the other fields, and set only that field.
relativeRelativeTimestamp
absoluteAbsoluteTimestamp
TimeUnit#
DAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
UtcTimestamp#
secondsSinceEpochinteger (int64) required
offsetNanosecondsinteger (int64)
video.api.NoTimestampManifest#
these values will not be updated after ingest time, to allow for resetting. The updated values are stored implicitly through the segment timestamps.
startingTimestampTimestamprequiredSpecifies the original starting timestamp of the video.
scaleParametervideo.api.ScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
video.api.ScaleParameter#
Set type to the name of one of the other fields, and set only that field.
trueFrameRatenumber
endingTimestampTimestamp
scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
VideoFileIngestDetails#
fileDescriptionstringDescription that is applied to the newly created video file. If not provided, defaults to the description used to create the video.
filePropertiesmap ofPropertyNameto string deprecatedKey-Value properties that are applied to the newly created video file. Deprecated: Field is ignored as video files do not have properties. Will be removed after 4/5/2025
fileLabelsarray of string deprecatedLabels that are applied to the newly created video file. Deprecated: Field is ignored as video files do not have labels. Will be removed after 4/5/2025
VideoFileTimestampManifest#
A video file’s timestamp manifest specifies how to determine absolute timestamps for each frame. In an MCAP file, this data is embedded within the source file. Alternatively, the manifest may be provided as an external sidecar file. If no manifest is available, the timestamps are calculated by applying a starting offset to the presentation timestamp of each frame.
Set type to the name of one of the other fields, and set only that field.
mcapMcapTimestampManifest
s3pathstring
s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
noManifestvideo.api.NoTimestampManifest
VideoIngestTarget#
Set type to the name of one of the other fields, and set only that field.
newNewVideoIngestDestination
existingExistingVideoIngestDestination
VideoOpts#
sourceIngestSourcerequired
targetVideoIngestTargetrequired
timestampManifestVideoFileTimestampManifestrequired
overWriteSegmentsbooleanIf true, overlapping segments from other video files within the same video will be deleted before inserting new segments. The cached segment metadata for affected files will be recomputed.
VideoOptsV2#
sourceIngestSourcerequired
targetDatasetIngestTargetrequired
timestampManifestVideoFileTimestampManifestrequired
channelstring required
tagsmap ofTagNameto string
overWriteSegmentsbooleanIf true, overlapping segments from other dataset files within the same series will be deleted before inserting new segments. The cached segment metadata for affected files will be recomputed.
VideoTimestampManifest#
Set type to the name of one of the other fields, and set only that field.
noManifestingest.api.NoTimestampManifest
timestampManifestsTimestampManifest
Page design based on Scalar, MIT License.