# Ingest job service

Public API for querying ingest jobs.

OpenAPI file: [`IngestJobService.json`](https://dev.nominal.io/api/_downloads/e5c220f0c4d188c7004c3d59690acad3/IngestJobService.json)

## Endpoints

### Get ingest job

GET `/ingest/v1/ingest-job/{ingestJobRid}`

Returns a single ingest job by RID. Does not include the full ingest request details.

Path parameters

`ingestJobRid` string (RID) required
:   ​

Response

`ingestJobRid` string (RID)
:   ​

`status` [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
:   ​

    Values of `IngestJobStatus`

    `SUBMITTED`
    :   ​

    `QUEUED`
    :   ​

    `IN_PROGRESS`
    :   ​

    `COMPLETED`
    :   ​

    `FAILED`
    :   ​

    `CANCELLED`
    :   ​

    `DELETION_IN_PROGRESS`
    :   ​

    `DELETED`
    :   ​

`originFiles` array of string
:   ​

`createdBy` string (UUID) deprecated
:   **Deprecated:** use createdByRid instead

`createdByRid` string (RID)
:   ​

`orgUuid` string (UUID)
:   ​

`ingestType` [`IngestType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttype)
:   ​

    Values of `IngestType`

    `TABULAR`
    :   ​

    `MCAP`
    :   ​

    `DATAFLASH`
    :   ​

    `JOURNAL_JSON`
    :   ​

    `CONTAINERIZED`
    :   ​

    `VIDEO`
    :   ​

    `AVRO_STREAM`
    :   ​

    `POINT_CLOUD`
    :   ​

    `MULTI`
    :   ​

`datasetRid` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`startTime` string (date-time)
:   The time the job transitioned to IN_PROGRESS. Absent for jobs that have not started running yet (SUBMITTED, QUEUED).

`endTime` string (date-time)
:   ​

`producedFileCount` integer
:   Count of dataset files produced by this ingest job.

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-job/<ingest job rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "ingestJobRid": "<ingest job rid>",
  "status": "SUBMITTED",
  "originFiles": [
    "<origin files>"
  ],
  "createdBy": "<created by>",
  "createdByRid": "<user rid>",
  "orgUuid": "<org uuid>",
  "ingestType": "TABULAR",
  "datasetRid": "<dataset rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "startTime": "2026-01-01T00:00:00Z",
  "endTime": "2026-01-01T00:00:00Z",
  "producedFileCount": 1
}
```

### Get ingest transform

GET `/ingest/v1/ingest-transform/{ingestTransformRid}`

Returns a single ingest transform by RID. The caller must be authorized to read the dataset produced by the transform’s parent ingest job; a transform whose parent job is not visible to the caller is reported as IngestTransformNotFound rather than leaking its existence.

Path parameters

`ingestTransformRid` string (RID) required
:   ​

Response

`ingestTransformRid` string (RID)
:   ​

`ingestJobRid` string (RID)
:   The ingest job this transform belongs to.

`transformType` [`IngestTransformType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformtype)
:   ​

    Values of `IngestTransformType`

    `CONTAINERIZED`
    :   ​

    `MCAP`
    :   ​

    `DATAFLASH`
    :   ​

    `PARQUET_ARCHIVE`
    :   ​

    `FILE_COPY`
    :   ​

`status` [`IngestTransformStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformstatus)
:   ​

    Values of `IngestTransformStatus`

    `QUEUED`
    :   ​

    `IN_PROGRESS`
    :   ​

    `COMPLETED`
    :   ​

    `FAILED`
    :   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`errorMessage` string
:   The failure detail recorded when the transform terminated. Present only for FAILED transforms. May contain customer-derived content and is therefore not safe to log.

`finishedAt` string (date-time)
:   The time the transform reached a terminal status (COMPLETED or FAILED). Absent while the transform is still QUEUED or IN_PROGRESS.

`extractorRid` string (RID)
:   The containerized extractor running this transform. Present only for CONTAINERIZED transforms.

`sourcePaths` array of string
:   Locators of the transform’s input file(s): S3/GCS paths, presigned URLs (query string stripped so no signing credentials are carried), or File Store file-revision rids. CONTAINERIZED transforms may have several inputs, ordered by the container environment variable they bind to; other types have exactly one. Empty when this server version cannot interpret the stored payload. May contain customer-derived content and is therefore not safe to log.

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-transform/<ingest transform rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "ingestTransformRid": "<ingest transform rid>",
  "ingestJobRid": "<ingest job rid>",
  "transformType": "CONTAINERIZED",
  "status": "QUEUED",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "errorMessage": "<error message>",
  "finishedAt": "2026-01-01T00:00:00Z",
  "extractorRid": "<containerized extractor rid>",
  "sourcePaths": [
    "<source paths>"
  ]
}
```

### Get ingest transform origin file uris

GET `/ingest/v1/ingest-transform/{ingestTransformRid}/origin-uris`

Returns pre-signed download URIs for a transform’s input file(s), keyed on the transform rather than on a produced dataset file, so the inputs of a transform that produced no file — one that is still running, or that failed — remain downloadable. Counterpart to the catalog’s getOriginFileUris, which requires a dataset file to key on.

The caller must be authorized to read data on the parent ingest job’s dataset; a transform whose parent job is not visible to the caller is reported as IngestTransformNotFound.

Only inputs residing in object storage this deployment can sign for are returned, so the result may be shorter than `sourcePaths` on the same transform: an input still awaiting its copy into the uploads bucket (a GCS object, a caller-supplied presigned URL, or a File Store revision) has no signable location yet and is omitted. An unrecognized stored payload yields an empty list.

Path parameters

`ingestTransformRid` string (RID) required
:   ​

Response

The body is an array of [`OriginFileUri`](https://dev.nominal.io/api/rest/ingest-job-service.md#originfileuri).

Fields of `OriginFileUri`

`uri` string
:   ​

`path` string
:   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>/origin-uris" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>/origin-uris",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transform/<ingest transform rid>/origin-uris",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-transform/<ingest transform rid>/origin-uris",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
[
  {
    "uri": "<uri>",
    "path": "<path>"
  }
]
```

### Search ingest transforms

POST `/ingest/v1/ingest-transforms/search`

Returns a paginated list of the transforms belonging to a single ingest job, oldest-first and optionally filtered by status. The caller must be authorized to read the parent job’s dataset; a job that is not visible to the caller is reported as IngestJobNotFound.

Body

`ingestJobRid` string (RID) required
:   The ingest job whose transforms to list.

`statuses` array of [`IngestTransformStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformstatus)
:   When present and non-empty, only transforms in one of these statuses are returned. Omit, or pass an empty list, to return transforms in any status.

    Values of `IngestTransformStatus`

    `QUEUED`
    :   ​

    `IN_PROGRESS`
    :   ​

    `COMPLETED`
    :   ​

    `FAILED`
    :   ​

`pageSize` integer
:   Defaults to 100. Clamped to 1_000 if larger, and to 1 if non-positive.

`nextPageToken` string
:   ​

Response

`ingestTransforms` array of [`IngestTransform`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransform)
:   ​

    Fields of `IngestTransform`

    `ingestTransformRid` string (RID)
    :   ​

    `ingestJobRid` string (RID)
    :   The ingest job this transform belongs to.

    `transformType` [`IngestTransformType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformtype)
    :   ​

        Values of `IngestTransformType`

        `CONTAINERIZED`
        :   ​

        `MCAP`
        :   ​

        `DATAFLASH`
        :   ​

        `PARQUET_ARCHIVE`
        :   ​

        `FILE_COPY`
        :   ​

    `status` [`IngestTransformStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformstatus)
    :   ​

        Values of `IngestTransformStatus`

        `QUEUED`
        :   ​

        `IN_PROGRESS`
        :   ​

        `COMPLETED`
        :   ​

        `FAILED`
        :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `errorMessage` string
    :   The failure detail recorded when the transform terminated. Present only for FAILED transforms. May contain customer-derived content and is therefore not safe to log.

    `finishedAt` string (date-time)
    :   The time the transform reached a terminal status (COMPLETED or FAILED). Absent while the transform is still QUEUED or IN_PROGRESS.

    `extractorRid` string (RID)
    :   The containerized extractor running this transform. Present only for CONTAINERIZED transforms.

    `sourcePaths` array of string
    :   Locators of the transform’s input file(s): S3/GCS paths, presigned URLs (query string stripped so no signing credentials are carried), or File Store file-revision rids. CONTAINERIZED transforms may have several inputs, ordered by the container environment variable they bind to; other types have exactly one. Empty when this server version cannot interpret the stored payload. May contain customer-derived content and is therefore not safe to log.

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-transforms/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "ingestJobRid": "<ingest job rid>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transforms/search",
    headers={"Authorization": "Bearer <api key>"},
    json={"ingestJobRid": "<ingest job rid>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-transforms/search",
    headers={"Authorization": "Bearer <api key>"},
    json={"ingestJobRid": "<ingest job rid>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-transforms/search",
            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`

```json
{
  "ingestTransforms": [
    {
      "ingestTransformRid": "<ingest transform rid>",
      "ingestJobRid": "<ingest job rid>",
      "transformType": "CONTAINERIZED",
      "status": "QUEUED",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "2026-01-01T00:00:00Z",
      "errorMessage": "<error message>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "extractorRid": "<containerized extractor rid>",
      "sourcePaths": [
        "<source paths>"
      ]
    }
  ],
  "nextPageToken": "<token>"
}
```

### Search ingest jobs

POST `/ingest/v1/ingest-jobs/search`

Returns a paginated list of ingest jobs, optionally filtered by dataset.

Body

`pageSize` integer
:   Defaults to 100. Clamped to 1_000 if larger, and to 1 if non-positive.

`nextPageToken` string
:   ​

`filter` [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
:   ​

    **datasetRids**

    Set `type` to `"datasetRids"`.

    `datasetRids` array of string (RID)
    :   ​

    **createdByRids**

    Set `type` to `"createdByRids"`.

    `createdByRids` array of string (RID)
    :   ​

    **statuses**

    Set `type` to `"statuses"`.

    `statuses` array of [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
    :   ​

        Values of `IngestJobStatus`

        `SUBMITTED`
        :   ​

        `QUEUED`
        :   ​

        `IN_PROGRESS`
        :   ​

        `COMPLETED`
        :   ​

        `FAILED`
        :   ​

        `CANCELLED`
        :   ​

        `DELETION_IN_PROGRESS`
        :   ​

        `DELETED`
        :   ​

    **searchText**

    Set `type` to `"searchText"`.

    `searchText` string
    :   Case-insensitive substring match against any origin file path.

    **startTimeRange**

    Set `type` to `"startTimeRange"`.

    `startTimeRange` [`IngestJobStartTimeRange`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstarttimerange)
    :   ​

        Fields of `IngestJobStartTimeRange`

        `startTimeAfter` string (date-time)
        :   ​

        `startTimeBefore` string (date-time)
        :   ​

    **and**

    Set `type` to `"and"`.

    `and` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **or**

    Set `type` to `"or"`.

    `or` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **not**

    Set `type` to `"not"`.

    `not` [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **workspace**

    Set `type` to `"workspace"`.

    `workspace` string (RID)
    :   ​

    **triggeringIngestRuleRids**

    Set `type` to `"triggeringIngestRuleRids"`.

    `triggeringIngestRuleRids` array of string (RID)
    :   Matches jobs any of these File Store ingest rules triggered. At most 100 rids.

`sort` [`IngestJobSortOptions`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsortoptions)
:   Defaults to most recent created_at first when omitted.

    Fields of `IngestJobSortOptions`

    `isDescending` boolean required
    :   ​

    `sortKey` [`IngestJobSortKey`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsortkey) required
    :   ​

        Values of `IngestJobSortKey`

        `CREATED_AT`
        :   ​

        `STATUS`
        :   ​

Response

`ingestJobs` array of [`IngestJob`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjob)
:   ​

    Fields of `IngestJob`

    `ingestJobRid` string (RID)
    :   ​

    `status` [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
    :   ​

        Values of `IngestJobStatus`

        `SUBMITTED`
        :   ​

        `QUEUED`
        :   ​

        `IN_PROGRESS`
        :   ​

        `COMPLETED`
        :   ​

        `FAILED`
        :   ​

        `CANCELLED`
        :   ​

        `DELETION_IN_PROGRESS`
        :   ​

        `DELETED`
        :   ​

    `originFiles` array of string
    :   ​

    `createdBy` string (UUID) deprecated
    :   **Deprecated:** use createdByRid instead

    `createdByRid` string (RID)
    :   ​

    `orgUuid` string (UUID)
    :   ​

    `ingestType` [`IngestType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttype)
    :   ​

        Values of `IngestType`

        `TABULAR`
        :   ​

        `MCAP`
        :   ​

        `DATAFLASH`
        :   ​

        `JOURNAL_JSON`
        :   ​

        `CONTAINERIZED`
        :   ​

        `VIDEO`
        :   ​

        `AVRO_STREAM`
        :   ​

        `POINT_CLOUD`
        :   ​

        `MULTI`
        :   ​

    `datasetRid` string (RID)
    :   ​

    `createdAt` string (date-time)
    :   ​

    `startTime` string (date-time)
    :   The time the job transitioned to IN_PROGRESS. Absent for jobs that have not started running yet (SUBMITTED, QUEUED).

    `endTime` string (date-time)
    :   ​

    `producedFileCount` integer
    :   Count of dataset files produced by this ingest job.

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "pageSize": 1,
  "nextPageToken": "<token>",
  "filter": {
    "type": "datasetRids",
    "datasetRids": [
      "<dataset rid>"
    ]
  },
  "sort": {
    "isDescending": true,
    "sortKey": "CREATED_AT"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "pageSize": 1,
        "nextPageToken": "<token>",
        "filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]},
        "sort": {"isDescending": True, "sortKey": "CREATED_AT"},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "pageSize": 1,
        "nextPageToken": "<token>",
        "filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]},
        "sort": {"isDescending": True, "sortKey": "CREATED_AT"},
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-jobs/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "pageSize": 1,
                "nextPageToken": "<token>",
                "filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]},
                "sort": {"isDescending": True, "sortKey": "CREATED_AT"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "ingestJobs": [
    {
      "ingestJobRid": "<ingest job rid>",
      "status": "SUBMITTED",
      "originFiles": [
        "<origin files>"
      ],
      "createdBy": "<created by>",
      "createdByRid": "<user rid>",
      "orgUuid": "<org uuid>",
      "ingestType": "TABULAR",
      "datasetRid": "<dataset rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "startTime": "2026-01-01T00:00:00Z",
      "endTime": "2026-01-01T00:00:00Z",
      "producedFileCount": 1
    }
  ],
  "nextPageToken": "<token>"
}
```

### Count ingest jobs

POST `/ingest/v1/ingest-jobs/count`

Returns the number of ingest jobs matching the filter, applying the same visibility rules as searchIngestJobs: jobs without a persisted dataset are excluded, and only jobs whose dataset the caller is authorized to read are counted. Intended for cheap polling (e.g. an active-job indicator) instead of paginating searchIngestJobs just to count results. Throws INVALID_ARGUMENT when the filter matches jobs across more distinct datasets than can be authorized in one request; narrow the filter in that case.

Body

`filter` [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
:   Matches all jobs when omitted. Prefer a filter that bounds the result, such as non-terminal statuses.

    **datasetRids**

    Set `type` to `"datasetRids"`.

    `datasetRids` array of string (RID)
    :   ​

    **createdByRids**

    Set `type` to `"createdByRids"`.

    `createdByRids` array of string (RID)
    :   ​

    **statuses**

    Set `type` to `"statuses"`.

    `statuses` array of [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
    :   ​

        Values of `IngestJobStatus`

        `SUBMITTED`
        :   ​

        `QUEUED`
        :   ​

        `IN_PROGRESS`
        :   ​

        `COMPLETED`
        :   ​

        `FAILED`
        :   ​

        `CANCELLED`
        :   ​

        `DELETION_IN_PROGRESS`
        :   ​

        `DELETED`
        :   ​

    **searchText**

    Set `type` to `"searchText"`.

    `searchText` string
    :   Case-insensitive substring match against any origin file path.

    **startTimeRange**

    Set `type` to `"startTimeRange"`.

    `startTimeRange` [`IngestJobStartTimeRange`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstarttimerange)
    :   ​

        Fields of `IngestJobStartTimeRange`

        `startTimeAfter` string (date-time)
        :   ​

        `startTimeBefore` string (date-time)
        :   ​

    **and**

    Set `type` to `"and"`.

    `and` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **or**

    Set `type` to `"or"`.

    `or` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **not**

    Set `type` to `"not"`.

    `not` [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
    :   ​

    **workspace**

    Set `type` to `"workspace"`.

    `workspace` string (RID)
    :   ​

    **triggeringIngestRuleRids**

    Set `type` to `"triggeringIngestRuleRids"`.

    `triggeringIngestRuleRids` array of string (RID)
    :   Matches jobs any of these File Store ingest rules triggered. At most 100 rids.

Response

`count` integer (int64)
:   The exact number of matching ingest jobs visible to the caller.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/count" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "filter": {
    "type": "datasetRids",
    "datasetRids": [
      "<dataset rid>"
    ]
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/count",
    headers={"Authorization": "Bearer <api key>"},
    json={"filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]}},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/count",
    headers={"Authorization": "Bearer <api key>"},
    json={"filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]}},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-jobs/count",
            headers={"Authorization": "Bearer <api key>"},
            json={"filter": {"type": "datasetRids", "datasetRids": ["<dataset rid>"]}},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "count": 1
}
```

### Cancel ingest job

POST `/ingest/v1/ingest-job/{ingestJobRid}/cancel`

Cancels an ingest job. Jobs that have not yet started running (SUBMITTED, QUEUED) are transitioned directly to CANCELLED. Jobs that are IN_PROGRESS have their underlying workflow cancelled; the workflow is responsible for transitioning the job to CANCELLED and tearing down in-flight work. Cancelling a job that is already in a terminal state (COMPLETED, FAILED, CANCELLED) throws IngestJobNotCancellable.

Path parameters

`ingestJobRid` string (RID) required
:   ​

Response

`ingestJobRid` string (RID)
:   ​

`status` [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
:   ​

    Values of `IngestJobStatus`

    `SUBMITTED`
    :   ​

    `QUEUED`
    :   ​

    `IN_PROGRESS`
    :   ​

    `COMPLETED`
    :   ​

    `FAILED`
    :   ​

    `CANCELLED`
    :   ​

    `DELETION_IN_PROGRESS`
    :   ​

    `DELETED`
    :   ​

`originFiles` array of string
:   ​

`createdBy` string (UUID) deprecated
:   **Deprecated:** use createdByRid instead

`createdByRid` string (RID)
:   ​

`orgUuid` string (UUID)
:   ​

`ingestType` [`IngestType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttype)
:   ​

    Values of `IngestType`

    `TABULAR`
    :   ​

    `MCAP`
    :   ​

    `DATAFLASH`
    :   ​

    `JOURNAL_JSON`
    :   ​

    `CONTAINERIZED`
    :   ​

    `VIDEO`
    :   ​

    `AVRO_STREAM`
    :   ​

    `POINT_CLOUD`
    :   ​

    `MULTI`
    :   ​

`datasetRid` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`startTime` string (date-time)
:   The time the job transitioned to IN_PROGRESS. Absent for jobs that have not started running yet (SUBMITTED, QUEUED).

`endTime` string (date-time)
:   ​

`producedFileCount` integer
:   Count of dataset files produced by this ingest job.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>/cancel" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>/cancel",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-job/<ingest job rid>/cancel",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-job/<ingest job rid>/cancel",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "ingestJobRid": "<ingest job rid>",
  "status": "SUBMITTED",
  "originFiles": [
    "<origin files>"
  ],
  "createdBy": "<created by>",
  "createdByRid": "<user rid>",
  "orgUuid": "<org uuid>",
  "ingestType": "TABULAR",
  "datasetRid": "<dataset rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "startTime": "2026-01-01T00:00:00Z",
  "endTime": "2026-01-01T00:00:00Z",
  "producedFileCount": 1
}
```

### Batch cancel ingest jobs

POST `/ingest/v1/ingest-jobs/cancel`

Cancels multiple ingest jobs in a single call. Each job is processed independently and best-effort: a job that cannot be cancelled (already terminal, missing, or not authorized for the caller) yields a `failed` result rather than aborting the batch. Per-job cancellation semantics match cancelIngestJob. At most 100 jobs may be requested per call.

Body

`ingestJobRids` array of string (RID)
:   The ingest jobs to cancel. At most 100 jobs may be requested; a larger list is rejected with INVALID_ARGUMENT.

Response

`results` array of [`CancelIngestJobResult`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjobresult)
:   ​

    Fields of `CancelIngestJobResult`

    `ingestJobRid` string (RID)
    :   ​

    `outcome` [`CancelIngestJobOutcome`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjoboutcome)
    :   ​

        **cancelled**

        Set `type` to `"cancelled"`.

        `cancelled` [`IngestJob`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjob)
        :   ​

            Fields of `IngestJob`

            `ingestJobRid` string (RID)
            :   ​

            `status` [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
            :   ​

                Values of `IngestJobStatus`

                `SUBMITTED`
                :   ​

                `QUEUED`
                :   ​

                `IN_PROGRESS`
                :   ​

                `COMPLETED`
                :   ​

                `FAILED`
                :   ​

                `CANCELLED`
                :   ​

                `DELETION_IN_PROGRESS`
                :   ​

                `DELETED`
                :   ​

            `originFiles` array of string
            :   ​

            `createdBy` string (UUID) deprecated
            :   **Deprecated:** use createdByRid instead

            `createdByRid` string (RID)
            :   ​

            `orgUuid` string (UUID)
            :   ​

            `ingestType` [`IngestType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttype)
            :   ​

                Values of `IngestType`

                `TABULAR`
                :   ​

                `MCAP`
                :   ​

                `DATAFLASH`
                :   ​

                `JOURNAL_JSON`
                :   ​

                `CONTAINERIZED`
                :   ​

                `VIDEO`
                :   ​

                `AVRO_STREAM`
                :   ​

                `POINT_CLOUD`
                :   ​

                `MULTI`
                :   ​

            `datasetRid` string (RID)
            :   ​

            `createdAt` string (date-time)
            :   ​

            `startTime` string (date-time)
            :   The time the job transitioned to IN_PROGRESS. Absent for jobs that have not started running yet (SUBMITTED, QUEUED).

            `endTime` string (date-time)
            :   ​

            `producedFileCount` integer
            :   Count of dataset files produced by this ingest job.

        **failed**

        Set `type` to `"failed"`.

        `failed` [`CancelIngestJobFailure`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjobfailure)
        :   ​

            Fields of `CancelIngestJobFailure`

            `reason` [`CancelIngestJobFailureReason`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjobfailurereason)
            :   ​

                Values of `CancelIngestJobFailureReason`

                `NOT_FOUND`
                :   ​

                `NOT_CANCELLABLE`
                :   ​

            `message` string
            :   Human-readable description of why the job could not be cancelled.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/cancel" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "ingestJobRids": [
    "<ingest job rid>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/cancel",
    headers={"Authorization": "Bearer <api key>"},
    json={"ingestJobRids": ["<ingest job rid>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/ingest/v1/ingest-jobs/cancel",
    headers={"Authorization": "Bearer <api key>"},
    json={"ingestJobRids": ["<ingest job rid>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
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-jobs/cancel",
            headers={"Authorization": "Bearer <api key>"},
            json={"ingestJobRids": ["<ingest job rid>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "results": [
    {
      "ingestJobRid": "<ingest job rid>",
      "outcome": {
        "type": "cancelled",
        "cancelled": {
          "ingestJobRid": "<ingest job rid>",
          "status": "SUBMITTED",
          "originFiles": [
            "<origin files>"
          ],
          "createdBy": "<created by>",
          "createdByRid": "<user rid>",
          "orgUuid": "<org uuid>",
          "ingestType": "TABULAR",
          "datasetRid": "<dataset rid>",
          "createdAt": "2026-01-01T00:00:00Z",
          "startTime": "2026-01-01T00:00:00Z",
          "endTime": "2026-01-01T00:00:00Z",
          "producedFileCount": 1
        }
      }
    }
  ]
}
```

## Types

### CancelIngestJobFailure

`reason` [`CancelIngestJobFailureReason`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjobfailurereason) required
:   ​

`message` string required
:   Human-readable description of why the job could not be cancelled.

### CancelIngestJobFailureReason

NOT_FOUND: the job does not exist, or the caller is not authorized to cancel it. NOT_CANCELLABLE: the job is already in a terminal state (COMPLETED or FAILED).

`NOT_FOUND`
:   ​

`NOT_CANCELLABLE`
:   ​

### CancelIngestJobOutcome

`cancelled` carries the resulting job (including the idempotent already-cancelled case); `failed` describes why the job could not be cancelled.

Set `type` to the name of one of the other fields, and set only that field.

`cancelled` [`IngestJob`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjob)
:   ​

`failed` [`CancelIngestJobFailure`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjobfailure)
:   ​

### CancelIngestJobResult

The outcome of attempting to cancel a single ingest job within a batch.

`ingestJobRid` string (RID) required
:   ​

`outcome` [`CancelIngestJobOutcome`](https://dev.nominal.io/api/rest/ingest-job-service.md#cancelingestjoboutcome) required
:   ​

### IngestJob

Ingest job information

`ingestJobRid` string (RID) required
:   ​

`status` [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus) required
:   ​

`originFiles` array of string
:   ​

`createdBy` string (UUID) required deprecated
:   **Deprecated:** use createdByRid instead

`createdByRid` string (RID)
:   ​

`orgUuid` string (UUID) required
:   ​

`ingestType` [`IngestType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttype) required
:   ​

`datasetRid` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`startTime` string (date-time)
:   The time the job transitioned to IN_PROGRESS. Absent for jobs that have not started running yet (SUBMITTED, QUEUED).

`endTime` string (date-time)
:   ​

`producedFileCount` integer
:   Count of dataset files produced by this ingest job.

### IngestJobSearchFilter

Filter for ingest-job search. A filter type that is not provided defaults to matching all jobs. Jobs without a persisted dataset UUID are not returned.

Set `type` to the name of one of the other fields, and set only that field.

`datasetRids` array of string (RID)
:   ​

`createdByRids` array of string (RID)
:   ​

`statuses` array of [`IngestJobStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstatus)
:   ​

`searchText` string
:   Case-insensitive substring match against any origin file path.

`startTimeRange` [`IngestJobStartTimeRange`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobstarttimerange)
:   ​

`and` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
:   ​

`or` array of [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
:   ​

`not` [`IngestJobSearchFilter`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsearchfilter)
:   ​

`workspace` string (RID)
:   ​

`triggeringIngestRuleRids` array of string (RID)
:   Matches jobs any of these File Store ingest rules triggered. At most 100 rids.

### IngestJobSortKey

`CREATED_AT`
:   ​

`STATUS`
:   ​

### IngestJobSortOptions

`isDescending` boolean required
:   ​

`sortKey` [`IngestJobSortKey`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingestjobsortkey) required
:   ​

### IngestJobStartTimeRange

Filters ingest jobs by start time. The lower bound is inclusive; the upper bound is exclusive.

`startTimeAfter` string (date-time)
:   ​

`startTimeBefore` string (date-time)
:   ​

### IngestJobStatus

`SUBMITTED`
:   ​

`QUEUED`
:   ​

`IN_PROGRESS`
:   ​

`COMPLETED`
:   ​

`FAILED`
:   ​

`CANCELLED`
:   ​

`DELETION_IN_PROGRESS`
:   ​

`DELETED`
:   ​

### IngestTransform

A single transform within an ingest job: one unit of extraction/processing work. Surfaces status, type, and error details so callers can monitor and alert on ingest pipelines.

`ingestTransformRid` string (RID) required
:   ​

`ingestJobRid` string (RID) required
:   The ingest job this transform belongs to.

`transformType` [`IngestTransformType`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformtype) required
:   ​

`status` [`IngestTransformStatus`](https://dev.nominal.io/api/rest/ingest-job-service.md#ingesttransformstatus) required
:   ​

`createdAt` string (date-time) required
:   ​

`updatedAt` string (date-time) required
:   ​

`errorMessage` string
:   The failure detail recorded when the transform terminated. Present only for FAILED transforms. May contain customer-derived content and is therefore not safe to log.

`finishedAt` string (date-time)
:   The time the transform reached a terminal status (COMPLETED or FAILED). Absent while the transform is still QUEUED or IN_PROGRESS.

`extractorRid` string (RID)
:   The containerized extractor running this transform. Present only for CONTAINERIZED transforms.

`sourcePaths` array of string
:   Locators of the transform’s input file(s): S3/GCS paths, presigned URLs (query string stripped so no signing credentials are carried), or File Store file-revision rids. CONTAINERIZED transforms may have several inputs, ordered by the container environment variable they bind to; other types have exactly one. Empty when this server version cannot interpret the stored payload. May contain customer-derived content and is therefore not safe to log.

### IngestTransformStatus

`QUEUED`
:   ​

`IN_PROGRESS`
:   ​

`COMPLETED`
:   ​

`FAILED`
:   ​

### IngestTransformType

`CONTAINERIZED`
:   ​

`MCAP`
:   ​

`DATAFLASH`
:   ​

`PARQUET_ARCHIVE`
:   ​

`FILE_COPY`
:   ​

### IngestType

`TABULAR`
:   ​

`MCAP`
:   ​

`DATAFLASH`
:   ​

`JOURNAL_JSON`
:   ​

`CONTAINERIZED`
:   ​

`VIDEO`
:   ​

`AVRO_STREAM`
:   ​

`POINT_CLOUD`
:   ​

`MULTI`
:   ​

### OriginFileUri

Pre-signed URI that can be used to download an origin file directly. Expires if the download has not been initiated within 1 minute.

`uri` string required
:   ​

`path` string required
:   ​

Page design based on [Scalar](https://scalar.com), MIT License.
