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

# Create a Vault

> Create a Contract Intelligence vault. The caller becomes its `owner`, and the vault starts access-controlled, so nobody else can see it until you add members or turn access control off.

A vault created here skips guided setup and is ready for documents right away: upload with `POST /vaults/{id}/documents`, add columns with `POST /vaults/{id}/columns`, and read the extracted table from `GET /vaults/{id}/documents`. In the app a vault waits in guided setup, and documents added meanwhile are stored but not scanned. There is no guided setup over the API, so this endpoint finishes setup as it creates the vault and every upload is scanned as it arrives.

Creating a vault needs the organization-level permission to create vaults, which an organization admin grants. Vault names do not have to be unique.

Requires a user-scoped API key (`u:gcai_...`). A vault is shared with named people, so an organization-scoped key has no identity to resolve vault access with.



## OpenAPI

````yaml POST /vaults
openapi: 3.0.3
info:
  title: GC AI External API
  version: 1.0.0
  description: >-
    The GC AI External API allows programmatic access to GC AI's chat
    capabilities. It's designed for integration with workflow automation tools
    like Zapier, Make, n8n, or custom applications.


    ## Authentication


    All API requests must include an API key in the `Authorization` header:


    ```

    Authorization: gcai_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    ```


    API keys can be created in the GC AI app under **Settings → API**.


    ## Multi-turn Conversations


    Conversations can span multiple turns: pass the `chat_id` returned by a
    completion back on your next request to continue the same chat. See
    [Multi-turn Conversations](/api-reference/concepts/multi-turn).


    ## Current Limitations


    The following is not yet available via API:


    - **Interactive clarification**: the model cannot pause to ask the caller a
    follow-up question; the `askUserQuestions` tool is disabled on the API
    surface


    ## Usage


    Usage is tracked and viewable in the GC AI app under **Settings → API → View
    Usage**.


    ## Support


    For API support, contact [support@gc.ai](mailto:support@gc.ai) or reach out
    to your account representative.
  contact:
    email: support@gc.ai
servers:
  - url: https://app.gc.ai/api/external/v1
    description: Production server
security: []
tags:
  - name: Async Jobs
    description: Poll the status and result of asynchronous API jobs
  - name: Chat
    description: AI chat completion endpoints
  - name: Chats
    description: Chat management, message history, and sharing endpoints
  - name: Contract Intelligence
    description: Vault discovery and document ingestion endpoints for Contract Intelligence
  - name: Files
    description: File upload and management endpoints
  - name: Folders
    description: Folder management endpoints
  - name: Playbooks
    description: Playbook review endpoints
  - name: Profiles
    description: Personal and company profile endpoints
  - name: Projects
    description: Project management endpoints
  - name: Skills
    description: Skill library management endpoints
  - name: Utility
    description: Health check and connectivity endpoints
  - name: Usage
    description: Usage and credit/billing reporting endpoints
