Ingest automation service#
Creates and reports on ingest automations: server-side workflows that take an upload (one or more files) through asset/dataset/data-scope/run creation, ingest, and channel availability. Backs the upload wizard’s “Quick look” mode; the frontend creates the accompanying workbook. All endpoints validate that the target workspace is the sandbox workspace while the feature is gated. Resources are created as the requesting user.
OpenAPI file: IngestAutomationService.json
Endpoints#
Create ingest automation#
POST /ingest/v1/ingest-automations
Creates the automation and starts its workflow, returning immediately. Poll getIngestAutomation for progress. Throws WorkspaceNotSandbox outside the sandbox workspace while the feature is gated.
Body
workspaceRidstring (RID) required
sourcesarray ofIngestSourceLocations of the already-uploaded files, all ingested into the same dataset. At least one; at most 20 (enforced by the handler). Only s3 sources are supported today.
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
timestampMetadataTimestampMetadatarequiredThe timestamp column and interpretation the user confirmed in the wizard, applied to every file.
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.
fileTypeIngestAutomationFileTypeThe format of every file in sources, ingested as wide-format data. Defaults to CSV when absent.
Values of
IngestAutomationFileTypeCSV
PARQUET
assetTitlestring requiredMaximum length 500 characters (enforced by the handler, like the other titles).
datasetTitlestring requiredMaximum length 500 characters.
runTitlestring requiredMaximum length 500 characters.
refNamestring requiredData scope name linking the created asset and dataset (typically “default”). Maximum length 100 characters.
Response
ridstring (RID)
statusIngestAutomationStatus
Values of
IngestAutomationStatusCREATING_RESOURCES
INGESTING
AWAITING_CHANNELS
COMPLETED
FAILED
workspaceRidstring (RID)
createdByRidstring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
assetRidstring (RID)Present once CREATING_RESOURCES has created the asset.
datasetRidstring (RID)Present once CREATING_RESOURCES has created the dataset.
runRidstring (RID)Present once CREATING_RESOURCES has created the run.
ingestJobRidstring (RID)Present once INGESTING has submitted the ingest job.
failedStepIngestAutomationStepThe step that terminated the automation. Present only for FAILED automations.
Values of
IngestAutomationStepCREATE_RESOURCES
SUBMIT_INGEST
AWAIT_INGEST
AWAIT_CHANNELS
errorMessagestringThe failure detail recorded when the automation terminated. Present only for FAILED automations. May contain customer-derived content and is therefore not safe to log.
Request
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-automations" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"workspaceRid": "<workspace rid>",
"timestampMetadata": {
"seriesName": "<series name>",
"timestampType": {
"type": "relative",
"relative": {
"timeUnit": "DAYS"
}
}
},
"assetTitle": "<asset title>",
"datasetTitle": "<dataset title>",
"runTitle": "<run title>",
"refName": "<ref name>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-automations",
headers={"Authorization": "Bearer <api key>"},
json={
"workspaceRid": "<workspace rid>",
"timestampMetadata": {
"seriesName": "<series name>",
"timestampType": {"type": "relative", "relative": {"timeUnit": "DAYS"}},
},
"assetTitle": "<asset title>",
"datasetTitle": "<dataset title>",
"runTitle": "<run title>",
"refName": "<ref name>",
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/ingest/v1/ingest-automations",
headers={"Authorization": "Bearer <api key>"},
json={
"workspaceRid": "<workspace rid>",
"timestampMetadata": {
"seriesName": "<series name>",
"timestampType": {"type": "relative", "relative": {"timeUnit": "DAYS"}},
},
"assetTitle": "<asset title>",
"datasetTitle": "<dataset title>",
"runTitle": "<run title>",
"refName": "<ref name>",
},
)
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-automations",
headers={"Authorization": "Bearer <api key>"},
json={
"workspaceRid": "<workspace rid>",
"timestampMetadata": {
"seriesName": "<series name>",
"timestampType": {
"type": "relative",
"relative": {"timeUnit": "DAYS"},
},
},
"assetTitle": "<asset title>",
"datasetTitle": "<dataset title>",
"runTitle": "<run title>",
"refName": "<ref name>",
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<ingest automation rid>",
"status": "CREATING_RESOURCES",
"workspaceRid": "<workspace rid>",
"createdByRid": "<user rid>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"assetRid": "<asset rid>",
"datasetRid": "<dataset rid>",
"runRid": "<run rid>",
"ingestJobRid": "<ingest job rid>",
"failedStep": "CREATE_RESOURCES",
"errorMessage": "<error message>"
}
Get ingest automation#
GET /ingest/v1/ingest-automations/{rid}
Returns the automation’s current status and the RIDs of every resource created so far.
Path parameters
ridstring (RID) required
Response
ridstring (RID)
statusIngestAutomationStatus
Values of
IngestAutomationStatusCREATING_RESOURCES
INGESTING
AWAITING_CHANNELS
COMPLETED
FAILED
workspaceRidstring (RID)
createdByRidstring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
assetRidstring (RID)Present once CREATING_RESOURCES has created the asset.
datasetRidstring (RID)Present once CREATING_RESOURCES has created the dataset.
runRidstring (RID)Present once CREATING_RESOURCES has created the run.
ingestJobRidstring (RID)Present once INGESTING has submitted the ingest job.
failedStepIngestAutomationStepThe step that terminated the automation. Present only for FAILED automations.
Values of
IngestAutomationStepCREATE_RESOURCES
SUBMIT_INGEST
AWAIT_INGEST
AWAIT_CHANNELS
errorMessagestringThe failure detail recorded when the automation terminated. Present only for FAILED automations. May contain customer-derived content and is therefore not safe to log.
Request
curl "https://api.gov.nominal.io/api/ingest/v1/ingest-automations/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.get(
"https://api.gov.nominal.io/api/ingest/v1/ingest-automations/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.get(
"https://api.gov.nominal.io/api/ingest/v1/ingest-automations/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.gov.nominal.io/api/ingest/v1/ingest-automations/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<ingest automation rid>",
"status": "CREATING_RESOURCES",
"workspaceRid": "<workspace rid>",
"createdByRid": "<user rid>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"assetRid": "<asset rid>",
"datasetRid": "<dataset rid>",
"runRid": "<run rid>",
"ingestJobRid": "<ingest job rid>",
"failedStep": "CREATE_RESOURCES",
"errorMessage": "<error message>"
}
Errors#
Errors shows how these errors are sent.
Each error’s errorName is IngestAutomation: followed by its name below.
Status |
Name |
Notes |
|---|---|---|
400 |
|
Ingest automations are temporarily restricted to the sandbox workspace while the “Quick look” upload mode is gated (see the Quick look upon ingest RFC). Lifting the restriction removes this validation. |
404 |
|
Types#
AbsoluteTimestamp#
Set type to the name of one of the other fields, and set only that field.
iso8601Iso8601Timestamp
epochOfTimeUnitEpochTimestamp
customFormatCustomTimestamp
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.
EpochTimestamp#
timeUnitTimeUnitrequired
FileStoreIngestSource#
A resolved File Store revision to ingest, whose bytes are read in place from File Store storage.
fileRevisionRidstring (RID) required
GcsIngestSource#
pathstring required
IngestAutomationFileType#
The format of the uploaded files. Every file in one automation shares it.
CSV
PARQUET
IngestAutomationStatus#
Progress of an ingest automation, in execution order. Statuses map one-to-one onto the client’s progress checklist. Resources created before a FAILED terminal state persist (the flow is intentionally non-atomic, matching the existing ingest flow).
CREATING_RESOURCES
INGESTING
AWAITING_CHANNELS
COMPLETED
FAILED
IngestAutomationStep#
The individual workflow steps, used to report where a FAILED automation stopped.
CREATE_RESOURCES
SUBMIT_INGEST
AWAIT_INGEST
AWAIT_CHANNELS
IngestSource#
Set type to the name of one of the other fields, and set only that field.
s3S3IngestSource
gcsGcsIngestSource
presignedFilePresignedFileIngestSource
fileStoreFileStoreIngestSource
Iso8601Timestamp#
An empty JSON object, {}.
PresignedFileIngestSource#
urlstring required
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
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
Page design based on Scalar, MIT License.