Bulk import

Upload Parquet files for bulk import into existing tables and list the status of bulk import jobs.

Bulk import endpoints require the upgraded storage engine, enabled with the --use-pacha-tree flag, and a compactor node that runs the bulk import scheduler to complete the import. All endpoints require an admin (operator) token.

GET /api/v3/enterprise/import

List bulk import statuses

Lists the status of bulk import jobs, for both uploads and object-store pulls.

Requires a token with the describe action on at least one database, or an admin token. The list includes only jobs for databases the token can describe. A token that can’t describe any database gets 403.

Requires the upgraded storage engine (enabled with the --use-pacha-tree flag).

This endpoint is only available in InfluxDB 3 Enterprise.

Example request Ask AI about this
curl --request GET \
  "https://localhost:8181/api/v3/enterprise/import" \
  --header "Authorization: Bearer INFLUX_TOKEN"

Responses

200 Success. Returns the list of bulk import statuses.
401 Unauthorized access.
data object
error string
403 Access denied.
data object
error string
500 Internal server error. Object store or read failure.
data object
error string
POST /api/v3/enterprise/import

Import Parquet data

Imports Parquet data into an existing table. Send the data one of two ways:

  • Upload (multipart/form-data): send one Parquet file in the request.
  • Object-store pull (application/json): name a source prefix, and the server imports every Parquet file under it. The source is either a prefix in the cluster’s own object store or an s3://bucket/prefix URL. The server reads another bucket with its own object-store credentials; the request carries none, so those credentials must be able to read the bucket. A server whose own object store isn’t S3 can’t read another bucket and returns 400.

The request returns after the import is staged. The compactor node imports the data asynchronously. A job moves through queued, imported, and compacted; rows become queryable once the job is compacted. Use List bulk import statuses to follow it.

Column types

For generic Parquet files, a column that isn’t in column_metadata is imported as a field, typed from its Parquet type. This applies even when the target table already declares the column as a tag, so map every string tag column (for example, {"column_mapping": {"host": "tag"}}). Otherwise the import fails with invalid column type for column 'host', expected iox::column_type::tag, got iox::column_type::field::string. A string column with no mapping can also fail with 400 Unable to infer data type for column.

Explicit schema databases

In a database created with schema_mode: explicit, every column in the file must already be declared on the table. Otherwise the import is rejected and no job is created. Declare columns with PATCH /api/v3/configure/table.

Permissions

Requires a token with the write action on the target database (for example, db:DATABASE_NAME:write), or an admin token. For a token without that permission, including when the database doesn’t exist, the request returns 403.

Requires the upgraded storage engine (enabled with the --use-pacha-tree flag); the compactor node runs the bulk import scheduler that completes the import.

This endpoint is only available in InfluxDB 3 Enterprise.

Request body required

Content-Type: application/json
column_metadata object
Column metadata for a bulk import. Maps column names to InfluxDB column types to declare tag, field, and time columns.
Example: {"column_mapping":{"room":"tag","temp":"f64","time":"time"}}
column_mapping required object
A map of column name to InfluxDB column type. The JSON key accepts the aliases column_mapping, schema, and column_metadata.
database required string
The target database name. The database must already exist.
source required string