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

# List workspaces

> Returns the workspaces the authenticated user belongs to, oldest first.




## OpenAPI

````yaml /openapi.yaml get /workspaces
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:
  /workspaces:
    get:
      tags:
        - Workspaces
      summary: List workspaces
      description: |
        Returns the workspaces the authenticated user belongs to, oldest first.
      operationId: listWorkspaces
      parameters:
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Cursor'
        - $ref: '#/components/parameters/IncludeSettings'
      responses:
        '200':
          description: One page of the user's workspaces.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkspaceList'
        '400':
          description: >-
            A `limit` or `cursor` that cannot be read, or `page` or `per_page`,
            which lists don't take.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  parameters:
    Limit:
      name: limit
      in: query
      description: Page size, 1 to 100.
      schema:
        type: integer
        default: 25
        minimum: 1
        maximum: 100
    Cursor:
      name: cursor
      in: query
      description: Opaque. Follow `_links.next.url` rather than building it.
      schema:
        type: string
    IncludeSettings:
      name: include
      in: query
      description: '`settings` adds each object''s `settings` block.'
      schema:
        type: string
        enum:
          - settings
  schemas:
    WorkspaceList:
      type: object
      properties:
        object:
          type: string
          description: Always `list`.
        data:
          description: |
            The workspaces on this page.
          type: array
          items:
            $ref: '#/components/schemas/Workspace'
        has_more:
          description: |
            Whether more results follow this page.
          type: boolean
        _links:
          type: object
          description: Empty on the last page.
          properties:
            next:
              description: |
                The next page. Absent on the last page.
              type: object
              properties:
                url:
                  type: string
                  format: uri
                  description: >-
                    The next page, with the same filters. Follow it rather than
                    building a cursor.
    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'
    Workspace:
      type: object
      properties:
        id:
          type: string
          description: Workspace ID, beginning with `wks_`. Treat it as an opaque string.
        name:
          description: |
            The workspace name, shown to its members in MeetingKit.
          type: string
        role:
          description: |
            The authenticated user's role in this workspace.

            - `owner`: owns the workspace.
            - `admin`: manages the workspace.
            - `member`: records and reads their own meetings.
            - `guest`: sees only what is shared with them.
          type: string
          enum:
            - owner
            - admin
            - member
            - guest
        created_at:
          description: |
            When it was created, in ISO 8601.
          type: string
          format: date-time
        updated_at:
          description: |
            When it last changed, in ISO 8601.
          type: string
          format: date-time
        owner_email:
          type: string
          description: (staff only) Email address of the workspace owner.
        members_count:
          type: integer
          description: (staff only) Number of members, excluding guests and deleted users.
        is_human_transcription_allowed:
          type: boolean
          description: (staff only) Whether the workspace may order human transcription.
        is_human_translation_allowed:
          type: boolean
          description: (staff only) Whether the workspace may order human translation.
        email_domains:
          type: array
          items:
            type: string
          description: (staff only) Domains that auto-join the workspace at sign-up.
        idp_company_names:
          type: array
          items:
            type: string
          description: (staff only) IdP company names configured for SSO.
        currency:
          type: string
          description: (staff only) Billing currency code, e.g. `usd`, `eur`, `gbp`.
        metadata:
          $ref: '#/components/schemas/Metadata'
          description: (staff only) Your key-value pairs.
        settings:
          $ref: '#/components/schemas/SettingsBlock'
          description: >
            (staff only) What applies to the workspace's meetings that no
            member, category or meeting decides. On

            [List workspaces](#operation/listWorkspaces), only with
            `include=settings`.
      example:
        id: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
        name: Acme Corp
        role: owner
        created_at: '2024-01-15T10:30:00.000Z'
        updated_at: '2024-02-01T14:20:00.000Z'
        metadata:
          gurusup_org_id: org_42
        owner_email: integrations@gurusup.com
        members_count: 12
        is_human_transcription_allowed: true
        is_human_translation_allowed: true
        email_domains: []
        idp_company_names: []
        currency: eur
        settings:
          recording:
            enabled: false
            methods:
              bot:
                start: on_join
                mode: audio_and_video
                silence_detection:
                  alert: true
          transcription:
            language: auto
          summary:
            template: general_meeting_notes
            language: same_as_transcript
          branding:
            brand_kit_id: none
          sources:
            recording.enabled:
              assignment_id: asg_01k6a0wks00000000000000000
            recording.methods.bot.start:
              assignment_id: asg_01k6a0wks00000000000000000
            recording.methods.bot.mode:
              assignment_id: asg_01k6a0wks00000000000000000
            recording.methods.bot.silence_detection.alert:
              assignment_id: asg_01k6a0wks00000000000000000
            transcription.language:
              assignment_id: asg_01k6a0wks00000000000000000
            summary.template:
              assignment_id: null
              reason: happyscribe_default
            summary.language:
              assignment_id: asg_01k6a0wks00000000000000000
            branding.brand_kit_id:
              assignment_id: asg_01k6a0wks00000000000000000
          assignments:
            - id: asg_01k6a3ext00000000000000000
              settings_id: set_01k6rec00000000000000000000
              scope:
                - workspace:wks_01k6a2r9s8x7c2dvq3m5n6p4ab
                - meetings:external
              own: true
            - id: asg_01k6a0wks00000000000000000
              settings_id: set_01k6wks00000000000000000000
              scope:
                - workspace:wks_01k6a2r9s8x7c2dvq3m5n6p4ab
              own: true
    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.
    Metadata:
      type: object
      description: >
        Your own key-value pairs, for your ids and context. MeetingKit stores
        them, returns them on

        the object and in every webhook that carries it, and never acts on them.
        Up to 50 keys of up

        to 40 characters (no square brackets), values up to 500 characters. See

        [metadata](/meetingkit/setup#a-workspace-per-customer).
      maxProperties: 50
      propertyNames:
        minLength: 1
        maxLength: 40
        pattern: ^[^\[\]]+$
      additionalProperties:
        type: string
        maxLength: 500
      example:
        gurusup_user_id: usr_8812
    SettingsBlock:
      type: object
      description: >
        What applies to this object, which assignment supplied each value, and
        every assignment that reaches it.

        A meeting is resolved exactly; a member as for a meeting in no category;
        a workspace as for a member with nothing

        of their own. See [Settings](/meetingkit/settings).
      properties:
        recording:
          description: |
            Whether the meeting is recorded, and how. Always a value.
          type: object
          properties:
            enabled:
              type: boolean
              description: Whether it is recorded.
            methods:
              description: |
                How it is recorded.
              type: object
              properties:
                bot:
                  description: |
                    The notetaker bot that joins the call.
                  type: object
                  properties:
                    start:
                      type: string
                      enum:
                        - on_join
                        - on_command
                      description: >
                        - `on_join`: records as soon as it joins.

                        - `on_command`: joins paused, until someone types
                        `!resume`.
                    mode:
                      type: string
                      enum:
                        - audio_and_video
                        - audio_only
                      description: |
                        - `audio_and_video`: audio and video.
                        - `audio_only`: audio only.
                    silence_detection:
                      description: |
                        What the bot does when nobody speaks for a while.
                      type: object
                      properties:
                        alert:
                          type: boolean
                          description: >-
                            Whether the bot posts a chat message after a long
                            silence.
        transcription:
          description: |
            How the recording is transcribed.
          type: object
          properties:
            language:
              type: string
              description: A language tag, `auto` or `multi`.
        summary:
          description: |
            How the summary is written.
          type: object
          properties:
            template:
              type: string
              description: The template's slug or `tpl_` id.
            language:
              type: string
              description: A language tag, or `same_as_transcript`.
        branding:
          description: |
            How the notetaker is branded.
          type: object
          properties:
            brand_kit_id:
              type: string
              description: >-
                The brand kit the bot is sent with, or `none` (also when the
                plan does not include notetaker customization).
        sources:
          type: object
          description: >
            For every field, by its dotted path (`recording.enabled`,
            `transcription.language`…), where the value came from.
          additionalProperties:
            $ref: '#/components/schemas/SettingsSource'
        assignments:
          type: array
          description: Every assignment that reaches the object, most specific first.
          items:
            type: object
            properties:
              id:
                type: string
                description: Beginning with `asg_`.
              settings_id:
                type: string
                description: The settings it applies, beginning with `set_`.
              scope:
                type: array
                description: Its conditions.
                items:
                  $ref: '#/components/schemas/SettingsCondition'
              own:
                type: boolean
                description: >-
                  Whether the assignment names this object itself, rather than
                  reaching it from above.
      example:
        recording:
          enabled: true
          methods:
            bot:
              start: on_join
              mode: audio_only
              silence_detection:
                alert: true
        transcription:
          language: ca
        summary:
          template: discovery_call
          language: same_as_transcript
        branding:
          brand_kit_id: brk_01k6acme00000000000000000
        sources:
          recording.enabled:
            assignment_id: asg_01k6a3ext00000000000000000
          recording.methods.bot.start:
            assignment_id: asg_01k6a1ana00000000000000000
          recording.methods.bot.mode:
            assignment_id: asg_01k6a1ana00000000000000000
          recording.methods.bot.silence_detection.alert:
            assignment_id: asg_01k6a1ana00000000000000000
          transcription.language:
            assignment_id: asg_01k6a1ana00000000000000000
          summary.template:
            assignment_id: asg_01k6a1ana00000000000000000
          summary.language:
            assignment_id: asg_01k6a1ana00000000000000000
          branding.brand_kit_id:
            assignment_id: asg_01k6a0wks00000000000000000
        assignments:
          - id: asg_01k6a3ext00000000000000000
            settings_id: set_01k6rec00000000000000000000
            scope:
              - member:mem_01k69x9s8x7c2dvq3m5n6p4ab
              - meetings:external
            own: false
          - id: asg_01k6a1ana00000000000000000
            settings_id: set_01k6sa1es0000000000000000a
            scope:
              - member:mem_01k69x9s8x7c2dvq3m5n6p4ab
            own: false
          - id: asg_01k6a0wks00000000000000000
            settings_id: set_01k6wks00000000000000000000
            scope:
              - workspace:wks_01k6a2r9s8x7c2dvq3m5n6p4ab
            own: false
    SettingsSource:
      type: object
      properties:
        assignment_id:
          type:
            - string
            - 'null'
          description: >-
            The assignment whose settings supplied the value; `null` when none
            did, and `reason` says why.
        reason:
          type: string
          enum:
            - happyscribe_default
            - no_meeting_url
            - unsupported_platform
            - member_paused
            - bot_cancelled
          description: >
            Present when no assignment supplied the value.


            - `happyscribe_default`: nothing sets it; MeetingKit's default
            applies.

            - `no_meeting_url`: the meeting has no link to join, so nothing
            records it.

            - `unsupported_platform`: the link is not Zoom, Google Meet or
            Microsoft Teams.

            - `member_paused`: the member paused their notetaker.

            - `bot_cancelled`: the bot sent to this meeting was cancelled before
            it joined.
    SettingsCondition:
      type: string
      description: >
        One condition of an assignment's `scope`, written `<kind>:<name>`. Every
        condition of a scope must hold.


        - `workspace:wks_…`: the workspace's members and meetings. A scope names
        exactly one `workspace:` or `member:`.

        - `member:mem_…`: one member's meetings.

        - `meeting:mtg_…`: one meeting, this occurrence only. It implies its
        workspace; a scope with it names no member.

        - `meetings:organized`: meetings the member organizes.

        - `meetings:internal`: meetings where every participant is a workspace
        member.

        - `meetings:domain`: meetings where every participant is on the member's
        email domain.

        - `meetings:external`: meetings with at least one participant outside
        the workspace.


        One category per scope for now; to record external *or* organized
        meetings, make two assignments of the same settings.
      example: meetings:external
  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'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your API key, sent bare. See
        [Authentication](/api-reference/authentication).

````