> ## Documentation Index
> Fetch the complete documentation index at: https://docs.textql.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create App



## OpenAPI

````yaml api-reference/speakeasy/textql-api-with-code-samples.yaml POST /textql.rpc.public.app.AppService/CreateApp
openapi: 3.1.0
info:
  title: TextQL API
  version: 1.0.0
  description: |
    TextQL public API. Generated from protobuf service definitions; internal
    endpoints are excluded via google.api.visibility / file_visibility.
servers:
  - url: https://app.textql.com
security:
  - apiKey: []
tags:
  - name: DashboardService
  - name: AppService
    description: |-
      AppService manages data apps: the generative app execution primitive.
       An app is agent-authored single-file HTML/JS/CSS executing in a CSP sandbox,
       fed a snapshot of its declared data sources. First-class resource, not a dashboard.
  - name: ConnectorService
  - name: PowerBIService
  - name: TableauService
  - name: DatasetService
  - name: OntologyManagementService
  - name: ChatService
  - name: AgentService
  - name: AuditLogService
  - name: MCPService
  - name: MetricsExportService
  - name: ObservabilityService
  - name: PlaybookService
  - name: RBACService
    description: RBAC service for managing roles, permissions, and access control
  - name: SandboxAdminService
  - name: SandboxQueryService
  - name: SandboxCapabilityService
  - name: ScimService
  - name: SecretService
  - name: SlackService
  - name: TeamsService
paths:
  /textql.rpc.public.app.AppService/CreateApp:
    post:
      tags:
        - AppService
      summary: CreateApp
      operationId: AppService_CreateApp
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/textql.rpc.public.app.CreateAppRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/textql.rpc.public.app.CreateAppResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
      x-codeSamples:
        - lang: python
          label: Python (SDK)
          source: |-
            import os
            from textql_sdk import Textql


            with Textql(
                api_key=os.getenv("TEXTQL_API_KEY", ""),
            ) as textql:

                res = textql.apps.create_app()

                # Handle response
                print(res)
        - lang: typescript
          label: TypeScript (SDK)
          source: |-
            import { Textql } from "@textql/sdk";

            const textql = new Textql({
              apiKey: process.env["TEXTQL_API_KEY"] ?? "",
            });

            async function run() {
              const result = await textql.apps.createApp({
                body: {},
              });

              console.log(result);
            }

            run();
