> ## 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.

# Add a Document to a Vault

> Upload one document into a Contract Intelligence vault as multipart form data. The document is stored, its text is extracted, and it is then scanned against the vault's columns, so its extracted fields appear in the vault View a few minutes later.

Vaults accept a narrower set of formats than the rest of GC AI: PDF, Word (`.doc`, `.docx`), and plain text (`.txt`). Scanned and image-based PDFs are supported through OCR. Spreadsheets, presentations, standalone images, and email files are rejected.

Requires the `editor` or `owner` role in the vault and the organization-level permission to manage vaults; a caller with the role but not the permission gets `403`. A vault that has reached its document capacity or whose organization has no remaining allowance returns `409` with the same message the app shows, and stores nothing. While a vault is still in guided setup, documents are stored and scanned once setup finishes.

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/{id}/documents
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/{id}/documents:
    post:
      tags:
        - Contract Intelligence
      summary: Add a document to a vault
      description: >-
        Upload one document into a Contract Intelligence vault as multipart form
        data. The document is stored, its text is extracted, and it is then
        scanned against the vault's columns, so its extracted fields appear in
        the vault View a few minutes later.


        Vaults accept a narrower set of formats than the rest of GC AI: PDF,
        Word (`.doc`, `.docx`), and plain text (`.txt`). Scanned and image-based
        PDFs are supported through OCR. Spreadsheets, presentations, standalone
        images, and email files are rejected.


        Requires the `editor` or `owner` role in the vault and the
        organization-level permission to manage vaults; a caller with the role
        but not the permission gets `403`. A vault that has reached its document
        capacity or whose organization has no remaining allowance returns `409`
        with the same message the app shows, and stores nothing. While a vault
        is still in guided setup, documents are stored and scanned once setup
        finishes.


        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: uploadVaultDocument
      parameters:
        - schema:
            type: string
            format: uuid
            description: The vault ID
          required: true
          description: The vault ID
          name: id
          in: path
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/VaultDocumentUploadRequest'
      responses:
        '200':
          description: Document added to the vault
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VaultDocumentResponse'
        '400':
          description: >-
            Invalid request (missing file, unsupported file type for a vault, or
            file too large)
          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's vault role cannot add
            documents
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Vault not found, archived, or access denied
          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:
    VaultDocumentUploadRequest:
      type: object
      properties:
        file:
          type: string
          format: binary
          description: >-
            The document to add to the vault. PDF, Word (.doc/.docx), and plain
            text (.txt) only.
      required:
        - file
    VaultDocumentResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Unique file identifier for the uploaded document. Poll `GET
            /files/{id}` until `status` is `ready`.
        vault_id:
          type: string
          format: uuid
          description: The vault the document was added to
        name:
          type: string
          description: Original filename
        size:
          type: number
          description: File size in bytes
        content_type:
          type: string
          description: MIME type of the document
          example: application/pdf
        status:
          type: string
          enum:
            - extracting
            - embedding
            - ready
            - failed
          description: Text-extraction status of the document
        created_at:
          type: string
          description: ISO 8601 creation timestamp
      required:
        - id
        - vault_id
        - name
        - size
        - content_type
        - status
        - created_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.

````