TextQL Chat API

Create and manage AI chat sessions

Operations 8

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

GET /v2/chats List my API chats · List Chats #
Ask an LLM
“Which chats has my API key created?”
“Can I search my chats by summary or first message?”
Tell an agent
List my chats.
Find chats mentioning {search_term}, {limit} at a time.
POST /v2/chats Ask a data question and wait for the answer · Create Chat #
Ask an LLM
“How do I ask TextQL a question about my data and get the full answer back in one response?”
“Can I attach a file when I ask a question?”
Tell an agent
Ask {question} and wait for the complete answer.
Ask {question} using only connectors {connectors}, returning the answer synchronously.
POST /v2/chats/stream Ask a data question and stream the answer · Stream Chat #
Ask an LLM
“Can I get the answer to a data question streamed back as it's generated?”
“How do I receive Server-Sent Events with text deltas and execution cells for a question?”
Tell an agent
Stream the answer to {question} as server-sent events.
Stream a reply to {question} in chat {chat} using model {model}.
GET /v2/chats/{id} Get a chat with its messages · Get Chat #
Ask an LLM
“How do I retrieve a chat along with its messages and generated assets?”
“What did the agent answer in a previous REST chat?”
Tell an agent
Get chat {id} with its messages.
Show the conversation and assets for chat {id}.
GET /v2/chats/{id}/cells List the execution cells of a chat · Get Chat Cells #
Ask an LLM
“Can I see the SQL and Python the agent ran to produce an answer?”
“How do I page through every step behind a chat's answers?”
Tell an agent
List the cells of chat {id}.
Show {limit} execution steps from chat {id} starting at offset {offset}.
GET /v2/chats/{id}/cells/{cellId} Get one execution cell from a chat · Get Chat Cell #
Ask an LLM
“How do I fetch a single step from a chat by its cell ID?”
“Can I look at just one generated query and its output?”
Tell an agent
Get cell {cell} from chat {id}.
Show the output of step {cell} in chat {id}.
POST /v2/chats/{id}/cancel Cancel a streaming chat response · Cancel Stream #
Ask an LLM
“How do I stop a REST chat stream that's taking too long?”
“Can I cancel an in-flight streamed answer?”
Tell an agent destructive · confirm first
Cancel the running stream for chat {id}.
Abort the streamed answer currently generating in chat {id}.
GET /v2/models List models I can run chats on · List Models #
Ask an LLM
“Which models is my organization allowed to use for chats?”
“What model IDs can I pass when asking a question?”
Tell an agent
List the models available to me for chats.
Show which chat models my role is allowed to pick.

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/textql:textql-chat-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

textql-chat-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: TextQL v2 Chat API
  version: '2.0'
  description: REST API for TextQL platform operations. All endpoints require Bearer token authentication.
servers:
- url: https://app.textql.com
security:
- bearerAuth: []
tags:
- name: Chat
  description: Create and manage AI chat sessions
