---
title: "POST /api/index/request"
method: POST
path: "/api/index/request"
tags: ["/api/index"]
---

# POST /api/index/request

`POST /api/index/request`

## Request

- Base URL: `` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/api/index/request`
- Auth: API key in header `X-API-Key`

Create an index request on a transform's target table. Requires write access to the transform. Listed via `GET /`,
  not under `/request`.

## Request body

- object
  - `structured` union, required: A single structured index definition, dispatched on `:kind`. The shape stored in `metabase_table_indexes.structured` and handed to the driver index multimethods.
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaSortkey: Redshift sort key, inline.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'sortkey', required
      - `style` 'compound' | 'interleaved', required
    - MetabaseIndexesSchemaDistkey: Redshift distribution, inline. Only `:key` uses a column (the one DISTKEY column); `:all`/`:even` take none.
      - `columns` MetabaseIndexesSchemaColumn[]
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'distkey', required
      - `style` 'key' | 'all' | 'even', required
    - MetabaseIndexesSchemaClustering: Snowflake (standalone) / BigQuery (inline) clustering. `:name` is required for the standalone form.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'clustering', required
      - `name` string: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
    - MetabaseIndexesSchemaOrderBy: ClickHouse ORDER BY, inline.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'order-by', required
    - MetabaseIndexesSchemaSkipIndex: ClickHouse data-skipping index, standalone. Only arg-free types; the parameterized ones need type-args the form can't supply yet.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `granularity` integer
      - `kind` 'skip-index', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `type` 'minmax' | 'bloom_filter', required
  - `transform_id` integer, required: value must be an integer greater than zero.

## Response `2XX`

Successful response

- object
  - `created_at` unknown, required
  - `created_by` integer, nullable, required: value must be an integer greater than zero.
  - `error_message` string, nullable, required
  - `id` integer, required: value must be an integer greater than zero.
  - `index_name` string, required: value must be a non-blank string.
  - `last_executed_at` unknown, required
  - `status` 'create-pending' | 'update-pending' | 'delete-pending' | 'running' | 'succeeded' | 'failed', required
  - `structured` union, required: A single structured index definition, dispatched on `:kind`. The shape stored in `metabase_table_indexes.structured` and handed to the driver index multimethods.
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaClassicalIndex: Postgres / MySQL / SQL Server secondary index.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `include` MetabaseIndexesSchemaColumnName[]
      - `kind` 'btree' | 'hash' | 'gin' | 'gist' | 'brin' | 'spgist' | 'fulltext' | 'spatial' | 'clustered' | 'nonclustered' | 'columnstore', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `unique` boolean
    - MetabaseIndexesSchemaSortkey: Redshift sort key, inline.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'sortkey', required
      - `style` 'compound' | 'interleaved', required
    - MetabaseIndexesSchemaDistkey: Redshift distribution, inline. Only `:key` uses a column (the one DISTKEY column); `:all`/`:even` take none.
      - `columns` MetabaseIndexesSchemaColumn[]
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'distkey', required
      - `style` 'key' | 'all' | 'even', required
    - MetabaseIndexesSchemaClustering: Snowflake (standalone) / BigQuery (inline) clustering. `:name` is required for the standalone form.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'clustering', required
      - `name` string: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
    - MetabaseIndexesSchemaOrderBy: ClickHouse ORDER BY, inline.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `kind` 'order-by', required
    - MetabaseIndexesSchemaSkipIndex: ClickHouse data-skipping index, standalone. Only arg-free types; the parameterized ones need type-args the form can't supply yet.
      - `columns` MetabaseIndexesSchemaColumn[], required
        - `direction` 'asc' | 'desc'
        - `name` string, required
      - `granularity` integer
      - `kind` 'skip-index', required
      - `name` string, required: Free-form user input, inlined (quoted and escaped) into DDL. 63 is the Postgres identifier limit, the tightest engine we support.
      - `type` 'minmax' | 'bloom_filter', required
  - `transform_id` integer, required: value must be an integer greater than zero.
  - `updated_at` unknown, required

## Other responses

- `4XX`: Client error response
- `5XX`: Server error response

## Changes

- **2026-11-04** `2e178f5a7934`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/metabase/apis/metabase-api/changes/api/index/request/post.md)

---

[API](https://skmtc.dev/metabase/apis/metabase-api.md) - [All operations](https://skmtc.dev/metabase/apis/metabase-api/llms.txt) - [OpenAPI document](https://skmtc.dev/metabase/apis/metabase-api/revisions/2e178f5a7934?raw)
