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

# Upload a file

> Uploads an image to a workspace, as `multipart/form-data`, and returns a file with a
`file_` id. The key must be an owner or admin of the workspace, and the workspace's
plan must include notetaker customization. A workspace takes 60 uploads a minute.

The image is a PNG, JPEG, GIF, WebP or SVG of at most 10 MB. Its type is read from its
bytes, not from its name or declared type.




## OpenAPI

````yaml /openapi.yaml post /files
openapi: 3.1.0
info:
  title: MeetingKit API
  description: >
    The MeetingKit API lets you build a meetings feature into your product:
    users connect

    a calendar, a notetaker joins their calls, and you get the transcript,
    speakers and

    summary of each meeting.
  version: '2026-10-12'
  contact:
    name: MeetingKit Developer Support
    email: dev@happyscribe.co
servers:
  - url: https://api.meetingkit.com/api/v1
security:
  - apiKeyAuth: []
tags:
  - name: Agent sessions
    description: Exchange the code a user hands their AI agent for API credentials.
  - name: Uploads
    description: Get signed URLs to upload media files directly to MeetingKit storage.
  - name: Transcribe
    description: Create transcription orders from media URLs.
  - name: Subtitle
    description: Create subtitling orders from media URLs.
  - name: Translate
    description: Create translation orders from existing conversations.
  - name: Orders
    description: Retrieve and confirm the orders created by the service endpoints.
  - name: Conversations
    description: List, retrieve, update, and delete conversations.
  - name: Exports
    description: Export conversations to text, subtitle, video-editing, and data formats.
  - name: Bots
    description: Send a notetaker bot to Zoom, Google Meet, or Microsoft Teams calls.
  - name: Glossaries
    description: List glossaries to apply custom terminology to orders.
  - name: Style guides
    description: List style guides to apply formatting preferences to orders.
  - name: Workspaces
    description: List the workspaces the authenticated user belongs to.
  - name: Organization memberships
    description: Manage which users belong to a workspace.
  - name: Members
    description: A partner's end users inside a workspace (MeetingKit).
  - name: Meetings
    description: >-
      Every meeting of a workspace, from calendars and bots, with its results
      (MeetingKit).
  - name: Calendar connections
    description: >-
      Members' Google and Microsoft calendars, connected through a hosted
      consent link and synced by MeetingKit.
  - name: Calendar events
    description: Calendar events a partner pushes from its own calendar sync (MeetingKit).
  - name: Settings
    description: >-
      What gets recorded and how, as values you assign to a workspace, a member,
      a meeting category or one meeting (MeetingKit).
  - name: Settings assignments
    description: Where settings apply (MeetingKit).
  - name: Files
    description: Images uploaded to a workspace, to use in a brand kit (MeetingKit).
  - name: Webhook endpoints
    description: Register the receivers of a workspace's webhooks, and test them.
  - name: Webhook events
    description: >-
      The webhooks sent to a workspace's endpoints, how each delivery went, and
      redelivery.
  - name: People
    description: >-
      Language Services. People found in your transcripts (Memory API, private
      beta).
  - name: Companies
    description: >-
      Language Services. Companies found in your transcripts (Memory API,
      private beta).