paths:
  /v2/chats:
    get:
      tags:
      - Chat
      summary: List Chats
      description: List chats with optional search and pagination. Returns chats owned by the authenticated API key.
      operationId: v2.listChats
      parameters:
      - name: limit
        in: query
        schema:
          type: integer
          format: int32
          default: 20
          minimum: 1
          maximum: 100
        description: Maximum number of chats to return (default 20, max 100)
      - name: offset
        in: query
        schema:
          type: integer
          format: int32
          minimum: 0
        description: Number of chats to skip
      - name: search_term
        in: query
        schema:
          type: string
        description: Filter chats by summary or first message content
      - name: sort_by
        in: query
        schema:
          type: string
          enum:
          - name
          - created_at
          - updated_at
          default: updated_at
        description: Field to sort by
      - name: sort_direction
        in: query
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
        description: Sort direction
      responses:
        '200':
          description: Paginated list of chats
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListChatsResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Chat
      summary: Create Chat
      description: 'Send a question and receive a synchronous response. Supports JSON or multipart

        form-data (for file uploads). The response includes the model''s answer and any

        generated assets.'
      operationId: v2.createChat
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatRequest'
          multipart/form-data:
            schema:
              type: object
              required:
              - question
              properties:
                question:
                  type: string
                  description: The question to ask
                chat_id:
                  type: string
                  format: uuid
                  description: Existing chat ID to continue a conversation
                model:
                  type: string
                  description: Optional model `id` from `GET /v2/models` (e.g. `gemini_3_5_flash`). Omit for the org default. New chats only.
                  example: gemini_3_5_flash
                connector_ids:
                  type: array
                  items:
                    type: integer
                    format: int32
                  description: Connector IDs to query
                files:
                  type: array
                  items:
                    type: string
                    format: binary
                  maxItems: 10
                  description: One or more files to upload with the question
      responses:
        '200':
          description: Chat response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/chats/stream:
    post:
      tags:
      - Chat
      summary: Stream Chat
      description: 'Send a question and receive a streaming response via Server-Sent Events.

        Supports the same request format as Create Chat. The stream emits metadata,

        text deltas, execution cells, assets, and a final done event.'
      operationId: v2.streamChat
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatRequest'
          multipart/form-data:
            schema:
              type: object
              required:
              - question
              properties:
                question:
                  type: string
                chat_id:
                  type: string
                  format: uuid
                model:
                  type: string
                  description: Optional model `id` from `GET /v2/models` (e.g. `gemini_3_5_flash`). Omit for the org default. New chats only.
                  example: gemini_3_5_flash
                connector_ids:
                  type: array
                  items:
                    type: integer
                    format: int32
                files:
                  type: array
                  items:
                    type: string
                    format: binary
                  maxItems: 10
      responses:
        '200':
          description: Server-Sent Events stream
          content:
            text/event-stream:
              schema:
                type: string
                description: 'SSE stream with JSON data payloads. Event types:

                  - `{"type":"metadata","id":"...","created_at":"...","model":"...","chat_id":"...","is_continuation":bool}`

                  - `{"type":"text","text":"..."}`

                  - `{"type":"cell","cell":{...}}` — an execution step (same shape as ChatCell), emitted once when the step starts running (carrying the generated SQL or code) and again when it finishes (carrying outputs, result previews, and timing)

                  - `{"type":"asset","asset":{...}}`

                  - `{"type":"done","status":"completed|failed","error":"..."}`

                  '
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/chats/{id}:
    get:
      tags:
      - Chat
      summary: Get Chat
      description: Retrieve a chat by ID, including its messages and generated assets.
      operationId: v2.getChat
      parameters:
      - $ref: '#/components/parameters/ChatId'
      responses:
        '200':
          description: Chat details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetChatResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/chats/{id}/cells:
    get:
      tags:
      - Chat
      summary: Get Chat Cells
      description: 'Retrieve a chat''s cells, the per-step execution detail behind each answer: user and assistant messages, generated SQL and Python with their outputs, and the assets each step produced, in conversation order. Paginated newest-first: the default page returns the most recent cells, and offset skips past them toward older ones. Pages extend backward to the start of a conversation turn, so a page can contain slightly more than limit cells.'
      operationId: v2.getChatCells
      parameters:
      - $ref: '#/components/parameters/ChatId'
      - name: limit
        in: query
        schema:
          type: integer
          format: int32
          default: 200
          maximum: 500
        description: Maximum cells per page (values outside 1-500 fall back to 200)
      - name: offset
        in: query
        schema:
          type: integer
          format: int32
          default: 0
        description: Number of most-recent cells to skip
      responses:
        '200':
          description: Chat cells
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetChatCellsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/chats/{id}/cells/{cellId}:
    get:
      tags:
      - Chat
      summary: Get Chat Cell
      description: Retrieve a single cell from a chat by ID.
      operationId: v2.getChatCell
      parameters:
      - $ref: '#/components/parameters/ChatId'
      - $ref: '#/components/parameters/CellId'
      responses:
        '200':
          description: Chat cell
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatCell'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/chats/{id}/cancel:
    post:
      tags:
      - Chat
      summary: Cancel Stream
      description: Cancel a running chat stream.
      operationId: v2.cancelStream
      parameters:
      - $ref: '#/components/parameters/ChatId'
      responses:
        '200':
          description: Cancellation result
          content:
            application/json:
              schema:
                type: object
                properties:
                  cancelled:
                    type: boolean
                    description: Whether the stream was successfully cancelled
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
  /v2/models:
    get:
      tags:
      - Chat
      summary: List Models
      description: List the models the authenticated organization may run chats on. The result is scoped to the org's enabled-model catalog and the caller's role allow-list, so it reflects exactly what `POST /v2/chats` will accept in its `model` field. Pass an entry's `id` back as that field.
      operationId: v2.listModels
      responses:
        '200':
          description: Available models
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListModelsResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    ListModelsResponse:
      type: object
      properties:
        models:
          type: array
          items:
            $ref: '#/components/schemas/Model'
      required:
      - models
    Asset:
      type: object
      properties:
        name:
          type: string
          description: Asset name
        type:
          type: string
          description: Asset type (e.g. chart, image, table, pdf, html, text, download)
        url:
          type: string
          description: Asset URL, freshly signed on every fetch
        content:
          type: string
          description: Inline text content, for text assets served without a URL
        cell_id:
          type: string
          format: uuid
          description: ID of the cell that produced this asset
        message_cell_id:
          type: string
          format: uuid
          description: cell_id of the assistant message this asset belongs to (Get Chat only)
        created_at:
          type: string
          format: date-time
    ChatMessage:
      type: object
      properties:
        role:
          type: string
          enum:
          - user
          - assistant
        content:
          type: string
          description: Markdown content
        created_at:
          type: string
          format: date-time
        cell_id:
          type: string
          format: uuid
          description: ID of the cell this message came from. Assets reference it via their message_cell_id.
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
          description: Assets produced while generating this message. Only present on assistant messages.
    ChatRequest:
      type: object
      required:
      - question
      properties:
        question:
          type: string
          description: The question to ask
        chat_id:
          type: string
          format: uuid
          description: Existing chat ID to continue a conversation
        model:
          type: string
          description: Optional model to run this chat on, as an `id` from `GET /v2/models` (e.g. `gemini_3_5_flash`). Omit to use the organization's default model. Only valid on new chats — supplying it together with `chat_id` returns 400, and a model the caller's org/role does not permit returns 403.
          example: gemini_3_5_flash
        tools:
          type: object
          description: Tool configuration. Enable specific tools for this chat session.
          properties:
            connector_ids:
              type: array
              items:
                type: integer
                format: int32
              description: Connector IDs to query
            sql_enabled:
              type: boolean
              description: Enable SQL query generation
            python_enabled:
              type: boolean
              description: Enable Python code execution
            web_search_enabled:
              type: boolean
              description: Enable web search
            ontology_enabled:
              type: boolean
              description: Enable ontology-based queries
            tableau_enabled:
              type: boolean
              description: Enable Tableau integration
            powerbi_enabled:
              type: boolean
              description: Enable Power BI integration
            google_drive_enabled:
              type: boolean
              description: Enable Google Drive integration
        connector_ids:
          type: array
          items:
            type: integer
            format: int32
          description: Connector IDs to query (shorthand for tools.connector_ids)
    GetChatResponse:
      type: object
      properties:
        chat:
          type: object
          properties:
            id:
              type: string
              format: uuid
            model:
              type: string
              description: LLM model name (e.g. default, sonnet_4, opus_4)
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ChatMessage'
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
    ListChatsResponse:
      type: object
      required:
      - chats
      - total_count
      properties:
        chats:
          type: array
          items:
            $ref: '#/components/schemas/ChatSummary'
        total_count:
          type: integer
          format: int32
    ChatCell:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Cell ID
        type:
          type: string
          description: Cell type (e.g. markdown, python, sql, tableau_sql, metrics, ontology_query, javascript, bash, mcp_tool, preview, web_search)
        status:
          type: string
          enum:
          - completed
          - running
          - pending
          - halted
          - failed
          - unknown
        created_at:
          type: string
          format: date-time
        error:
          type: string
          description: Execution error, when the step failed
        role:
          type: string
          enum:
          - user
          - assistant
          description: Message author (markdown cells only)
        content:
          type: string
          description: Markdown content (markdown cells only)
        code:
          type: string
          description: Executed code (python, javascript, and bash cells)
        query:
          type: string
          description: Executed query (sql, tableau_sql, metrics, and ontology_query cells)
        connector_id:
          type: integer
          format: int32
          description: Connector the query ran against (sql and ontology_query cells)
        output:
          type: array
          items:
            type: string
          description: Captured stdout/stderr (python, javascript, and bash cells)
        dataframe_preview:
          type: string
          description: Markdown preview of the result set (query and python cells)
        execution_time_ms:
          type: integer
          format: int64
        tool_name:
          type: string
          description: MCP tool invoked, as server/tool (mcp_tool cells only)
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
          description: Assets this cell produced
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Machine-readable error code
              enum:
              - invalid_request
              - unauthenticated
              - permission_denied
              - not_found
              - conflict
              - rate_limit_exceeded
              - internal
              - timeout
              - cancelled
              - execution_failed
              - no_report
            message:
              type: string
              description: Human-readable error message
    ChatResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Message ID
        created_at:
          type: string
          format: date-time
        model:
          type: string
          description: LLM model name (e.g. default, sonnet_4, opus_4)
        response:
          type: string
          description: Markdown-formatted answer
        chat_id:
          type: string
          format: uuid
          description: Chat session ID
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
          description: Assets produced by this response. Earlier turns' assets are available via Get Chat.
    Model:
      type: object
      properties:
        id:
          type: string
          description: Model identifier — pass this as the `model` field on POST /v2/chats.
          example: gemini_3_5_flash
        provider:
          type: string
          description: Inference provider for the model.
          example: google
        supports_fast_mode:
          type: boolean
          description: Whether the model can run in fast mode.
        default:
          type: boolean
          description: Whether this is the model the org default currently resolves to.
      required:
      - id
      - provider
      - supports_fast_mode
      - default
    ChatSummary:
      type: object
      required:
      - id
      properties:
        id:
          type: string
          format: uuid
        summary:
          type: string
          description: Chat title or summary
        timestamp:
          type: string
          format: date-time
          description: When the chat was created
        updated_at:
          type: string
          format: date-time
          description: When the chat was last updated
        creator_email:
          type: string
          description: Email of the user who created the chat
        preview:
          type: string
          description: Snippet of the first user message (up to 200 characters)
        source:
          type: string
          description: Chat source (e.g. thread, playbook, slack, feed)
        model:
          type: string
          description: LLM model name (e.g. default, sonnet_4, opus_4)
        is_running:
          type: boolean
          description: Whether the chat is currently processing a request
    GetChatCellsResponse:
      type: object
      properties:
        chat_id:
          type: string
          format: uuid
        cells:
          type: array
          items:
            $ref: '#/components/schemas/ChatCell'
        has_more:
          type: boolean
          description: Whether older cells exist beyond this page
  responses:
    InternalError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: internal
              message: Internal server error
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: not_found
              message: Resource not found
    BadRequest:
      description: Invalid request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: invalid_request
              message: Invalid request body
    RateLimited:
      description: Rate limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: rate_limit_exceeded
              message: Rate limit exceeded
    Unauthorized:
      description: Missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: unauthenticated
              message: Authentication required
    Forbidden:
      description: Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: permission_denied
              message: Insufficient permissions
  parameters:
    ChatId:
      name: id
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Chat ID
    CellId:
      name: cellId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Cell ID
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key or JWT token