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

# Upload File

> Accepts a single file via multipart upload alongside a `purpose` field that
declares how the file will be used. Subject to per-file and per-organization
storage limits.

Upload a file as `multipart/form-data` (`file` + `purpose`) to reference by id in later requests. Compatible with [OpenAI's Upload file endpoint](https://developers.openai.com/api/reference/resources/files/methods/create).

The response returns the file's `id` (e.g. `file-abc123`). See [Working with files](/perceptron-mk1/guides/files) for how to reference it in a chat completion.

## Limits

| Limit                          | Value   |
| ------------------------------ | ------- |
| Maximum file size              | 128 MiB |
| Total storage per organization | 100 GiB |

Need higher limits? [Contact us](mailto:support@perceptron.inc).

Rate limit: **60 requests/min**.


## OpenAPI

````yaml api-reference/openapi.json POST /v1/files
openapi: 3.1.0
info:
  title: Perceptron API
  contact:
    name: Perceptron API Support
    email: support@perceptron.inc
  version: 1.0.0
servers:
  - url: https://api.perceptron.inc
security: []
tags:
  - name: Chat Completions
    description: Chat completions API (OpenAI-compatible)
  - name: Detection
    description: Native Perceptron image detection API
  - name: Models
    description: Model listing and metadata API
  - name: Files
    description: File upload, listing, retrieval, and deletion API
paths:
  /v1/files:
    post:
      tags:
        - Files
      summary: Upload a file
      description: >-
        Accepts a single file via multipart upload alongside a `purpose` field
        that

        declares how the file will be used. Subject to per-file and
        per-organization

        storage limits.
      operationId: handle_upload_file
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/UploadRequest'
        required: true
      responses:
        '200':
          description: File uploaded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
        '400':
          description: Invalid request — missing field, unsupported content type, etc.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIErrorResponse'
              example:
                error:
                  code: null
                  message: >-
                    Unsupported content type 'text/plain'. Supported:
                    image/jpeg, image/png, image/webp, video/mp4,
                    video/quicktime, video/webm
                  param: null
                  type: invalid_request_error
        '401':
          description: Authentication failed. Invalid or missing API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIErrorResponse'
              example:
                error:
                  code: null
                  message: Invalid API key
                  param: null
                  type: authentication_error
        '411':
          description: Missing `Content-Length` header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIErrorResponse'
              example:
                error:
                  code: null
                  message: Content-Length header is required for /v1/files.
                  param: null
                  type: invalid_request_error
        '413':
          description: Upload would exceed the per-file or per-organization storage limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIErrorResponse'
              example:
                error:
                  code: null
                  message: >-
                    You exceeded your current quota, please check your plan and
                    billing details.
                  param: null
                  type: insufficient_quota
        '500':
          description: Internal server error while processing the upload.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIErrorResponse'
              example:
                error:
                  code: null
                  message: The server had an error while processing your request.
                  param: null
                  type: server_error
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - label: cURL
          lang: curl
          source: |-
            curl https://api.perceptron.inc/v1/files \
              -H "Authorization: Bearer $PERCEPTRON_API_KEY" \
              -F purpose=vision \
              -F 'file=@video.mp4'
components:
  schemas:
    UploadRequest:
      type: object
      description: >-
        Multipart form body for `POST /v1/files`. Send the file bytes in the
        `file`

        field and the file's intended `purpose`.
      required:
        - file
        - purpose
      properties:
        file:
          type: string
          format: binary
          description: >-
            The file to upload. Must be one of: `image/jpeg`, `image/png`,
            `image/webp`, `video/mp4`, `video/quicktime`, `video/webm`.
        purpose:
          $ref: '#/components/schemas/FilePurpose'
          description: File purpose.
    File:
      type: object
      required:
        - object
        - id
        - bytes
        - created_at
        - filename
        - purpose
      properties:
        bytes:
          type: integer
          format: int64
          description: File size in bytes.
        created_at:
          type: integer
          format: int64
          description: Unix timestamp (seconds) when the file was created.
        filename:
          type: string
          description: Original file name.
        id:
          type: string
          description: File ID, e.g. `file-abc123`.
        object:
          type: string
          description: Always "file".
        purpose:
          $ref: '#/components/schemas/FilePurpose'
          description: File purpose.
    OpenAIErrorResponse:
      type: object
      description: OpenAI-compatible error response format.
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/OpenAIErrorDetail'
    FilePurpose:
      type: string
      enum:
        - vision
        - user_data
      example: vision
    OpenAIErrorDetail:
      type: object
      description: OpenAI-compatible error detail.
      required:
        - message
      properties:
        code:
          type:
            - string
            - 'null'
        message:
          type: string
        param:
          type:
            - string
            - 'null'
        type:
          type:
            - string
            - 'null'
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: Bearer token authentication using your Perceptron API key

````