paths:
  /files:
    post:
      tags:
        - Files
      summary: Upload a file
      description: >
        Uploads an image to a workspace, as `multipart/form-data`, and returns a
        file with a

        `file_` id. The key must be an owner or admin of the workspace, and the
        workspace's

        plan must include notetaker customization. A workspace takes 60 uploads
        a minute.


        The image is a PNG, JPEG, GIF, WebP or SVG of at most 10 MB. Its type is
        read from its

        bytes, not from its name or declared type.
      operationId: uploadFile
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/FileCreate'
      responses:
        '201':
          description: File uploaded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
        '400':
          description: >-
            The request names no workspace and the key does not belong to
            exactly one (`missing`, on `workspace_id`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            The key is not an owner or admin of the workspace
            (`workspace_update_not_allowed`), or its plan does not include
            notetaker customization (`plan_upgrade_required`). Nothing is
            uploaded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '404':
          description: '`workspace_id` is not a workspace the key belongs to.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '422':
          description: >-
            A field failed validation: `file` or `purpose` is missing
            (`missing`), `file` is not sent as a multipart file, is not one of
            the five image types or is over 10 MB (`invalid`), or `purpose` is
            not one of its values (`inclusion`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  schemas:
    FileCreate:
      type: object
      required:
        - file
        - purpose
      properties:
        file:
          type: string
          format: binary
          description: The image, a PNG, JPEG, GIF, WebP or SVG of at most 10 MB.
        purpose:
          type: string
          enum:
            - brand_kit
          description: 'What the file is for. `brand_kit`: an image for a brand kit.'
        workspace_id:
          type: string
          description: >-
            The workspace the file belongs to. Optional when the key belongs to
            exactly one workspace, which is then used. A `wks_` id; integer
            workspace ids are still accepted.
          example: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
    File:
      type: object
      required:
        - id
        - object
        - purpose
        - workspace_id
        - filename
        - content_type
        - size
        - url
        - created_at
      properties:
        id:
          type: string
          description: File ID, beginning with `file_`.
        object:
          type: string
          description: Always `file`.
        purpose:
          type: string
          enum:
            - brand_kit
          description: 'What the file is for. `brand_kit`: an image for a brand kit.'
        workspace_id:
          type: string
          description: The workspace the file belongs to, a `wks_` id.
        filename:
          type: string
          description: >-
            The name the file was uploaded with. Its extension is replaced when
            it does not match the image type.
        content_type:
          type: string
          enum:
            - image/png
            - image/jpeg
            - image/gif
            - image/webp
            - image/svg+xml
          description: |
            The image type, read from the file's bytes.

            - `image/png`: PNG.
            - `image/jpeg`: JPEG.
            - `image/gif`: GIF.
            - `image/webp`: WebP.
            - `image/svg+xml`: SVG.
        size:
          type: integer
          description: Size in bytes.
        url:
          type: string
          format: uri
          description: >-
            A signed URL to download the file, valid for one year. Every read
            returns a fresh one. An SVG is served as a download, never inline.
        created_at:
          type: string
          format: date-time
          description: When the file was uploaded, in ISO 8601.
      example:
        id: file_01k6d8q4z7m2n5p8r1s3t6v9wx
        object: file
        purpose: brand_kit
        workspace_id: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
        filename: logo.png
        content_type: image/png
        size: 48213
        url: >-
          https://assets.meetingkit.com/files/logo.png?Expires=1822298280&Signature=…
        created_at: '2026-09-30T09:58:00Z'
    Errors:
      type: object
      required:
        - errors
      description: >
        Every error the API returns, `401` and `429` included. See
        [Errors](/api-reference/errors).
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
        retry_in_seconds:
          type: integer
          description: >-
            On `429`, how long to wait before retrying. Also sent as
            `Retry-After`.
      example:
        errors:
          - code: invalid
            field: recording.methods.bot.mode
            message: 'must be one of: audio_and_video, audio_only, inherit'
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: >-
            A stable snake_case word, safe to branch on. See
            [Errors](/api-reference/errors) for the list.
        message:
          type: string
          description: A sentence for humans. It may change; do not parse it.
        field:
          type: string
          description: >-
            The dotted path to the request field at fault, such as
            `recording.methods.bot.mode`. Present only when one field is.
  responses:
    Unauthorized:
      description: >-
        Your API key is missing (`missing_api_key`) or wrong
        (`invalid_api_key`), or it may not access this resource
        (`unauthorized`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
    TooManyRequests:
      description: >-
        Rate limit reached (`rate_limited`). Wait `retry_in_seconds`, also sent
        as `Retry-After`, before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your API key, sent bare. See
        [Authentication](/api-reference/authentication).

````