---
title: "Search"
method: GET
path: "/search"
tags: ["Search"]
---

# Search

`GET /search`

## Request

- Base URL: `https://api.wistia.com/modern`
- URL: `https://api.wistia.com/modern/search`
- Auth: HTTP bearer

Searches across folders, subfolders, medias, channels, channel episodes, and webinars.
Also searches through video transcripts, so media results may include transcript matches with
timestamps when the query matches spoken content.

## Requires api token with one of the following permissions
```
Read all data
```

Tokens with the "Act with a team member's permissions" permission
(`all:delegate_to_contact_permissions` scope) can also be used. Requests
made with such a token are authorized using the permissions of the
contact assigned to the token.

[Expiring access tokens](https://docs.wistia.com/reference/post_expiring-token)
created with authorizations cannot be used: search responds with a 403,
whatever the authorizations grant.

## Query parameters

- `q` string, required
- `tags[]` string[]
- `resource_type[]` string[]
- `custom_metadata` object
- `include` 'custom_metadata'
- `created_after` string, date-time
- `created_before` string, date-time

## Headers

- `X-Wistia-API-Version` string, required

## Response `200`

Search results

- object
  - `data` object, required
    - `folders` object[], required
      - `id` integer, required: A unique numeric identifier for the folder within the system.
      - `name` string, required: The folder’s display name.
      - `description` string, nullable: The folder’s description.
      - `media_count` integer, required: The number of different medias that have been uploaded to the folder.
      - `medias` object, required: A link to where you can fetch the medias for this folder.
        - `url` string: A URL for fetching all child records of the parent record.
      - `created` string, date-time, required: The date that the folder was originally created.
      - `updated` string, date-time, required: The date that the folder was last updated.
      - `hashed_id` string, required: A private hashed id, uniquely identifying the folder within the system.
      - `public` boolean, required: A boolean indicating whether the folder is available for public (anonymous) viewing.
      - `public_id` string, nullable, required: If the folder is public, this field contains a string representing the ID used for referencing the folder in public URLs.
      - `anonymous_can_upload` boolean
      - `anonymous_can_download` boolean
      - `kind` 'library' | 'shared' | 'account', required: Indicates the folder's access scope, relative to the requesting user. One of: - `library`: a library the requester owns. Libraries can still be shared with specific contacts or contact groups; the only restriction is that they cannot be shared with the whole account. - `shared`: a folder the requester has access to via a Contact or ContactGroup sharing — this includes both shared folders and another contact's library that the requester has been granted access to. - `account`: a folder shared with the whole account (everyone in the company can see it).
      - `personal_library` boolean, required: Whether this folder is someone's personal library ("My Library"). Unlike `kind`, this is a property of the folder itself and does not depend on who is requesting — it is `true` for a personal library even when that library has been shared with you (where `kind` would read `shared`). Use this, not `kind`, to tell whether a folder is a personal library.
      - `cursor` string, nullable: A cursor for stable pagination based on current `sort_by` order. You can pass this to `cursor[before]` or `cursor[after]` as a parameter to fetch the records before or after this record in the same sort order. This is only populated if records were fetched with `cursor[enabled]`, or `cursor[before]` or `cursor[after]`.
    - `subfolders` object[], required
      - `hashed_id` string, nullable, required: A unique alphanumeric identifier for this subfolder.
      - `name` string, nullable: The display name of the subfolder.
      - `description` string, nullable: A description for the subfolder.
      - `position` integer, nullable, required: The position of this subfolder within its folder, used for ordering.
      - `created` string, date-time, nullable, required: The date when the subfolder was created.
      - `updated` string, date-time, nullable, required: The date when the subfolder was last modified.
      - `cursor` string, nullable: A cursor for stable pagination based on current `sort_by` order. You can pass this to `cursor[before]` or `cursor[after]` as a parameter to fetch the records before or after this record in the same sort order. This is only populated if records were fetched with `cursor[enabled]`, or `cursor[before]` or `cursor[after]`.
    - `medias` object[], required
      - `id` integer: A unique numeric identifier for the media within the system.
      - `name` string: The display name of the media.
      - `type` 'Video' | 'Audio' | 'Image' | 'PdfDocument' | 'MicrosoftOfficeDocument' | 'Swf' | 'UnknownType': A string representing what type of media this is.
      - `archived` boolean: Whether or not the media is archived, either true or false.
      - `created` string, date-time: The date when the media was originally uploaded.
      - `updated` string, date-time: The date when the media was last changed.
      - `duration` number, nullable: Specifies the length (in seconds) for audio and video files. Specifies number of pages in the document. Omitted for other types of media.
      - `embedCode` string: DEPRECATED: If you want to programmatically embed videos, follow the construct an embed code guide.
      - `hashed_id` string: A unique alphanumeric identifier for this media.
      - `description` string: A description for the media which usually appears near the top of the sidebar on the media's page.
      - `progress` number: A floating point value between 0 and 1 that indicates the progress of the processing for this file.
      - `status` 'queued' | 'processing' | 'ready' | 'failed': Post upload processing status. - `queued`: the file is waiting in the queue to be processed. - `processing`: the file is actively being processed. - `ready`: the file has been fully processed and is ready for embedding and viewing. - `failed`: the file was unable to be processed (usually a format or size error).
      - `section` string, nullable: The title of the section in which the media appears. This attribute is omitted if the media is not in a section (default).
      - `thumbnail` object
        - `url` string
        - `width` integer
        - `height` integer
      - `protected` boolean, nullable: Whether the media is protected (e.g. requires a password or other authentication to view). Null if the media is not protected.
      - `folder_hashed_id` string, nullable, required: The hashed ID of the folder this media belongs to
      - `transcript_matches` object[], required: Array of transcript matches with timestamps
        - `text` string, required: The matched transcript text with context
        - `start_time_seconds` number, required: Start time of the match in seconds
        - `start_time_formatted` string, required: Human-readable start time (e.g., "0:03" or "1:23:45")
        - `thumbnail_url` string, nullable, required: Thumbnail URL at the match timestamp
      - `custom_metadata_field_values` object[]: The media's custom metadata field values, present only when the request passed `include=custom_metadata`. Same shape as the Get Custom Metadata Field Values endpoint.
        - `key` string: The field definition's immutable identifier. Use this (not the label) to address the field this value belongs to.
        - `field_type` 'text' | 'number' | 'date' | 'boolean' | 'single_select' | 'short_text' | 'url' | 'email' | 'money' | 'time' | 'datetime' | 'multi_select' | 'contact_ref' | 'contact_multi_ref': The field definition's data type, which determines the shape of `value`.
        - `value` union: The resolved, typed value for this field on this media. The type follows `field_type`: a string for text-like types (text, short_text, url, email, money, time, datetime), a number for `number`, an ISO 8601 date string for `date`, a boolean for `boolean`, the selected option's key (a string) for `single_select`, an array of the selected options' keys for `multi_select`, a contact reference object `{"type": "contact" | "contact_group", "id": "<hashed_id>"}` for `contact_ref`, and an array of contact reference objects for `contact_multi_ref`. References to deleted contacts or contact groups are omitted. Null when unset.
          - string
          - number
          - boolean
          - union[]
            - union
              - …
          - object
            - `type` 'contact' | 'contact_group'
            - `id` string
        - `updated_at` string, date-time: The date that this value was last updated.
        - `last_write` object, nullable: The most recent recorded write to this value on this media, with who made it and through which surface. Null when no write has been recorded; system-initiated writes (e.g. default-value backfills) are not recorded.
          - `at` string, date-time, required: When the write happened.
          - `source` 'ui' | 'api' | 'mcp', required: The surface the write came through.
          - `actor` object, nullable, required: The contact who made the write, or null when the write had no acting contact.
            - `type` 'contact', required
            - `id` string, required: The contact's hashed id.
            - `name` string, required: The contact's display name.
    - `channels` object[], required
      - `id` integer, required: A unique numeric identifier for the channel within the system.
      - `hashed_id` string, required: A unique alphanumeric identifier for this channel.
      - `name` string, required: The display name for the channel.
      - `description` string, required: The channel's description.
      - `media_count` integer, required: The number of medias in the channel.
      - `created` string, date-time, required: The date when the channel was originally created.
      - `updated` string, date-time, required: The date when the channel was last updated.
      - `live_stream_event_count` integer: The number of live stream events in the channel.
      - `auto_publish_enabled` boolean, nullable: Whether episodes are automatically published when added to the channel.
      - `podcast_enabled` boolean, nullable: Whether podcasting is enabled for the channel.
      - `custom_url` string, nullable: The custom URL used when embedding the channel on your own site. Null if no custom URL is set.
    - `channel_episodes` object[], required
      - `id` integer, required: A unique numeric identifier for the channel episode within the system.
      - `hashed_id` string, required: A unique alphanumeric identifier for this channel episode.
      - `title` string, nullable: The title of the channel episode.
      - `description` string, required: The episode notes for the channel episode.
      - `summary` string, required: The description of the channel episode.
      - `channel_hashed_id` string, nullable, required: The hashed ID of the channel this episode belongs to.
      - `media_hashed_id` string, nullable, required: The hashed ID of the media associated with this channel episode.
      - `live_stream_event_hashed_id` string, nullable: The hashed ID of the live stream event associated with this channel episode, if any.
      - `published` boolean, required: Whether the channel episode is published.
      - `created` string, date-time, required: The date when the channel episode was originally created.
      - `updated` string, date-time, required: The date when the channel episode was last updated.
      - `publish_at` string, date-time, nullable: The scheduled publish date (only present if scheduled).
    - `webinars` object[], required
      - `id` string, required: The hashed ID of the webinar
      - `hashed_id` string, required: The hashed ID of the webinar. Identical to `id`, named to match every other Wistia resource.
      - `title` string, required: The title of the webinar
      - `description` string, nullable: The description of the webinar
      - `scheduled_for` string, date-time, nullable: The scheduled start time in W3C format with timezone
      - `event_duration` integer, nullable: Duration of the webinar in minutes
      - `time_zone` string, required: The IANA time zone identifier the webinar is scheduled in
      - `lifecycle_status` 'pending' | 'ready' | 'starting' | 'started' | 'ended' | 'vod_ready' | 'failed', required: The current lifecycle status of the webinar. This is a read-only, system-managed field that Wistia updates as the event moves through its lifecycle; it cannot be set or changed via the API.
      - `registration_status` string, required: Registration status of the event
      - `created_at` string, date-time, required: When the event was created (UTC)
      - `updated_at` string, date-time, required: When the event was last updated (UTC)
      - `audience_link` string, required: Link for the audience to join the event
      - `host_link` string, required: Link for the host to manage the event
      - `panelist_link` string, required: Link for panelists to join the event
      - `thumbnail_url` string, nullable: URL of the webinar's custom thumbnail image, or null if no custom thumbnail has been set
      - `folder` object, nullable: The folder (project) this webinar belongs to
        - `id` string, required: A unique alphanumeric identifier for the record.
        - `index_url` string, required: A URL for fetching all the records of the given record type. You can pass hashed_ids as a param with multiple values to do a batch fetch for this records type.
        - `url` string, required: A URL that can be used to fetch this record.
      - `cursor` string, nullable: A cursor for stable pagination based on current `sort_by` order. You can pass this to `cursor[before]` or `cursor[after]` as a parameter to fetch the records before or after this record in the same sort order. This is only populated if records were fetched with `cursor[enabled]`, or `cursor[before]` or `cursor[after]`.

## Other responses

- `400`: Bad request
- `401`: Unauthorized, invalid or missing token
- `403`: Forbidden, token is valid but account does not have access to feature
- `500`: Internal server error

## Changes

- **2026-11-03** `b86cb2a7b420`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/wistia/apis/data-api/changes/search/get.md)

---

[API](https://skmtc.dev/wistia/apis/data-api.md) - [All operations](https://skmtc.dev/wistia/apis/data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/wistia/apis/data-api/revisions/b86cb2a7b420?raw)
