> ## Documentation Index
> Fetch the complete documentation index at: https://infino-29-bot-sync-openapi-spec.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a table

> Create a table with an Arrow schema and optional full-text and vector indexes.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/create_table/{database}
openapi: 3.1.0
info:
  title: Infino API
  description: >-
    The Infino hosted data-plane API: per-database table operations — create,
    ingest, search, and SQL.
  version: 0.1.0
servers:
  - url: https://api.platform.infino.ws
    description: Infino Cloud
security:
  - api_key: []
tags:
  - name: Databases
    description: Create, list, and delete the databases in your account.
  - name: Tables
    description: Create, drop, and list tables, and describe a table's schema.
  - name: Rows
    description: Append, update, and delete rows.
  - name: Search
    description: BM25, vector, and hybrid search, token and exact match, count, and SQL.
paths:
  /v1/create_table/{database}:
    post:
      tags:
        - Tables
      summary: Create a table
      description: >-
        Create a table with an Arrow schema and optional full-text and vector
        indexes.
      operationId: create_table
      parameters:
        - name: database
          in: path
          description: Target database.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTableRequest'
        required: true
      responses:
        '200':
          description: Table created.
        '400':
          description: >-
            Invalid request body, or a malformed table name — use non-empty
            [A-Za-z0-9_-], at most 128 characters, not starting with '_'.
        '401':
          description: Missing or invalid API key.
        '409':
          description: >-
            Either the table name already exists — terminal, pick another name —
            or another catalog change was in flight, so this one was not
            applied. Every table in a database is created through one catalog.
            The second case carries a `Retry-After`; reissue the identical
            request after it.
        '503':
          description: >-
            The database's workers are still activating, or no capacity is free
            to place them. Transient — retry after the `Retry-After` interval.
      security:
        - api_key: []