paths:
  /vaults:
    post:
      tags:
        - Contract Intelligence
      summary: Create a vault
      description: >-
        Create a Contract Intelligence vault. The caller becomes its `owner`,
        and the vault starts access-controlled, so nobody else can see it until
        you add members or turn access control off.


        A vault created here skips guided setup and is ready for documents right
        away: upload with `POST /vaults/{id}/documents`, add columns with `POST
        /vaults/{id}/columns`, and read the extracted table from `GET
        /vaults/{id}/documents`. In the app a vault waits in guided setup, and
        documents added meanwhile are stored but not scanned. There is no guided
        setup over the API, so this endpoint finishes setup as it creates the
        vault and every upload is scanned as it arrives.


        Creating a vault needs the organization-level permission to create
        vaults, which an organization admin grants. Vault names do not have to
        be unique.


        Requires a user-scoped API key (`u:gcai_...`). A vault is shared with
        named people, so an organization-scoped key has no identity to resolve
        vault access with.
      operationId: createVault
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VaultCreateRequest'
      responses:
        '201':
          description: The created vault
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VaultResponse'
        '400':
          description: Invalid request body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or malformed API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Contract Intelligence is not enabled for this account. Contact
            support to request access., or the caller cannot create vaults
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: A vault with that name already exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            Vault access is per-user and requires a user-scoped API key
            (u:gcai_...).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Rate limit exceeded. See [Rate
            Limits](/api-reference/concepts/rate-limits) for the tiers, limits,
            and how to back off.
          headers:
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying after a rate-limit block.
                example: '60'
              required: true
              description: Seconds to wait before retrying after a rate-limit block.
            RateLimit-Limit:
              schema:
                type: string
                description: Request quota for the applicable window.
                example: '3'
              required: true
              description: Request quota for the applicable window.
            RateLimit-Remaining:
              schema:
                type: string
                description: Requests remaining in the current window.
                example: '0'
              required: true
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: string
                description: Seconds until the quota resets.
                example: '60'
              required: true
              description: Seconds until the quota resets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service temporarily unavailable
          headers:
            Retry-After:
              schema:
                type: string
                description: >-
                  Seconds to wait before retrying after a transient service
                  outage.
                example: '5'
              required: true
              description: >-
                Seconds to wait before retrying after a transient service
                outage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    VaultCreateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            Vault name. Omit it and GC AI allocates the next free default name
            (`New Vault`, `New Vault (2)`, and so on).
          example: Vendor SaaS agreements
        description:
          type: string
          maxLength: 1000
          description: Optional description shown beside the vault name
    VaultResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique vault identifier
        name:
          type: string
          description: Vault name
          example: Vendor SaaS agreements
        description:
          type: string
          nullable: true
          description: Vault description, or null if unset
        my_role:
          type: string
          enum:
            - owner
            - editor
            - viewer
          description: >-
            Caller's role in this vault: `owner` (manage members and settings),
            `editor` (add documents and edit extracted data), or `viewer` (read
            and annotate). A vault the caller reaches only through
            organization-wide visibility reports `viewer`. The role is not the
            whole story for writes: adding documents also needs the
            organization-level permission to manage vaults, so a caller can hold
            `editor` here and still receive `403` from `POST
            /vaults/{id}/documents`.
        is_access_controlled:
          type: boolean
          description: >-
            When true, only vault members can see the vault. When false, any
            member of the organization with organization-wide vault read can see
            it.
        document_count:
          type: number
          description: >-
            Documents that have finished scanning in this vault. Documents still
            being read are not counted yet.
        setup_completed_at:
          type: string
          nullable: true
          description: >-
            ISO 8601 timestamp when guided setup finished, or null while the
            vault is still in setup. Documents added to a vault in setup are
            stored but not scanned until setup finishes. Vaults created through
            `POST /vaults` finish setup immediately, so this is always set for
            them.
        archived_at:
          type: string
          nullable: true
          description: >-
            ISO 8601 timestamp when the vault was archived, or null while it is
            live. Archived vaults are hidden from the default list and reject
            changes until `POST /vaults/{id}/restore` runs.
        created_at:
          type: string
          description: ISO 8601 creation timestamp
        updated_at:
          type: string
          description: ISO 8601 last-update timestamp
      required:
        - id
        - name
        - description
        - my_role
        - is_access_controlled
        - document_count
        - setup_completed_at
        - archived_at
        - created_at
        - updated_at
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
        code:
          type: string
          description: >-
            Machine-readable error code present on some errors (e.g.
            `RATE_LIMITED`, `INSUFFICIENT_CREDITS`, `TRIAL_NOT_STARTED`,
            `BILLING_NOT_CONFIGURED`). Branch on this rather than the
            human-readable `error` string.
        message:
          type: string
          description: Additional error details
        details:
          type: object
          additionalProperties:
            nullable: true
          description: Validation error details (for 400 errors)
      required:
        - error
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: |-
        API key for authentication. Format: `gcai_xxxxxxxxx`

        Create API keys in the GC AI app under Settings → API.

````