components:
  schemas:
    connect-protocol-version:
      type: number
      title: Connect-Protocol-Version
      enum:
        - 1
      description: Define the version of the Connect protocol
      const: 1
      default: 1
    connect-timeout-header:
      type: number
      title: Connect-Timeout-Ms
      description: Define the timeout, in ms
    textql.rpc.public.app.CreateAppRequest:
      type: object
      properties:
        name:
          type: string
          title: name
        description:
          type: string
          title: description
          nullable: true
        code:
          type: string
          title: code
        dataSources:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.dashboard.DataSource'
          title: data_sources
        computeFunctions:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.ComputeFunction'
          title: compute_functions
        files:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.AppFile'
          title: files
        capabilities:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.Capability'
          title: capabilities
        appDbSetup:
          type: array
          items:
            type: string
          title: app_db_setup
      title: CreateAppRequest
      additionalProperties: false
    textql.rpc.public.app.CreateAppResponse:
      type: object
      properties:
        app:
          $ref: '#/components/schemas/textql.rpc.public.app.App'
          title: app
      title: CreateAppResponse
      additionalProperties: false
    connect.error:
      type: object
      properties:
        code:
          type: string
          examples:
            - not_found
          enum:
            - canceled
            - unknown
            - invalid_argument
            - deadline_exceeded
            - not_found
            - already_exists
            - permission_denied
            - resource_exhausted
            - failed_precondition
            - aborted
            - out_of_range
            - unimplemented
            - internal
            - unavailable
            - data_loss
            - unauthenticated
          description: >-
            The status code, which should be an enum value of
            [google.rpc.Code][google.rpc.Code].
        message:
          type: string
          description: >-
            A developer-facing error message, which should be in English. Any
            user-facing error message should be localized and sent in the
            [google.rpc.Status.details][google.rpc.Status.details] field, or
            localized by the client.
        details:
          type: array
          items:
            $ref: '#/components/schemas/connect.error_details.Any'
          description: >-
            A list of messages that carry the error details. There is no limit
            on the number of messages.
      title: Connect Error
      additionalProperties: true
      description: >-
        Error type returned by Connect:
        https://connectrpc.com/docs/go/errors/#http-representation
    textql.rpc.public.dashboard.DataSource:
      type: object
      allOf:
        - type: object
          properties:
            type:
              type: string
              title: type
              description: >-
                "sql_query", "file", "python_code", "ontology_sql", or
                "library_tql"
            name:
              type: string
              title: name
            parameters:
              type: array
              items:
                $ref: >-
                  #/components/schemas/textql.rpc.public.dashboard.QueryParameter
              title: parameters
              description: Parameters for live parameterized queries (sql_query type only)
            grant:
              $ref: '#/components/schemas/textql.rpc.public.dashboard.Grant'
              title: grant
              description: >-
                Optional author allowlist gating this source to specific org
                roles / members.
                 Presence forces the source out of the published snapshot (live-only, viewer-enforced).
        - oneOf:
            - type: object
              properties:
                file:
                  $ref: '#/components/schemas/textql.rpc.public.dashboard.FileSource'
                  title: file
              title: file
              required:
                - file
            - type: object
              properties:
                libraryTql:
                  $ref: >-
                    #/components/schemas/textql.rpc.public.dashboard.LibraryTQLSource
                  title: library_tql
              title: library_tql
              required:
                - libraryTql
            - type: object
              properties:
                ontologySql:
                  $ref: >-
                    #/components/schemas/textql.rpc.public.dashboard.OntologySqlSource
                  title: ontology_sql
              title: ontology_sql
              required:
                - ontologySql
            - type: object
              properties:
                pythonCode:
                  $ref: >-
                    #/components/schemas/textql.rpc.public.dashboard.PythonCodeSource
                  title: python_code
              title: python_code
              required:
                - pythonCode
            - type: object
              properties:
                sqlQuery:
                  $ref: >-
                    #/components/schemas/textql.rpc.public.dashboard.SqlQuerySource
                  title: sql_query
              title: sql_query
              required:
                - sqlQuery
      title: DataSource
      additionalProperties: false
      description: Unified data source for dashboards
    textql.rpc.public.app.ComputeFunction:
      type: object
      properties:
        name:
          type: string
          title: name
        description:
          type: string
          title: description
        params:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.ComputeFunctionParam'
          title: params
        returns:
          type: string
          title: returns
          nullable: true
        code:
          type: string
          title: code
        tqlPath:
          type: string
          title: tql_path
          nullable: true
        tql:
          type: string
          title: tql
          nullable: true
        grant:
          $ref: '#/components/schemas/textql.rpc.public.dashboard.Grant'
          title: grant
      title: ComputeFunction
      additionalProperties: false
    textql.rpc.public.app.AppFile:
      type: object
      properties:
        path:
          type: string
          title: path
        content:
          type: string
          title: content
      title: AppFile
      additionalProperties: false
    textql.rpc.public.app.Capability:
      type: object
      properties:
        type:
          type: string
          title: type
        name:
          type: string
          title: name
          description: string | number | boolean | object | array
          nullable: true
        connectorId:
          type: integer
          title: connector_id
          format: int32
          nullable: true
        statement:
          type: string
          title: statement
          nullable: true
        scope:
          type: string
          title: scope
          nullable: true
        subject:
          type: string
          title: subject
          nullable: true
        body:
          type: string
          title: body
          nullable: true
        parameters:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.CapabilityParam'
          title: parameters
      title: Capability
      additionalProperties: false
    textql.rpc.public.app.App:
      type: object
      properties:
        id:
          type: string
          title: id
        orgId:
          type: string
          title: org_id
        creatorId:
          type: string
          title: creator_id
        name:
          type: string
          title: name
        description:
          type: string
          title: description
          nullable: true
        code:
          type: string
          title: code
        dataSources:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.dashboard.DataSource'
          title: data_sources
        htmlUrl:
          type: string
          title: html_url
          nullable: true
        screenshotUrl:
          type: string
          title: screenshot_url
          nullable: true
        consoleErrors:
          type: array
          items:
            type: string
          title: console_errors
        chatId:
          type: string
          title: chat_id
          nullable: true
        publishedHtmlUrl:
          type: string
          title: published_html_url
          nullable: true
        hasUnpublishedChanges:
          type: boolean
          title: has_unpublished_changes
        computeFunctions:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.ComputeFunction'
          title: compute_functions
        files:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.AppFile'
          title: files
        scheduleEnabled:
          type: boolean
          title: schedule_enabled
        cronString:
          type: string
          title: cron_string
          nullable: true
        folderId:
          type: string
          title: folder_id
          nullable: true
        isFavorited:
          type: boolean
          title: is_favorited
        capabilities:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.app.Capability'
          title: capabilities
        appDbSetup:
          type: array
          items:
            type: string
          title: app_db_setup
        memberFeaturesEnabled:
          type: boolean
          title: member_features_enabled
        usesMemberFeatures:
          type: boolean
          title: uses_member_features
          deprecated: true
        viewerGrants:
          type: array
          items:
            type: string
          title: viewer_grants
        createdAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: created_at
        updatedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: updated_at
        refreshedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: refreshed_at
          nullable: true
        publishedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: published_at
          nullable: true
      title: App
      additionalProperties: false
    connect.error_details.Any:
      type: object
      properties:
        type:
          type: string
          description: >-
            A URL that acts as a globally unique identifier for the type of the
            serialized message. For example:
            `type.googleapis.com/google.rpc.ErrorInfo`. This is used to
            determine the schema of the data in the `value` field and is the
            discriminator for the `debug` field.
        value:
          type: string
          format: binary
          description: >-
            The Protobuf message, serialized as bytes and base64-encoded. The
            specific message type is identified by the `type` field.
        debug:
          oneOf:
            - type: object
              title: Any
              additionalProperties: true
              description: Detailed error information.
          discriminator:
            propertyName: type
          title: Debug
          description: >-
            Deserialized error detail payload. The 'type' field indicates the
            schema. This field is for easier debugging and should not be relied
            upon for application logic.
      additionalProperties: true
      description: >-
        Contains an arbitrary serialized message along with a @type that
        describes the type of the serialized message, with an additional debug
        field for ConnectRPC error details.
    textql.rpc.public.dashboard.QueryParameter:
      type: object
      properties:
        name:
          type: string
          title: name
        type:
          type: string
          title: type
          description: '"string", "int", "float", "date"'
        default:
          type: string
          title: default
          nullable: true
      title: QueryParameter
      additionalProperties: false
    textql.rpc.public.dashboard.Grant:
      type: object
      properties:
        roles:
          type: array
          items:
            type: string
          title: roles
          description: org role names
        members:
          type: array
          items:
            type: string
          title: members
          description: explicit member ids
      title: Grant
      additionalProperties: false
      description: >-
        Grant is an author allowlist gating a data source or compute function. A
        viewer whose
         effective role names intersect roles, or whose member id is listed in members, may call it.
         Absent grant = org-visible (today's behavior); an empty grant object is invalid.
    textql.rpc.public.dashboard.FileSource:
      type: object
      properties:
        datasetId:
          type: string
          title: dataset_id
        fileName:
          type: string
          title: file_name
          description: Original filename for display
        sheetIndex:
          type: integer
          title: sheet_index
          format: int32
          description: Zero-based sheet index for multi-sheet files (default 0)
      title: FileSource
      additionalProperties: false
    textql.rpc.public.dashboard.LibraryTQLSource:
      type: object
      properties:
        tqlPath:
          type: string
          title: tql_path
          description: path to the .tql file in the Context Library (must end in .tql)
        connectorId:
          type: integer
          title: connector_id
          format: int32
          description: SQL connector to execute the rendered query against
        paramsJson:
          type: string
          title: params_json
          description: JSON object mapping parameter names to values; "" means no params
      title: LibraryTQLSource
      additionalProperties: false
      description: >-
        References a .tql file stored in the Context Library. The file is
        rendered
         to SQL at fetch time and executed against the provided connector. Template
         parameter values are JSON-encoded in `params_json` (e.g. {"region":"EU"}).
    textql.rpc.public.dashboard.OntologySqlSource:
      type: object
      properties:
        query:
          type: string
          title: query
        dataset:
          type: string
          title: dataset
        ontologyId:
          type: integer
          title: ontology_id
          format: int32
      title: OntologySqlSource
      additionalProperties: false
    textql.rpc.public.dashboard.PythonCodeSource:
      type: object
      properties:
        code:
          type: string
          title: code
      title: PythonCodeSource
      additionalProperties: false
    textql.rpc.public.dashboard.SqlQuerySource:
      type: object
      properties:
        query:
          type: string
          title: query
        connectorId:
          type: integer
          title: connector_id
          format: int32
        predicate:
          type: string
          title: predicate
          description: >-
            Optional viewer row-filter appended server-side at live-query time;
            binds :viewer_member_id / :viewer_email. Presence forces the source
            out of the published snapshot.
      title: SqlQuerySource
      additionalProperties: false
    textql.rpc.public.app.ComputeFunctionParam:
      type: object
      properties:
        name:
          type: string
          title: name
        type:
          type: string
          title: type
        description:
          type: string
          title: description
          nullable: true
      title: ComputeFunctionParam
      additionalProperties: false
    textql.rpc.public.app.CapabilityParam:
      type: object
      properties:
        name:
          type: string
          title: name
        type:
          type: string
          title: type
          nullable: true
        description:
          type: string
          title: description
          nullable: true
      title: CapabilityParam
      additionalProperties: false
    google.protobuf.Timestamp:
      type: string
      examples:
        - '2023-01-15T01:30:15.01Z'
        - '2024-12-25T12:00:00Z'
      format: date-time
      description: >-
        A Timestamp represents a point in time independent of any time zone or
        local
         calendar, encoded as a count of seconds and fractions of seconds at
         nanosecond resolution. The count is relative to an epoch at UTC midnight on
         January 1, 1970, in the proleptic Gregorian calendar which extends the
         Gregorian calendar backwards to year one.

         All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
         second table is needed for interpretation, using a [24-hour linear
         smear](https://developers.google.com/time/smear).

         The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
         restricting to that range, we ensure that we can convert to and from [RFC
         3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.

         # Examples

         Example 1: Compute Timestamp from POSIX `time()`.

             Timestamp timestamp;
             timestamp.set_seconds(time(NULL));
             timestamp.set_nanos(0);

         Example 2: Compute Timestamp from POSIX `gettimeofday()`.

             struct timeval tv;
             gettimeofday(&tv, NULL);

             Timestamp timestamp;
             timestamp.set_seconds(tv.tv_sec);
             timestamp.set_nanos(tv.tv_usec * 1000);

         Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.

             FILETIME ft;
             GetSystemTimeAsFileTime(&ft);
             UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;

             // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
             // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
             Timestamp timestamp;
             timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
             timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));

         Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.

             long millis = System.currentTimeMillis();

             Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
                 .setNanos((int) ((millis % 1000) * 1000000)).build();

         Example 5: Compute Timestamp from Java `Instant.now()`.

             Instant now = Instant.now();

             Timestamp timestamp =
                 Timestamp.newBuilder().setSeconds(now.getEpochSecond())
                     .setNanos(now.getNano()).build();

         Example 6: Compute Timestamp from current time in Python.

             timestamp = Timestamp()
             timestamp.GetCurrentTime()

         # JSON Mapping

         In JSON format, the Timestamp type is encoded as a string in the
         [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
         format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
         where {year} is always expressed using four digits while {month}, {day},
         {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
         seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
         are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
         is required. A proto3 JSON serializer should always use UTC (as indicated by
         "Z") when printing the Timestamp type and a proto3 JSON parser should be
         able to accept both UTC and other timezones (as indicated by an offset).

         For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
         01:30 UTC on January 15, 2017.

         In JavaScript, one can convert a Date object to this format using the
         standard
         [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
         method. In Python, a standard `datetime.datetime` object can be converted
         to this format using
         [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
         the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
         the Joda Time's [`ISODateTimeFormat.dateTime()`](
         http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
         ) to obtain a formatter capable of generating timestamps in this format.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: tql_api_key

````