components:
  schemas:
    CreateTableRequest:
      type: object
      description: '`POST /v1/create_table/{database}`.'
      required:
        - table_name
      properties:
        indexes:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Indexes'
        schema:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/SchemaField'
          description: |-
            JSON column descriptors. Exactly one of `schema` or `schema_ipc` is
            required. Cannot express nested types; use `schema_ipc` for those.
        schema_ipc:
          type:
            - string
            - 'null'
          description: >-
            The table's Arrow schema as a base64-encoded Arrow IPC stream
            carrying

            only the schema message. Exactly one of `schema` or `schema_ipc` is

            required. Carries any Arrow type the engine accepts, nested
            included.
        table_name:
          type: string
      additionalProperties: false
    Indexes:
      type: object
      description: Index declarations for `create_table`.
      properties:
        fts:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/FtsIndex'
          description: |-
            FTS index declarations — a bare column name (engine defaults) or an
            options object per column (see [`FtsColumn`]).
        vector:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/VectorIndex'
          description: Vector index declarations.
      additionalProperties: false
    SchemaField:
      type: object
      description: >-
        One column in a `create_table` schema. A scalar column is `{name, type}`
        where `type` is one of `"utf8"`, `"large_utf8"`, `"bool"`, `"i32"`,
        `"i64"`, `"u32"`, `"u64"`, `"f32"`, `"f64"`, `"date32"`, `"date64"`, or
        a timezone-naive timestamp with its unit: `"timestamp_s"`,
        `"timestamp_ms"` (also `"timestamp"`), `"timestamp_us"`,
        `"timestamp_ns"`. A vector column is `{name, type: "vector", dim}`; a
        list column is `{name, type: "list", item}`. `dim` is required for
        `"vector"` and `item` for `"list"`. The `schema` endpoint returns this
        shape for every column, including ones this form cannot declare: a zoned
        timestamp carries `tz`, a decimal is `{type: "decimal", precision,
        scale}`, a struct is `{type: "struct", fields}`, a map is `{type: "map",
        key, value}`; declare those with `schema_ipc`.
      required:
        - name
        - type
      properties:
        dim:
          type:
            - integer
            - 'null'
          description: 'Fixed length, required for `type: "vector"`. Must be in [1, 4096].'
          maximum: 4096
          minimum: 1
        item:
          type:
            - string
            - 'null'
          description: 'Element scalar type, required for `type: "list"`.'
        name:
          type: string
          description: Column name.
        nullable:
          type:
            - boolean
            - 'null'
          description: Defaults to `true` when omitted.
        type:
          type: string
          description: >-
            Scalar spelling (`"i32"`, `"large_utf8"`, `"date32"`,
            `"timestamp_ms"`, …),

            or `"vector"` / `"list"`.
      additionalProperties: false
    FtsIndex:
      oneOf:
        - type: string
          description: '`"body"` — index the column with the default options.'
        - $ref: '#/components/schemas/FtsColumn'
          description: |-
            An object naming the column and any options it sets explicitly,
            e.g. `{"column": "body", "analyzer": "standard", "k1": 1.6,
            "b": 0.4}` — see [`FtsColumn`] for the full set.
      description: >-
        One entry in `indexes.fts`. Either a bare column name — which uses the

        engine defaults — or an options object that sets them explicitly. The
        bare-string

        form keeps clients that send `"fts": ["body"]` working unchanged.
        Options

        apply per column, not per table.
    VectorIndex:
      type: object
      description: One vector index declaration under `indexes.vector`.
      required:
        - column
        - metric
      properties:
        column:
          type: string
        dim:
          type:
            - integer
            - 'null'
          description: >-
            Redundant with the schema column's declared width; the server
            resolves

            the dimension from the schema, so this is optional and, if given,
            must

            agree.
          minimum: 0
        metric:
          $ref: '#/components/schemas/Metric'
      additionalProperties: false
    FtsColumn:
      type: object
      description: >-
        One FTS index declaration under `indexes.fts` — a column plus its

        per-column options, e.g. `{"column": "body", "analyzer": "standard"}`.

        The fields below are the full set; every one is optional and, when

        omitted, takes the engine default — the same defaults a bare-string
        entry gets (see [`FtsIndex`]).

        The object shape mirrors what the engine's hosted transport sends for a

        non-default `FtsField`, so an option chosen through the SDK reaches the

        service rather than being refused at the door.
      required:
        - column
      properties:
        analyzer:
          type:
            - string
            - 'null'
          description: |-
            Analyzer name (`"standard"` or `"ascii_lower"`). Omitted means the
            engine default, `standard` — the Unicode-aware UAX #29 tokenizer.
            `ascii_lower` splits on ASCII alphanumerics and drops every
            non-ASCII token. Recorded with the table; it cannot be changed
            afterwards, so pass it explicitly to pin a column either way.
        b:
          type:
            - number
            - 'null'
          format: float
          description: |-
            BM25 length normalization for this column. Omitted means the engine
            default. Must be given together with `k1`.
        column:
          type: string
        k1:
          type:
            - number
            - 'null'
          format: float
          description: |-
            BM25 term-frequency saturation for this column. Omitted means the
            engine default. Must be given together with `b`: the two interact
            through the length norm, so half a pair scores with a combination
            the caller never chose.
        positions:
          type:
            - boolean
            - 'null'
          description: >-
            Record token positions, which exact phrase queries (`"climate

            policy"`) need. Omitted means the engine default, `false`. Positions

            roughly double the column's full-text index, so they are a
            per-column

            opt-in. A column without them answers a phrase query with an error

            naming the column, never a bag-of-words fallback. Recorded with the

            table; it cannot be changed afterwards.
        stemmer:
          type:
            - string
            - 'null'
          description: |-
            Stemmer applied at index and query time (`"english"`). Omitted means
            none. Recorded with the table; it cannot be changed afterwards.
        stopwords:
          type:
            - string
            - 'null'
          description: >-
            Stopword set removed at index and query time (`"english"`). Omitted

            means none. Recorded with the table; it cannot be changed
            afterwards.
        stored:
          type:
            - boolean
            - 'null'
          description: >-
            Whether the raw text is kept in the table. Omitted means the engine

            default, `true`. `false` declares an index-only column: the text is

            searchable (BM25, token and phrase matching) but never stored, so it

            cannot be read back — not in SQL results, not in a search
            projection,

            not in predicates. `append` and `update` batches still carry the

            column; it is dropped at write time.
      additionalProperties: false
    Metric:
      type: string
      description: |-
        Vector distance metric. Accepted case-insensitively, with the aliases
        `l2` → `l2sq` and `dot` → `negdot`; serialized canonically.
      enum:
        - cosine
        - l2sq
        - negdot
  securitySchemes:
    api_key:
      type: http
      scheme: bearer

````