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

# Initialize Upload

> Initialize a new file upload session. This request prepares the backend and generates a pre-signed URL for S3 storage. Depending on file size, the upload may use a single PUT or a multipart upload (requiring an UploadId). Files can be uploaded in different ingestion modes: standard files (default) or policy documents. Policy uploads are treated as compliance source documents and may later be used to derive redaction or detection rules. If no ingestion mode is provided, the upload defaults to standard file ingestion.



## OpenAPI

````yaml POST /upload/init
openapi: 3.0.1
info:
  title: Indora Labs API
  description: >-
    Comprehensive API for search, ingestion, file ops, redaction, detections,
    audit trail, and case management. All endpoints return strongly-typed JSON
    with explicit field descriptions and examples.
  version: 1.0.0
  license:
    name: Proprietary
servers:
  - url: https://api.indoralabs.com
security:
  - apiKeyAuth: []
tags:
  - name: Search
  - name: Uploads
  - name: Files
  - name: Redactions
  - name: Detections
  - name: Cases
  - name: Audit
  - name: Auth
  - name: Embeddings
  - name: Policy
paths:
  /upload/init:
    post:
      tags:
        - Uploads
      summary: Start an upload session
      description: >-
        Initialize a new file upload session. This request prepares the backend
        and generates a pre-signed URL for S3 storage. Depending on file size,
        the upload may use a single PUT or a multipart upload (requiring an
        UploadId). Files can be uploaded in different ingestion modes: standard
        files (default) or policy documents. Policy uploads are treated as
        compliance source documents and may later be used to derive redaction or
        detection rules. If no ingestion mode is provided, the upload defaults
        to standard file ingestion.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadInitRequest'
      responses:
        '200':
          description: Upload session info
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadInitResponse'
        '500':
          description: Server misconfiguration (bucket not configured)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    UploadInitRequest:
      type: object
      required:
        - filename
      properties:
        filename:
          type: string
          description: Client-provided file name (used for display only).
        contentType:
          type: string
          description: >-
            MIME type of the file (e.g., application/pdf). Optional; inferred if
            omitted.
        sizeBytes:
          type: integer
          description: >-
            Total file size in bytes. Used to determine single vs multipart
            upload.
        ingestionMode:
          type: string
          enum:
            - default
            - policy
          default: default
          description: >-
            Controls how the uploaded file is ingested. Use `policy` when
            uploading a policy document that will generate compliance rules.
      example:
        filename: use-of-force-policy.pdf
        contentType: application/pdf
        sizeBytes: 1048576
        ingestionMode: policy
    UploadInitResponse:
      type: object
      properties:
        mode:
          type: string
          enum:
            - single
            - multipart
          description: Upload mode chosen by server based on size.
        uploadId:
          type: string
          description: Server-side upload session id.
        key:
          type: string
          description: S3 object key to use for subsequent requests.
        putUrl:
          type: string
          description: Pre-signed URL for single part upload (present when mode=single).
        uploadIdS3:
          type: string
          description: S3 UploadId for multipart uploads.
      example:
        mode: multipart
        uploadId: upl_123
        key: tenant/abc/file/xyz
        uploadIdS3: AbCdeFG...
    Error:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Short error code or category.
        message:
          type: string
          description: Human-readable error explanation.
        details:
          type: object
          description: Optional structured error details for debugging.
      example:
        error: BadRequest
        message: Missing required parameter 'fileId'.
        details:
          param: fileId
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````