openapi: 3.0.3
info:
  title: Watchmode API
  version: 1.1.7
  description: |
    The Watchmode API provides comprehensive data about movies, TV shows, and streaming availability across 200+ streaming services worldwide.

    ## Official TypeScript SDK

    Install our official SDK for the best developer experience:

    ```bash
    npm install @watchmode/api-client
    ```

    **Quick Start:**
    ```typescript
    import { WatchmodeClient } from '@watchmode/api-client';

    const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

    // Search for titles
    const { data: results } = await client.search.byName('Breaking Bad');

    // Get title details
    const { data: title } = await client.title.getDetails('3173903');

    // Get streaming sources
    const { data: sources } = await client.title.getSources('3173903');
    ```

    📦 [View on npm](https://www.npmjs.com/package/@watchmode/api-client) | 📖 [SDK Examples](#operation/getSources)

    ---

    ## Features
    - **Streaming Availability**: Find where movies and TV shows are available to stream, rent, or buy
    - **Title Details**: Get comprehensive information about movies and TV series including cast, crew, ratings, and more
    - **Search**: Search for titles by name, IMDB ID, or TMDB ID
    - **Changes Tracking**: Monitor new titles, streaming source changes, and metadata updates
    - **Multi-Region Support**: Data available for 50+ countries

    ## API Key
    All API requests require an API key. We recommend sending it in a request header so the key is not exposed in URLs, browser history, analytics, referrer headers, or web server logs.

    Recommended:
    ```bash
    curl -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/status/'
    ```

    Also supported:
    ```bash
    curl -H 'Authorization: Bearer YOUR_API_KEY' 'https://api.watchmode.com/v1/status/'
    ```

    For backwards compatibility, the `apiKey` query parameter is still accepted, but new integrations should prefer headers:
    ```bash
    curl 'https://api.watchmode.com/v1/status/?apiKey=YOUR_API_KEY'
    ```

    Get your free API key at [https://api.watchmode.com/requestApiKey/](https://api.watchmode.com/requestApiKey/)

    ## Third-Party Image URLs
    Some image-related fields may contain URLs hosted by third parties or publicly accessible sources. These URLs are provided as references only. Watchmode does not grant any license to the underlying images and does not guarantee ownership, copyright status, availability, or permitted use. You are responsible for verifying rights and complying with applicable source terms, attribution obligations, and caching rules. See the Terms & Conditions at [https://api.watchmode.com/tc](https://api.watchmode.com/tc).

    ## Rate Limiting
    API requests are limited based on your plan. Check response headers for current limits:
    - `X-RateLimit-Limit`: Maximum requests per minute
    - `X-RateLimit-Remaining`: Remaining requests in current window
    - `X-Account-Quota`: Monthly quota limit
    - `X-Account-Quota-Used`: Quota used this month

    ## ID Mapping
    Watchmode IDs are universally unique across titles and people. Download ID mapping files:
    - [Title ID Map](https://api.watchmode.com/datasets/title_id_map.csv)
    - [Person ID Map](https://api.watchmode.com/datasets/person_id_map.csv)
  contact:
    name: Watchmode API Support
    url: https://api.watchmode.com
  license:
    name: Proprietary
    url: https://api.watchmode.com/tc
servers:
  - url: https://api.watchmode.com/v1
    description: Production server
security:
  - apiKey: []
tags:
  - name: Configuration
    description: Reference data for streaming sources, regions, networks, and genres
  - name: Search
    description: Search for titles and people
  - name: Title
    description: Get detailed information about movies and TV shows
  - name: Person
    description: Get information about actors, directors, and other people
  - name: Releases
    description: Track new and upcoming streaming releases
  - name: Changes
    description: Monitor changes to titles, sources, and metadata
  - name: Account
    description: Account and quota information
paths:
  /status:
    get:
      operationId: getStatus
      summary: Get API quota status
      description: Returns your current API quota and usage for the month.
      tags:
        - Account
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/status/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            const { data: status } = await client.account.getStatus();
            console.log(`Quota: ${status.quota}, Used: ${status.quotaUsed}`);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const url = 'https://api.watchmode.com/v1/status/';

            const response = await fetch(url, {
              headers: { 'X-API-Key': apiKey }
            });
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: >
            import urllib.request

            import json


            api_key = 'YOUR_API_KEY'

            url = 'https://api.watchmode.com/v1/status/'

            request = urllib.request.Request(url, headers={'X-API-Key':
            api_key})


            with urllib.request.urlopen(request) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri = URI('https://api.watchmode.com/v1/status/')

            request = Net::HTTP::Get.new(uri)

            request['X-API-Key'] = 'YOUR_API_KEY'


            response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) {
            |http| http.request(request) }

            json = response.body

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/status/";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: {$apiKey}"]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      responses:
        "200":
          description: Quota status retrieved successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StatusResponse"
              example:
                quota: 1000
                quotaUsed: 150
        "401":
          $ref: "#/components/responses/Unauthorized"
  /sources:
    get:
      operationId: getSources
      summary: List streaming sources
      description: >
        Returns a list of all streaming sources (streaming services, networks,
        etc.) supported by Watchmode.

        This includes subscription services (like Netflix), rental/purchase
        services (like iTunes), and free services.

        Each source includes details about supported regions, logos, and app
        store links.
      tags:
        - Configuration
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/sources/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            const { data: sources } = await client.sources.list();
            console.log(sources);
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const url =
            `https://api.watchmode.com/v1/sources/?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            url = f'https://api.watchmode.com/v1/sources/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri =
            URI('https://api.watchmode.com/v1/sources/?apiKey=YOUR_API_KEY')

            json = Net::HTTP.get(uri)

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/sources/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - name: regions
          in: query
          description: Filter sources by region. Pass one or multiple 2-letter country
            codes comma-separated (e.g., `US,GB,CA`).
          schema:
            type: string
            example: US,GB
        - name: types
          in: query
          description: |
            Filter sources by type. Pass one or multiple types comma-separated.
            - `sub` - Subscription services (Netflix, Hulu, etc.)
            - `purchase` - Rental/purchase services (iTunes, Vudu, etc.)
            - `free` - Free ad-supported services (Tubi, Pluto TV, etc.)
            - `tve` - TV Channel App (cable login required)
          schema:
            type: string
            example: sub,free
      responses:
        "200":
          description: List of streaming sources
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Source"
              example:
                - id: 203
                  name: Netflix
                  type: sub
                  logo_100px: https://cdn.watchmode.com/logos/203_logo_100px.jpg
                  ios_appstore_url: https://apps.apple.com/app/id363590051
                  android_playstore_url: https://play.google.com/store/apps/details?id=com.netflix.mediaclient
                  android_tv_url: null
                  fire_tv_url: null
                  roku_url: null
                  tvos_url: null
                  regions:
                    - US
                    - GB
                    - AU
                - id: 26
                  name: Amazon Prime
                  type: sub
                  logo_100px: https://cdn.watchmode.com/logos/26_logo_100px.jpg
                  ios_appstore_url: https://apps.apple.com/app/id545519333
                  android_playstore_url: https://play.google.com/store/apps/details?id=com.amazon.avod.thirdpartyclient
                  android_tv_url: null
                  fire_tv_url: null
                  roku_url: null
                  tvos_url: null
                  regions:
                    - US
                    - GB
                    - AU
                    - CA
        "401":
          $ref: "#/components/responses/Unauthorized"
  /regions:
    get:
      operationId: getRegions
      summary: List supported regions
      description: Returns a list of all countries/regions that Watchmode supports,
        including data quality tier and plan availability.
      tags:
        - Configuration
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/regions/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            const { data: regions } = await client.reference.getRegions();
            console.log(regions);
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const url =
            `https://api.watchmode.com/v1/regions/?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            url = f'https://api.watchmode.com/v1/regions/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri =
            URI('https://api.watchmode.com/v1/regions/?apiKey=YOUR_API_KEY')

            json = Net::HTTP.get(uri)

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/regions/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      responses:
        "200":
          description: List of supported regions
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Region"
              example:
                - country: US
                  name: USA
                  flag: https://cdn.watchmode.com/misc_images/icons/usFlag2.png
                  data_tier: 1
                  plan_enabled: true
                - country: CA
                  name: Canada
                  flag: https://cdn.watchmode.com/misc_images/icons/flagCA.png
                  data_tier: 1
                  plan_enabled: true
                - country: GB
                  name: Great Britain
                  flag: https://cdn.watchmode.com/misc_images/icons/flagGB.png
                  data_tier: 1
                  plan_enabled: true
        "401":
          $ref: "#/components/responses/Unauthorized"
  /networks:
    get:
      operationId: getNetworks
      summary: List TV networks
      description: Returns a list of all TV networks that may be associated with titles.
      tags:
        - Configuration
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/networks/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            const { data: networks } = await client.reference.getNetworks();
            console.log(networks);
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const url =
            `https://api.watchmode.com/v1/networks/?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            url = f'https://api.watchmode.com/v1/networks/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri =
            URI('https://api.watchmode.com/v1/networks/?apiKey=YOUR_API_KEY')

            json = Net::HTTP.get(uri)

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/networks/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      responses:
        "200":
          description: List of TV networks
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Network"
              example:
                - id: 1
                  name: HBO
                  origin_country: US
                  tmdb_id: 49
                - id: 2
                  name: National Geographic
                  origin_country: US
                  tmdb_id: 43
                - id: 7
                  name: ABC
                  origin_country: US
                  tmdb_id: 2
                - id: 8
                  name: AMC
                  origin_country: US
                  tmdb_id: 174
        "401":
          $ref: "#/components/responses/Unauthorized"
  /genres:
    get:
      operationId: getGenres
      summary: List genres
      description: Returns a mapping of genre names and IDs. Some genres include
        corresponding TMDB IDs.
      tags:
        - Configuration
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/genres/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            const { data: genres } = await client.reference.getGenres();
            console.log(genres);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const url = `https://api.watchmode.com/v1/genres/?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            url = f'https://api.watchmode.com/v1/genres/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri =
            URI('https://api.watchmode.com/v1/genres/?apiKey=YOUR_API_KEY')

            json = Net::HTTP.get(uri)

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/genres/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      responses:
        "200":
          description: List of genres
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Genre"
              example:
                - id: 4
                  name: Comedy
                  tmdb_id: 35
                - id: 6
                  name: Documentary
                  tmdb_id: 99
                - id: 33
                  name: Anime
                  tmdb_id: 0
        "401":
          $ref: "#/components/responses/Unauthorized"
  /search:
    get:
      operationId: search
      summary: Search for titles and people
      description: >
        Search for titles or people using an external ID (IMDB, TMDB) or by
        name.

        Returns matching titles and people with their Watchmode IDs.

        Useful for getting Watchmode IDs to use with other endpoints.
      tags:
        - Search
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/search/?search_field=name&search_value=Ed%20Wood'
        - lang: TypeScript
          label: TypeScript SDK
          source: >
            // npm install @watchmode/api-client

            import { WatchmodeClient } from '@watchmode/api-client';


            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });


            // Search by name

            const { data: results } = await client.search.byName('Ed Wood');

            console.log(results);


            // Or search by IMDB ID

            const { data: imdbResults } = await
            client.search.byImdbId('tt0109707');
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const searchField = 'name';
            const searchValue = 'Ed Wood';
            const url = `https://api.watchmode.com/v1/search/?apiKey=${apiKey}&search_field=${searchField}&search_value=${encodeURIComponent(searchValue)}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json
            from urllib.parse import urlencode

            api_key = 'YOUR_API_KEY'
            search_field = 'name'
            search_value = 'Ed Wood'

            params = {
                'apiKey': api_key,
                'search_field': search_field,
                'search_value': search_value
            }

            url = f'https://api.watchmode.com/v1/search/?{urlencode(params)}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/search/?apiKey=YOUR_API_KEY&search_field=name&search_value=Ed%20Wood')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $searchField = 'name';
            $searchValue = 'Ed Wood';
            $url = "https://api.watchmode.com/v1/search/?apiKey={$apiKey}&search_field={$searchField}&search_value=" . urlencode($searchValue);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - name: search_field
          in: query
          required: true
          description: |
            The field to search in:
            - `name` - Search by title or person name
            - `imdb_id` - Search by IMDB ID (e.g., tt0944947)
            - `tmdb_movie_id` - Search by TMDB movie ID
            - `tmdb_tv_id` - Search by TMDB TV show ID
            - `tmdb_person_id` - Search by TMDB person ID
          schema:
            type: string
            enum:
              - name
              - imdb_id
              - tmdb_movie_id
              - tmdb_tv_id
              - tmdb_person_id
        - name: search_value
          in: query
          required: true
          description: The value to search for (e.g., "Breaking Bad", "tt0944947")
          schema:
            type: string
            example: Breaking Bad
        - name: types
          in: query
          description: Filter results by type. Pass comma-separated values (e.g.,
            `tv,movie,person`)
          schema:
            type: string
            example: tv,movie
      responses:
        "200":
          description: Search results
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchResponse"
              example:
                title_results:
                  - id: 3173903
                    name: Breaking Bad
                    type: tv_series
                    year: 2008
                    imdb_id: tt0903747
                    tmdb_id: 1396
                    tmdb_type: tv
                people_results:
                  - id: 710125611
                    name: Bryan Cranston
                    main_profession: actor
                    imdb_id: nm0186505
                    tmdb_id: 17419
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
  /autocomplete-search:
    get:
      operationId: autocompleteSearch
      summary: Autocomplete search
      description: |
        Search for titles and/or people by name or partial name.
        Optimized for building autocomplete/typeahead search interfaces.
        Results include relevance scores and thumbnail images.
      tags:
        - Search
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/autocomplete-search/?search_value=Breaking%20bad&search_type=1'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Autocomplete search (optimized for typeahead)
            const { data } = await client.search.autocomplete('Breaking bad', {
              searchType: 2  // 2 = titles only
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const searchValue = 'Breaking bad';
            const searchType = 1; // 1 = titles and people
            const url = `https://api.watchmode.com/v1/autocomplete-search/?apiKey=${apiKey}&search_value=${encodeURIComponent(searchValue)}&search_type=${searchType}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json
            from urllib.parse import urlencode

            api_key = 'YOUR_API_KEY'
            search_value = 'Breaking bad'
            search_type = 1  # 1 = titles and people

            params = {
                'apiKey': api_key,
                'search_value': search_value,
                'search_type': search_type
            }

            url = f'https://api.watchmode.com/v1/autocomplete-search/?{urlencode(params)}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/autocomplete-search/?apiKey=YOUR_API_KEY&search_value=Breaking%20bad&search_type=1')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $searchValue = 'Breaking bad';
            $searchType = 1; // 1 = titles and people
            $url = "https://api.watchmode.com/v1/autocomplete-search/?apiKey={$apiKey}&search_value=" . urlencode($searchValue) . "&search_type={$searchType}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - name: search_value
          in: query
          required: true
          description: The search phrase (can be partial, e.g., "The Sha" will find "The
            Shawshank Redemption")
          schema:
            type: string
            example: Breaking bad
        - name: search_type
          in: query
          description: |
            Filter result types:
            - `1` - Titles and people (default)
            - `2` - Titles only
            - `3` - Movies only
            - `4` - TV shows only
            - `5` - People only
          schema:
            type: integer
            enum:
              - 1
              - 2
              - 3
              - 4
              - 5
            default: 1
      responses:
        "200":
          description: Autocomplete results
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AutocompleteResponse"
              example:
                results:
                  - name: Breaking Bad
                    relevance: 445.23
                    type: tv_series
                    id: 3173903
                    year: 2008
                    result_type: title
                    imdb_id: tt0903747
                    tmdb_id: 1396
                    tmdb_type: tv
                    image_url: http://www.some-poster-site.com/image.jpg
                  - name: "El Camino: A Breaking Bad Movie"
                    relevance: 169.83
                    type: movie
                    id: 1586594
                    year: 2019
                    result_type: title
                    imdb_id: tt9243946
                    tmdb_id: 559969
                    tmdb_type: movie
                    image_url: http://www.some-poster-site.com/image.jpg
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
  /list-titles:
    get:
      operationId: listTitles
      summary: List and filter titles
      description: >
        Get a paginated list of titles matching specified criteria.

        This powerful endpoint allows granular filtering such as "Horror movies
        streaming on Netflix in the USA".


        **Quota Notes:**

        - Each additional region costs 1 API credit

        - When using `source_ids` or `source_types`, only one region is allowed
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/list-titles/?source_ids=203,57'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // List titles with filtering
            const { data } = await client.title.list({
              types: 'movie',
              genres: '12',           // Horror genre ID
              sourceIds: '203',       // Netflix
              regions: 'US',
              sortBy: 'popularity_desc',
              page: 1,
              limit: 50
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const sourceIds = '203,57';
            const url = `https://api.watchmode.com/v1/list-titles/?apiKey=${apiKey}&source_ids=${sourceIds}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            source_ids = '203,57'
            url = f'https://api.watchmode.com/v1/list-titles/?apiKey={api_key}&source_ids={source_ids}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/list-titles/?apiKey=YOUR_API_KEY&source_ids=203,57')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $sourceIds = '203,57';
            $url = "https://api.watchmode.com/v1/list-titles/?apiKey={$apiKey}&source_ids={$sourceIds}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - name: types
          in: query
          description: >
            Filter by title type. Comma-separated for multiple values.

            Valid types: `movie`, `tv_series`, `tv_movie`, `tv_special`,
            `tv_miniseries`, `short_film`
          schema:
            type: string
            example: movie,tv_series
        - name: regions
          in: query
          description: Filter by region (2-letter country code). Comma-separated for
            multiple.
          schema:
            type: string
            example: US
        - name: source_types
          in: query
          description: |
            Filter by source type. Comma-separated values.
            - `sub` - Subscription
            - `rent` - Rental
            - `buy` - Purchase
            - `free` - Free
            - `tve` - TV Channel App (Cable Plan Required)
          schema:
            type: string
            example: sub,free
        - name: source_ids
          in: query
          description: Filter by specific source IDs (from `/sources` endpoint).
            Comma-separated.
          schema:
            type: string
            example: 203,26
        - name: genres
          in: query
          description: Filter by genre IDs (from `/genres` endpoint). Comma-separated.
          schema:
            type: string
            example: 4,7
        - name: network_ids
          in: query
          description: Filter by network IDs (from `/networks` endpoint). Comma-separated.
          schema:
            type: string
            example: 1,8
        - name: languages
          in: query
          description: Filter by primary language (2-letter ISO 639 code). Comma-separated.
          schema:
            type: string
            example: en,es
        - name: release_date_start
          in: query
          description: Filter by release date start (format YYYYMMDD)
          schema:
            type: integer
            example: 20200101
        - name: release_date_end
          in: query
          description: Filter by release date end (format YYYYMMDD)
          schema:
            type: integer
            example: 20231231
        - name: user_rating_low
          in: query
          description: Minimum user rating (0-10)
          schema:
            type: number
            minimum: 0
            maximum: 10
        - name: user_rating_high
          in: query
          description: Maximum user rating (0-10)
          schema:
            type: number
            minimum: 0
            maximum: 10
        - name: critic_score_low
          in: query
          description: Minimum critic score (0-100)
          schema:
            type: integer
            minimum: 0
            maximum: 100
        - name: critic_score_high
          in: query
          description: Maximum critic score (0-100)
          schema:
            type: integer
            minimum: 0
            maximum: 100
        - name: person_id
          in: query
          description: Filter by person ID (actor, director, etc.)
          schema:
            type: integer
            example: 7110004
        - name: sort_by
          in: query
          description: Sort order for results
          schema:
            type: string
            enum:
              - relevance_desc
              - relevance_asc
              - popularity_desc
              - popularity_asc
              - release_date_desc
              - release_date_asc
              - title_desc
              - title_asc
            default: relevance_desc
        - $ref: "#/components/parameters/page"
        - name: limit
          in: query
          description: Results per page (1-250)
          schema:
            type: integer
            minimum: 1
            maximum: 250
            default: 250
      responses:
        "200":
          description: Paginated list of titles
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListTitlesResponse"
              example:
                titles:
                  - id: 1337513
                    title: Secret in Their Eyes
                    year: 2015
                    imdb_id: tt1741273
                    tmdb_id: 290751
                    tmdb_type: movie
                    type: movie
                  - id: 1247225
                    title: Spy Cat
                    year: 2018
                    imdb_id: tt5746054
                    tmdb_id: 509733
                    tmdb_type: movie
                    type: movie
                page: 1
                total_results: 4592
                total_pages: 19
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
  /title/{title_id}/details:
    get:
      operationId: getTitleDetails
      summary: Get title details
      description: |
        Get detailed information about a specific movie or TV show.

        **ID Formats Accepted:**
        - Watchmode ID (e.g., `345534`) - costs 1 credit
        - IMDB ID (e.g., `tt0903747`) - costs 2 credits
        - TMDB format (e.g., `movie-278` or `tv-1396`) - costs 2 credits

        Use `append_to_response` to include additional data in a single request.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/title/345534/details/'
        - lang: TypeScript
          label: TypeScript SDK
          source: >
            // npm install @watchmode/api-client

            import { WatchmodeClient } from '@watchmode/api-client';


            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });


            // Get title details

            const { data: title } = await client.title.getDetails('345534');

            console.log(title);


            // With additional data appended

            const { data: fullTitle } = await client.title.getDetails('345534',
            {
              appendToResponse: 'sources,cast-crew',
              regions: 'US'
            });
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const url = `https://api.watchmode.com/v1/title/${titleId}/details/?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            url = f'https://api.watchmode.com/v1/title/{title_id}/details/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/details/?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $url = "https://api.watchmode.com/v1/title/{$titleId}/details/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
        - name: append_to_response
          in: query
          description: |
            Include additional data. Comma-separated values. Each adds 1 credit.
            - `sources` - Streaming availability
            - `seasons` - Season list (TV only)
            - `episodes` - Episode list with sources (TV only)
            - `cast-crew` - Cast and crew
          schema:
            type: string
            example: sources,cast-crew
        - name: language
          in: query
          description: ISO 639-1 language code for localized title/overview (default `en`)
          schema:
            type: string
            default: en
            example: es
        - name: regions
          in: query
          description: Filter sources by region when using `append_to_response=sources` or
            `append_to_response=episodes`. Comma-separated. Requested regions
            must be enabled for your plan. If omitted, returns sources from
            regions enabled for your plan.
          schema:
            type: string
            example: US,CA
      responses:
        "200":
          description: Title details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TitleDetails"
              example:
                id: 3173903
                title: Breaking Bad
                original_title: Breaking Bad
                plot_overview: When Walter White, a New Mexico chemistry teacher, is diagnosed
                  with Stage III cancer...
                will_you_like_this: If you like intense character dramas with high stakes,
                  you’ll probably enjoy this.
                review_summary: Critics praise the writing and performances; viewers highlight
                  the show’s tense pacing and standout finale.
                type: tv_series
                runtime_minutes: 45
                year: 2008
                end_year: 2013
                release_date: 2008-01-20
                imdb_id: tt0903747
                tmdb_id: 1396
                tmdb_type: tv
                genres:
                  - 7
                genre_names:
                  - Drama
                user_rating: 9.2
                critic_score: 85
                us_rating: TV-MA
                poster: http://www.some-poster-site.com/image.jpg
                posterMedium: http://www.some-poster-site.com/image.jpg
                posterLarge: http://www.some-poster-site.com/image.jpg
                backdrop: http://www.some-poster-site.com/image.jpg
                original_language: en
                similar_titles:
                  - 330884
                  - 343611
                networks:
                  - 8
                network_names:
                  - AMC
                relevance_percentile: 98.92
                popularity_percentile: 99.99
                trailer: https://www.youtube.com/watch?v=5PSNL1qE6VY
                trailer_thumbnail: http://www.some-poster-site.com/image.jpg
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /title/{title_id}/sources:
    get:
      operationId: getTitleSources
      summary: Get title streaming sources
      description: >
        Get all streaming sources where a title is currently available.

        Returns subscription services, rental options, purchase options, and
        free streaming.

        For TV shows, includes information about available seasons and episodes
        per source.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/title/345534/sources/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get streaming sources for a title
            const { data: sources } = await client.title.getSources('345534', {
              regions: 'US'
            });
            console.log(sources);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const url = `https://api.watchmode.com/v1/title/${titleId}/sources/?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            url = f'https://api.watchmode.com/v1/title/{title_id}/sources/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/sources/?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $url = "https://api.watchmode.com/v1/title/{$titleId}/sources/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
        - name: regions
          in: query
          description: Filter by region (2-letter country code). Comma-separated for
            multiple. Requested regions must be enabled for your plan. If
            omitted, returns sources from regions enabled for your plan.
          schema:
            type: string
            example: US,CA
      responses:
        "200":
          description: List of streaming sources
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TitleSource"
              example:
                - source_id: 203
                  name: Netflix
                  type: sub
                  region: US
                  ios_url: https://www.netflix.com/title/123456
                  android_url: https://www.netflix.com/title/123456
                  web_url: https://www.netflix.com/title/123456
                  format: HD
                  price: null
                  seasons: 5
                  episodes: 62
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /title/{title_id}/seasons:
    get:
      operationId: getTitleSeasons
      summary: Get title seasons
      description: Get all seasons for a TV series or mini-series.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/title/345534/seasons/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get seasons for a TV series
            const { data: seasons } = await client.title.getSeasons('345534');
            console.log(seasons);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const url = `https://api.watchmode.com/v1/title/${titleId}/seasons/?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            url = f'https://api.watchmode.com/v1/title/{title_id}/seasons/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/seasons/?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $url = "https://api.watchmode.com/v1/title/{$titleId}/seasons/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
      responses:
        "200":
          description: List of seasons
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Season"
              example:
                - id: 12345
                  poster_url: http://www.some-poster-site.com/image.jpg
                  name: Season 1
                  overview: The first season introduces Walter White...
                  number: 1
                  air_date: 2008-01-20
                  episode_count: 7
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /title/{title_id}/episodes:
    get:
      operationId: getTitleEpisodes
      summary: Get title episodes
      description: >
        Get all episodes for a TV series or mini-series, including streaming
        sources for each episode.

        For paid plans, includes deep links to watch each episode on streaming
        services.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/title/345534/episodes/?regions=US'
        - lang: TypeScript
          label: TypeScript SDK
          source: >
            // npm install @watchmode/api-client

            import { WatchmodeClient } from '@watchmode/api-client';


            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });


            // Get all episodes for a TV series with US streaming sources

            const { data: episodes } = await client.title.getEpisodes('345534',
            {
              regions: 'US'
            });

            console.log(episodes);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const regions = 'US';
            const url = `https://api.watchmode.com/v1/title/${titleId}/episodes/?apiKey=${apiKey}&regions=${regions}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            regions = 'US'
            url = f'https://api.watchmode.com/v1/title/{title_id}/episodes/?apiKey={api_key}&regions={regions}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/episodes/?apiKey=YOUR_API_KEY&regions=US')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $regions = 'US';
            $url = "https://api.watchmode.com/v1/title/{$titleId}/episodes/?apiKey={$apiKey}&regions={$regions}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
        - name: regions
          in: query
          description: Filter episode sources by region (2-letter country code).
            Comma-separated for multiple. Requested regions must be enabled for
            your plan. If omitted, returns sources from regions enabled for your
            plan.
          schema:
            type: string
            example: US,CA
      responses:
        "200":
          description: List of episodes with sources
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Episode"
              example:
                - id: 1234567
                  name: Pilot
                  episode_number: 1
                  season_number: 1
                  season_id: 12345
                  tmdb_id: 54321
                  imdb_id: tt0959621
                  thumbnail_url: http://www.some-poster-site.com/image.jpg
                  release_date: 2008-01-20
                  runtime_minutes: 58
                  overview: Walter White, a high school chemistry teacher...
                  sources:
                    - source_id: 203
                      name: Netflix
                      type: sub
                      region: US
                      web_url: https://www.netflix.com/watch/123456
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /title/{title_id}/cast-crew:
    get:
      operationId: getTitleCastCrew
      summary: Get title cast and crew
      description: Get all cast (actors) and crew (directors, writers, etc.)
        associated with a title.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/title/345534/cast-crew/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get cast and crew for a title
            const { data: credits } = await client.title.getCastCrew('345534');
            console.log(credits);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const url = `https://api.watchmode.com/v1/title/${titleId}/cast-crew/?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            url = f'https://api.watchmode.com/v1/title/{title_id}/cast-crew/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/cast-crew/?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $url = "https://api.watchmode.com/v1/title/{$titleId}/cast-crew/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
        - name: language
          in: query
          description: ISO 639-1 language code for localized names (default `en`)
          schema:
            type: string
            default: en
      responses:
        "200":
          description: Cast and crew list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CastCrew"
              example:
                - person_id: 7110004
                  type: Cast
                  full_name: Bryan Cranston
                  role: Walter White
                  episode_count: 62
                  order: 1
                - person_id: 7110005
                  type: Crew
                  full_name: Vince Gilligan
                  role: Creator
                  episode_count: 62
                  order: null
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /title/{title_id}/incorrect-data:
    get:
      operationId: reportIncorrectData
      summary: Report incorrect title data
      description: >
        Report incorrect or missing data for a title. This endpoint helps
        improve data quality

        by allowing users to flag issues with title information.


        **Note:** This endpoint does not count against your quota as users are
        helping improve data quality.
      tags:
        - Title
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/title/345534/incorrect-data/?sourceMissing=1&somethingWrongDetails=Missing%20Netflix'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Report incorrect data for a title
            const { data } = await client.title.reportIncorrectData('345534', {
              sourceMissing: 1,
              somethingWrongDetails: 'Missing Netflix availability'
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const titleId = '345534';
            const params = new URLSearchParams({
              apiKey,
              sourceMissing: '1',
              somethingWrongDetails: 'Missing Netflix availability'
            });
            const url = `https://api.watchmode.com/v1/title/${titleId}/incorrect-data/?${params}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json
            from urllib.parse import urlencode

            api_key = 'YOUR_API_KEY'
            title_id = '345534'
            params = urlencode({
                'apiKey': api_key,
                'sourceMissing': 1,
                'somethingWrongDetails': 'Missing Netflix availability'
            })
            url = f'https://api.watchmode.com/v1/title/{title_id}/incorrect-data/?{params}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title/345534/incorrect-data/?apiKey=YOUR_API_KEY&sourceMissing=1')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $titleId = '345534';
            $params = http_build_query([
                'apiKey' => $apiKey,
                'sourceMissing' => 1,
                'somethingWrongDetails' => 'Missing Netflix availability'
            ]);
            $url = "https://api.watchmode.com/v1/title/{$titleId}/incorrect-data/?{$params}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/titleId"
        - name: somethingWrongDescription
          in: query
          description: Flag indicating description/overview is incorrect (1 = yes)
          schema:
            type: integer
            enum:
              - 0
              - 1
        - name: serviceIncorrect
          in: query
          description: Flag indicating streaming service info is incorrect (1 = yes)
          schema:
            type: integer
            enum:
              - 0
              - 1
        - name: sourceMissing
          in: query
          description: Flag indicating a streaming source is missing (1 = yes)
          schema:
            type: integer
            enum:
              - 0
              - 1
        - name: somethingElseWrong
          in: query
          description: Flag indicating other issue (1 = yes)
          schema:
            type: integer
            enum:
              - 0
              - 1
        - name: somethingWrongDetails
          in: query
          description: Free-text description of the issue
          schema:
            type: string
      responses:
        "200":
          description: Report received successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  statusMessage:
                    type: string
                    example: Request to correct title information received. Please wait 2 minutes
                      while we attempt to auto-correct the issue.
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /person/{person_id}:
    get:
      operationId: getPerson
      summary: Get person details
      description: >
        Get detailed information about a person including biographical data and
        known titles.

        Person IDs in Watchmode always start with `7` followed by the actual ID.
      tags:
        - Person
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/person/7110004'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get person details
            const { data: person } = await client.person.getDetails(7110004);
            console.log(person?.full_name);  // "Brad Pitt"
            console.log(person?.known_for);  // Array of title IDs
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const personId = '7110004';

            const url =
            `https://api.watchmode.com/v1/person/${personId}?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: >
            import urllib.request

            import json


            api_key = 'YOUR_API_KEY'

            person_id = '7110004'

            url =
            f'https://api.watchmode.com/v1/person/{person_id}?apiKey={api_key}'


            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/person/7110004?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: >
            <?php

            $apiKey = 'YOUR_API_KEY';

            $personId = '7110004';

            $url =
            "https://api.watchmode.com/v1/person/{$personId}?apiKey={$apiKey}";


            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

            $response = curl_exec($ch);

            curl_close($ch);


            $json = json_decode($response);

            print_r($json);
      parameters:
        - name: person_id
          in: path
          required: true
          description: Watchmode person ID (starts with 7, e.g., `7110004`)
          schema:
            type: integer
            example: 7110004
      responses:
        "200":
          description: Person details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Person"
              example:
                id: 7110004
                full_name: Brad Pitt
                first_name: Brad
                last_name: Pitt
                tmdb_id: 287
                imdb_id: nm0000093
                main_profession: actor
                secondary_profession: producer
                tertiary_profession: soundtrack
                date_of_birth: 1963-12-18
                date_of_death: null
                place_of_birth: Shawnee, Oklahoma, USA
                gender: m
                known_for:
                  - 1132806
                  - 1336708
                  - 1183315
                  - 1387087
                relevance_percentile: 100
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
  /releases:
    get:
      operationId: getReleases
      summary: Get Title Release Dates - Simple
      description: >
        Get recently released or upcoming releases on major streaming services.

        Includes original content flags to identify platform exclusives.

        Primarily US release dates, though most major services release globally
        on the same day.
      tags:
        - Releases
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/releases/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get recent/upcoming releases
            const { data } = await client.releases.getRecent({
              startDate: 20240101,
              endDate: 20240131,
              limit: 100
            });
            console.log(data);
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const url =
            `https://api.watchmode.com/v1/releases/?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            api_key = 'YOUR_API_KEY'
            url = f'https://api.watchmode.com/v1/releases/?apiKey={api_key}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: >
            require 'net/http'

            require 'uri'

            require 'json'


            uri =
            URI('https://api.watchmode.com/v1/releases/?apiKey=YOUR_API_KEY')

            json = Net::HTTP.get(uri)

            result = JSON(json)

            print(result)
        - lang: PHP
          source: |
            <?php
            $apiKey = 'YOUR_API_KEY';
            $url = "https://api.watchmode.com/v1/releases/?apiKey={$apiKey}";

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - name: start_date
          in: query
          description: |
            Get releases after this date (PST timezone).
            Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
            Default: 30 days ago
          schema:
            type: integer
            example: 20240101
        - name: end_date
          in: query
          description: |
            Get releases before this date (PST timezone).
            Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
            Default: 30 days from now
          schema:
            type: integer
            example: 20240131
        - name: limit
          in: query
          description: Number of results (1-250)
          schema:
            type: integer
            minimum: 1
            maximum: 250
            default: 250
      responses:
        "200":
          description: List of releases
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReleasesResponse"
              example:
                releases:
                  - id: 3165490
                    title: Slow Horses
                    type: tv_series
                    tmdb_id: 95480
                    tmdb_type: tv
                    imdb_id: tt5875444
                    season_number: 1
                    poster_url: http://www.some-poster-site.com/image.jpg
                    source_release_date: 2022-04-01
                    source_id: 371
                    source_name: AppleTV+
                    is_original: 1
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
  /title-release-dates:
    get:
      operationId: getTitleReleaseDatesAdvanced
      summary: Get Title Release Dates - Advanced
      description: >
        Get streaming and theatrical release dates for titles within a specified
        date range.

        Includes both historical and upcoming releases, as well as streaming
        premieres and theatrical releases.


        Release dates are returned as normalized calendar dates in `YYYY-MM-DD`
        format. When an upstream source provides a midnight UTC

        availability timestamp that is stored in a US time zone, Watchmode
        normalizes it back to the intended UTC calendar date before

        filtering and returning results.


        By default, this endpoint returns all region-specific release rows
        available to Watchmode. Use the `regions` parameter to filter

        results to specific countries. Some legacy streaming release-date
        sources are US-only; those rows are returned with `region: "US"`.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Releases
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/title-release-dates/?start_date=20240101&end_date=20240331&regions=US,GB'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get advanced release dates (paid plans only)
            const { data } = await client.releases.getReleaseDates({
              startDate: 20240101,
              endDate: 20240331,
              regions: 'US,GB'
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const startDate = 20240101;
            const endDate = 20240331;
            const regions = 'US,GB';
            const url = `https://api.watchmode.com/v1/title-release-dates/?apiKey=${apiKey}&start_date=${startDate}&end_date=${endDate}&regions=${regions}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json
            from urllib.parse import urlencode

            api_key = 'YOUR_API_KEY'
            params = urlencode({
                'apiKey': api_key,
                'start_date': 20240101,
                'end_date': 20240331,
                'regions': 'US,GB'
            })
            url = f'https://api.watchmode.com/v1/title-release-dates/?{params}'

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/title-release-dates/?apiKey=YOUR_API_KEY&start_date=20240101&end_date=20240331&regions=US,GB')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: >
            <?php

            $apiKey = 'YOUR_API_KEY';

            $params = http_build_query([
                'apiKey' => $apiKey,
                'start_date' => 20240101,
                'end_date' => 20240331,
                'regions' => 'US,GB'
            ]);

            $url =
            "https://api.watchmode.com/v1/title-release-dates/?{$params}";


            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

            $response = curl_exec($ch);

            curl_close($ch);


            $json = json_decode($response);
      parameters:
        - name: start_date
          in: query
          description: |
            Filter releases on or after this normalized calendar date.
            Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
          schema:
            type: integer
            example: 20240101
        - name: end_date
          in: query
          description: |
            Filter releases on or before this normalized calendar date.
            Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
          schema:
            type: integer
            example: 20240131
        - name: regions
          in: query
          description: Filter by region(s). Pass a single 2-character region code or
            multiple comma-separated codes (e.g., "US" or "US,GB,CA"). Use the
            /regions endpoint to get a list of valid region codes. If not
            provided, returns releases from all regions.
          schema:
            type: string
            example: US,GB
      responses:
        "200":
          description: List of upcoming release dates
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TitleReleaseDate"
              example:
                - id: 1234567
                  title: "Dune: Part Two"
                  title_type: movie
                  original_language: en
                  region: US
                  type: theatrical_release
                  release_date: 2024-03-01
                  provider_id: null
                  season: null
                - id: 3173903
                  title: Stranger Things
                  title_type: tv_series
                  original_language: en
                  region: US
                  type: streaming_tv_season_release
                  release_date: 2024-07-01
                  provider_id: 203
                  season: 5
        "401":
          description: Unauthorized or free plan
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                success: false
                statusCode: 401
                statusMessage: The release dates endpoint is only available with paid plans.
  /changes/new_titles:
    get:
      operationId: getNewTitles
      summary: Get newly added titles
      description: >
        Get title IDs of new movies and shows added to Watchmode within a date
        range.

        Useful for keeping your database in sync with Watchmode.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Changes
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/changes/new_titles?types=movie,tv_series'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get newly added titles (paid plans only)
            const { data } = await client.changes.getNewTitles({
              startDate: 20240101,
              endDate: 20240107,
              types: 'movie,tv_series',
              page: 1,
              limit: 250
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const types = 'movie,tv_series';
            const url = `https://api.watchmode.com/v1/changes/new_titles?apiKey=${apiKey}&types=${types}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            url = "https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series"

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/startDate"
        - $ref: "#/components/parameters/endDate"
        - $ref: "#/components/parameters/titleTypes"
        - $ref: "#/components/parameters/page"
        - $ref: "#/components/parameters/changesLimit"
      responses:
        "200":
          description: List of new title IDs
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChangesResponse"
              example:
                titles:
                  - 1138
                  - 1668
                  - 1867
                  - 11029
                  - 11045
                page: 1
                total_results: 6513
                total_pages: 27
        "401":
          $ref: "#/components/responses/PaidPlanRequired"
  /changes/new_people:
    get:
      operationId: getNewPeople
      summary: Get newly added people
      description: >
        Get IDs of new people (actors, directors, etc.) added to Watchmode
        within a date range.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Changes
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/changes/new_people/'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get newly added people (paid plans only)
            const { data } = await client.changes.getNewPeople({
              startDate: 20240101,
              endDate: 20240107
            });
            console.log(data);
        - lang: JavaScript
          source: >
            const apiKey = 'YOUR_API_KEY';

            const url =
            `https://api.watchmode.com/v1/changes/new_people/?apiKey=${apiKey}`;


            const response = await fetch(url);

            const json = await response.json();

            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            url = "https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY"

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/startDate"
        - $ref: "#/components/parameters/endDate"
        - $ref: "#/components/parameters/page"
        - $ref: "#/components/parameters/changesLimit"
      responses:
        "200":
          description: List of new person IDs
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PeopleChangesResponse"
              example:
                people:
                  - 710203130
                  - 73333445
                  - 710203131
                page: 1
                total_results: 15113
                total_pages: 61
        "401":
          $ref: "#/components/responses/PaidPlanRequired"
  /changes/titles_sources_changed:
    get:
      operationId: getTitlesSourcesChanged
      summary: Get titles with changed sources
      description: >
        Get title IDs where streaming availability has changed within a date
        range.

        Use this to know which titles need their sources refreshed.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Changes
      x-codeSamples:
        - lang: Shell
          source: |
            curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/changes/titles_sources_changed?regions=US'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get titles where streaming sources changed (paid plans only)
            const { data } = await client.changes.getTitlesSourcesChanged({
              startDate: 20240101,
              endDate: 20240107,
              regions: 'US'
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const url = `https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=${apiKey}&regions=US`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            url = "https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US"

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/startDate"
        - $ref: "#/components/parameters/endDate"
        - $ref: "#/components/parameters/titleTypes"
        - name: regions
          in: query
          description: Filter by region (2-letter country code). Default `US`.
          schema:
            type: string
            default: US
            example: US
        - $ref: "#/components/parameters/page"
        - $ref: "#/components/parameters/changesLimit"
      responses:
        "200":
          description: List of title IDs with changed sources
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChangesResponse"
              example:
                titles:
                  - 12490
                  - 115801
                  - 144030
                page: 1
                total_results: 488
                total_pages: 2
        "401":
          $ref: "#/components/responses/PaidPlanRequired"
  /changes/titles_details_changed:
    get:
      operationId: getTitlesDetailsChanged
      summary: Get titles with changed details
      description: >
        Get title IDs where metadata has changed (overview, cast, genres,
        ratings, etc.) within a date range.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Changes
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/changes/titles_details_changed'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get titles where details changed (paid plans only)
            const { data } = await client.changes.getTitlesDetailsChanged({
              startDate: 20240101,
              endDate: 20240107
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const url = `https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            url = "https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY"

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/startDate"
        - $ref: "#/components/parameters/endDate"
        - $ref: "#/components/parameters/titleTypes"
        - $ref: "#/components/parameters/page"
        - $ref: "#/components/parameters/changesLimit"
      responses:
        "200":
          description: List of title IDs with changed details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChangesResponse"
              example:
                titles:
                  - 3171655
                  - 3127447
                  - 3146794
                page: 1
                total_results: 14
                total_pages: 1
        "401":
          $ref: "#/components/responses/PaidPlanRequired"
  /changes/titles_episodes_changed:
    get:
      operationId: getTitlesEpisodesChanged
      summary: Get titles with changed episodes
      description: >
        Get title IDs where episode data has changed (new episodes, updated
        details) within a date range.


        **Note:** This endpoint requires a paid plan.
      tags:
        - Changes
      x-codeSamples:
        - lang: Shell
          source: >
            curl -i -H 'X-API-Key: YOUR_API_KEY'
            'https://api.watchmode.com/v1/changes/titles_episodes_changed'
        - lang: TypeScript
          label: TypeScript SDK
          source: |
            // npm install @watchmode/api-client
            import { WatchmodeClient } from '@watchmode/api-client';

            const client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });

            // Get titles where episodes changed (paid plans only)
            const { data } = await client.changes.getTitlesEpisodesChanged({
              startDate: 20240101,
              endDate: 20240107
            });
            console.log(data);
        - lang: JavaScript
          source: |
            const apiKey = 'YOUR_API_KEY';
            const url = `https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=${apiKey}`;

            const response = await fetch(url);
            const json = await response.json();
            console.log(json);
        - lang: Python
          source: |
            import urllib.request
            import json

            url = "https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY"

            with urllib.request.urlopen(url) as response:
                data = json.loads(response.read().decode())
                print(data)
        - lang: Ruby
          source: |
            require 'net/http'
            require 'uri'
            require 'json'

            uri = URI('https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY')
            json = Net::HTTP.get(uri)
            result = JSON(json)
            print(result)
        - lang: PHP
          source: |
            <?php
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $response = curl_exec($ch);
            curl_close($ch);

            $json = json_decode($response);
            print_r($json);
      parameters:
        - $ref: "#/components/parameters/startDate"
        - $ref: "#/components/parameters/endDate"
        - $ref: "#/components/parameters/page"
        - $ref: "#/components/parameters/changesLimit"
      responses:
        "200":
          description: List of title IDs with changed episodes
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChangesResponse"
              example:
                titles:
                  - 3123402
                  - 3165766
                  - 3107530
                page: 1
                total_results: 130
                total_pages: 1
        "401":
          $ref: "#/components/responses/PaidPlanRequired"
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: Recommended authentication method. Send your Watchmode API key in
        the X-API-Key header.
    bearerAuth:
      type: http
      scheme: bearer
      description: "Alternative header authentication using Authorization: Bearer
        YOUR_API_KEY."
    apiKeyQuery:
      type: apiKey
      in: query
      name: apiKey
      description: Legacy query-parameter authentication. Supported for backwards
        compatibility; prefer X-API-Key for new integrations.
  parameters:
    titleId:
      name: title_id
      in: path
      required: true
      description: |
        Title identifier. Accepts:
        - Watchmode ID (e.g., `345534`) - 1 credit
        - IMDB ID (e.g., `tt0903747`) - 2 credits
        - TMDB format (e.g., `movie-278` or `tv-1396`) - 2 credits
      schema:
        type: string
        example: "3173903"
    page:
      name: page
      in: query
      description: Page number for pagination
      schema:
        type: integer
        minimum: 1
        default: 1
    changesLimit:
      name: limit
      in: query
      description: Results per page (1-250)
      schema:
        type: integer
        minimum: 1
        maximum: 250
        default: 250
    startDate:
      name: start_date
      in: query
      description: |
        Get changes after this date (PST timezone).
        Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
        Default: 1 day ago
      schema:
        type: integer
        example: 20240101
    endDate:
      name: end_date
      in: query
      description: |
        Get changes before this date (PST timezone).
        Format: `YYYYMMDD` or `YYYYMMDDHHMMSS`
        Default: current date
      schema:
        type: integer
        example: 20240131
    titleTypes:
      name: types
      in: query
      description: >
        Filter by title type. Comma-separated.

        Valid types: `movie`, `tv_series`, `tv_movie`, `tv_special`,
        `tv_miniseries`, `short_film`
      schema:
        type: string
        example: movie,tv_series
  responses:
    Unauthorized:
      description: Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
          example:
            success: false
            statusCode: 401
            statusMessage: Unauthorized
    BadRequest:
      description: Invalid request parameters
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
          example:
            success: false
            statusCode: 400
            statusMessage: "Missing required parameter: search_field"
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
          example:
            success: false
            statusCode: 404
            statusMessage: Title not found.
    PaidPlanRequired:
      description: Endpoint requires paid plan
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"
          example:
            success: false
            statusCode: 401
            statusMessage: The changes endpoint is only available with paid plans.
  schemas:
    Error:
      type: object
      required:
        - success
        - statusCode
        - statusMessage
      properties:
        success:
          type: boolean
          example: false
        statusCode:
          type: integer
          example: 400
        statusMessage:
          type: string
          example: Invalid request parameters
    StatusResponse:
      type: object
      properties:
        quota:
          type: integer
          description: Monthly API quota limit
          example: 1000
        quotaUsed:
          type: integer
          description: API calls used this month
          example: 150
    Source:
      type: object
      properties:
        id:
          type: integer
          description: Unique source ID
          example: 203
        name:
          type: string
          description: Source name
          example: Netflix
        type:
          type: string
          description: |
            Source type:
            - `sub` - Subscription service (Netflix, Hulu, etc.)
            - `purchase` - Rental/purchase service (iTunes, Vudu, etc.)
            - `free` - Free ad-supported service (Tubi, Pluto TV, etc.)
            - `tve` - TV Channel App (cable login required)
          enum:
            - sub
            - purchase
            - free
            - tve
          example: sub
        logo_100px:
          type: string
          format: uri
          description: URL to 100px logo
          example: https://cdn.watchmode.com/logos/203_logo_100px.jpg
        ios_appstore_url:
          type: string
          format: uri
          nullable: true
          description: iOS App Store URL
        android_playstore_url:
          type: string
          format: uri
          nullable: true
          description: Google Play Store URL
        android_tv_url:
          type: string
          format: uri
          nullable: true
        fire_tv_url:
          type: string
          format: uri
          nullable: true
        roku_url:
          type: string
          format: uri
          nullable: true
        tvos_url:
          type: string
          format: uri
          nullable: true
        regions:
          type: array
          items:
            type: string
          description: Supported 2-letter country codes
          example:
            - US
            - GB
            - CA
    Region:
      type: object
      properties:
        country:
          type: string
          description: 2-letter country code
          example: US
        name:
          type: string
          description: Country name
          example: USA
        flag:
          type: string
          format: uri
          description: URL to flag image
          example: https://cdn.watchmode.com/misc_images/icons/usFlag2.png
        data_tier:
          type: integer
          description: Data quality tier (1 = highest)
          enum:
            - 1
            - 2
          example: 1
        plan_enabled:
          type: boolean
          description: Whether region is enabled for your plan
          example: true
    Network:
      type: object
      properties:
        id:
          type: integer
          description: Watchmode network ID
          example: 1
        name:
          type: string
          description: Network name
          example: HBO
        origin_country:
          type: string
          description: 2-letter country code
          example: US
        tmdb_id:
          type: integer
          description: TMDB network ID (0 if not available)
          default: 0
          example: 49
    Genre:
      type: object
      properties:
        id:
          type: integer
          description: Watchmode genre ID
          example: 4
        name:
          type: string
          description: Genre name
          example: Comedy
        tmdb_id:
          type: integer
          description: TMDB genre ID (0 if not available)
          default: 0
          example: 35
    SearchResponse:
      type: object
      properties:
        title_results:
          type: array
          items:
            $ref: "#/components/schemas/TitleSearchResult"
        people_results:
          type: array
          items:
            $ref: "#/components/schemas/PersonSearchResult"
    TitleSearchResult:
      type: object
      properties:
        id:
          type: integer
          description: Watchmode title ID
          example: 3173903
        name:
          type: string
          description: Title name
          example: Breaking Bad
        type:
          type: string
          enum:
            - movie
            - tv_series
            - tv_special
            - tv_miniseries
            - short_film
            - tv_movie
          example: tv_series
        year:
          type: integer
          description: Release year
          example: 2008
        imdb_id:
          type: string
          nullable: true
          description: IMDB ID
          example: tt0903747
        tmdb_id:
          type: integer
          nullable: true
          description: TMDB ID
          example: 1396
        tmdb_type:
          type: string
          nullable: true
          enum:
            - movie
            - tv
          description: TMDB type
          example: tv
    PersonSearchResult:
      type: object
      properties:
        id:
          type: integer
          description: Watchmode person ID
          example: 710125611
        name:
          type: string
          description: Person name
          example: Bryan Cranston
        main_profession:
          type: string
          nullable: true
          description: Primary profession
          example: actor
        imdb_id:
          type: string
          nullable: true
          description: IMDB person ID
          example: nm0186505
        tmdb_id:
          type: integer
          nullable: true
          description: TMDB person ID
          example: 17419
    AutocompleteResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: "#/components/schemas/AutocompleteResult"
    AutocompleteResult:
      type: object
      properties:
        name:
          type: string
          description: Title or person name
          example: Breaking Bad
        relevance:
          type: number
          description: Relevance score
          example: 445.23
        type:
          type: string
          description: Title type (for titles)
          example: tv_series
        id:
          type: integer
          description: Watchmode ID
          example: 3173903
        year:
          type: integer
          nullable: true
          description: Release year (for titles)
          example: 2008
        result_type:
          type: string
          enum:
            - title
            - person
          description: Whether result is a title or person
          example: title
        imdb_id:
          type: string
          nullable: true
          example: tt0903747
        tmdb_id:
          type: integer
          nullable: true
          example: 1396
        tmdb_type:
          type: string
          nullable: true
          enum:
            - movie
            - tv
          example: tv
        image_url:
          type: string
          format: uri
          nullable: true
          description: Poster (titles) or headshot (people). May point to a third-party
            host. Watchmode does not grant any license to the underlying image.
          example: http://www.some-poster-site.com/image.jpg
    ListTitlesResponse:
      type: object
      properties:
        titles:
          type: array
          items:
            $ref: "#/components/schemas/TitleListItem"
        page:
          type: integer
          description: Current page number
          example: 1
        total_results:
          type: integer
          description: Total matching titles
          example: 4592
        total_pages:
          type: integer
          description: Total pages available
          example: 19
    TitleListItem:
      type: object
      properties:
        id:
          type: integer
          example: 1337513
        title:
          type: string
          example: Secret in Their Eyes
        year:
          type: integer
          example: 2015
        imdb_id:
          type: string
          nullable: true
          example: tt1741273
        tmdb_id:
          type: integer
          nullable: true
          example: 290751
        tmdb_type:
          type: string
          nullable: true
          enum:
            - movie
            - tv
          example: movie
        type:
          type: string
          enum:
            - movie
            - tv_series
            - tv_special
            - tv_miniseries
            - short_film
            - tv_movie
          example: movie
    TitleDetails:
      type: object
      properties:
        id:
          type: integer
          example: 3173903
        title:
          type: string
          example: Breaking Bad
        original_title:
          type: string
          nullable: true
          example: Breaking Bad
        plot_overview:
          type: string
          nullable: true
          description: Plot overview (AI-enhanced when available)
          example: When Walter White, a New Mexico chemistry teacher...
        will_you_like_this:
          type: string
          nullable: true
          description: AI-generated "Will you like this?" snippet
        review_summary:
          type: string
          nullable: true
          description: AI-generated summary of reviews
        type:
          type: string
          enum:
            - movie
            - tv_series
            - tv_special
            - tv_miniseries
            - short_film
            - tv_movie
          example: tv_series
        runtime_minutes:
          type: integer
          nullable: true
          example: 45
        year:
          type: integer
          example: 2008
        end_year:
          type: integer
          nullable: true
          description: For TV series, the year the show ended
          example: 2013
        release_date:
          type: string
          format: date
          nullable: true
          example: 2008-01-20
        imdb_id:
          type: string
          nullable: true
          example: tt0903747
        tmdb_id:
          type: integer
          nullable: true
          example: 1396
        tmdb_type:
          type: string
          nullable: true
          enum:
            - movie
            - tv
          example: tv
        genres:
          type: array
          items:
            type: integer
          nullable: true
          description: Array of genre IDs
          example:
            - 7
        genre_names:
          type: array
          items:
            type: string
          nullable: true
          description: Array of genre names
          example:
            - Drama
        user_rating:
          type: number
          nullable: true
          description: User rating (0-10)
          example: 9.2
        critic_score:
          type: integer
          nullable: true
          description: Critic score (0-100)
          example: 85
        us_rating:
          type: string
          nullable: true
          description: US content rating
          example: TV-MA
        poster:
          type: string
          format: uri
          nullable: true
          description: Poster image URL. May point to a third-party host. Watchmode does
            not grant any license to the underlying image.
          example: http://www.some-poster-site.com/image.jpg
        posterMedium:
          type: string
          format: uri
          nullable: true
          description: Medium poster image URL. May point to a third-party host. Watchmode
            does not grant any license to the underlying image.
          example: http://www.some-poster-site.com/image.jpg
        posterLarge:
          type: string
          format: uri
          nullable: true
          description: Large poster image URL. May point to a third-party host. Watchmode
            does not grant any license to the underlying image.
          example: http://www.some-poster-site.com/image.jpg
        backdrop:
          type: string
          format: uri
          nullable: true
          description: Backdrop image URL. May point to a third-party host. Watchmode does
            not grant any license to the underlying image.
          example: http://www.some-poster-site.com/image.jpg
        original_language:
          type: string
          nullable: true
          description: ISO 639-1 language code
          example: en
        similar_titles:
          type: array
          items:
            type: integer
          nullable: true
          description: Array of similar title IDs
          example:
            - 330884
            - 343611
        networks:
          type: array
          items:
            type: integer
          nullable: true
          description: Network IDs (for TV)
          example:
            - 8
        network_names:
          type: array
          items:
            type: string
          nullable: true
          description: Network names (for TV)
          example:
            - AMC
        relevance_percentile:
          type: number
          nullable: true
          description: Relevance percentile (0-100)
          example: 98.92
        popularity_percentile:
          type: number
          nullable: true
          description: Popularity percentile (0-100)
          example: 99.99
        trailer:
          type: string
          format: uri
          nullable: true
          description: YouTube trailer URL
          example: https://www.youtube.com/watch?v=5PSNL1qE6VY
        trailer_thumbnail:
          type: string
          format: uri
          nullable: true
          description: Trailer thumbnail URL
          example: http://www.some-poster-site.com/image.jpg
        english_title:
          type: string
          description: English title (when language param is not EN)
        sources:
          type: array
          items:
            $ref: "#/components/schemas/TitleSource"
          description: Streaming sources (when append_to_response=sources)
        seasons:
          type: array
          items:
            $ref: "#/components/schemas/Season"
          description: Seasons (when append_to_response=seasons)
        episodes:
          type: array
          items:
            $ref: "#/components/schemas/Episode"
          description: Episodes (when append_to_response=episodes)
        cast:
          type: array
          items:
            $ref: "#/components/schemas/CastCrew"
          description: Cast/crew (when append_to_response=cast-crew)
    TitleSource:
      type: object
      description: >
        Streaming source availability for a title.


        **Plan-dependent fields:**

        - `ios_url` and `android_url`: For free plans, returns the string
        "Deeplinks available for paid plans only." instead of a URL

        - `tvos_url`, `android_tv_url`, `roku_url`: Only included if TV links
        are enabled for your account
      properties:
        source_id:
          type: integer
          example: 203
        name:
          type: string
          example: Netflix
        type:
          type: string
          description: |
            Availability type for this title on this source:
            - `sub` - Available with subscription
            - `rent` - Available for rental
            - `buy` - Available for purchase
            - `free` - Available for free (ad-supported)
            - `tve` - Available with TV Channel App (cable login)
          enum:
            - sub
            - rent
            - buy
            - free
            - tve
          example: sub
        region:
          type: string
          example: US
        ios_url:
          type: string
          nullable: true
          description: >
            iOS deep link URL. For free plans, returns "Deeplinks available for
            paid plans only."
        android_url:
          type: string
          nullable: true
          description: >
            Android deep link URL. For free plans, returns "Deeplinks available
            for paid plans only."
        web_url:
          type: string
          format: uri
          nullable: true
          description: Web URL to watch the title
        tvos_url:
          type: string
          format: uri
          nullable: true
          description: >
            tvOS deep link. **Only included if TV links are enabled for your
            account.**
        android_tv_url:
          type: string
          format: uri
          nullable: true
          description: >
            Android TV deep link. **Only included if TV links are enabled for
            your account.**
        roku_url:
          type: string
          format: uri
          nullable: true
          description: >
            Roku deep link. **Only included if TV links are enabled for your
            account.**
        format:
          type: string
          nullable: true
          description: Video quality (HD, 4K, etc.)
          example: HD
        price:
          type: number
          nullable: true
          description: Price for rent/buy sources
          example: 3.99
        seasons:
          type: integer
          nullable: true
          description: Number of seasons available (for TV)
          example: 5
        episodes:
          type: integer
          nullable: true
          description: Number of episodes available (for TV)
          example: 62
    Season:
      type: object
      properties:
        id:
          type: integer
          example: 12345
        poster_url:
          type: string
          format: uri
          nullable: true
          description: Season poster image URL. May point to a third-party host. Watchmode
            does not grant any license to the underlying image.
        name:
          type: string
          nullable: true
          example: Season 1
        overview:
          type: string
          nullable: true
        number:
          type: integer
          nullable: true
          description: Season number
          example: 1
        air_date:
          type: string
          format: date
          nullable: true
          example: 2008-01-20
        episode_count:
          type: integer
          nullable: true
          example: 7
    Episode:
      type: object
      properties:
        id:
          type: integer
          example: 1234567
        name:
          type: string
          example: Pilot
        episode_number:
          type: integer
          example: 1
        season_number:
          type: integer
          example: 1
        season_id:
          type: integer
          nullable: true
          example: 12345
        tmdb_id:
          type: integer
          nullable: true
          example: 54321
        imdb_id:
          type: string
          nullable: true
          example: tt0959621
        thumbnail_url:
          type: string
          format: uri
          nullable: true
          description: Episode thumbnail image URL. May point to a third-party host.
            Watchmode does not grant any license to the underlying image.
        release_date:
          type: string
          format: date
          nullable: true
          example: 2008-01-20
        runtime_minutes:
          type: integer
          nullable: true
          example: 58
        overview:
          type: string
          nullable: true
        sources:
          type: array
          items:
            $ref: "#/components/schemas/EpisodeSource"
    EpisodeSource:
      type: object
      description: >
        Streaming source for an episode.


        **Plan-dependent fields:**

        - `ios_url` and `android_url`: For free plans, returns "Deeplinks
        available for paid plans only."

        - `web_url`: For free plans, returns "Episode links available for paid
        plans only."

        - `tvos_url`, `android_tv_url`, `roku_url`: Only included if TV links
        are enabled for your account
      properties:
        source_id:
          type: integer
          example: 203
        name:
          type: string
          example: Netflix
        type:
          type: string
          description: |
            Availability type for this episode on this source:
            - `sub` - Available with subscription
            - `rent` - Available for rental
            - `buy` - Available for purchase
            - `free` - Available for free (ad-supported)
            - `tve` - Available with TV Channel App (cable login)
          enum:
            - sub
            - rent
            - buy
            - free
            - tve
          example: sub
        region:
          type: string
          example: US
        ios_url:
          type: string
          nullable: true
          description: iOS deep link. For free plans, returns message string.
        android_url:
          type: string
          nullable: true
          description: Android deep link. For free plans, returns message string.
        web_url:
          type: string
          nullable: true
          description: Web URL. For free plans, returns message string.
        tvos_url:
          type: string
          format: uri
          nullable: true
          description: tvOS deep link (only if TV links enabled)
        android_tv_url:
          type: string
          format: uri
          nullable: true
          description: Android TV deep link (only if TV links enabled)
        roku_url:
          type: string
          format: uri
          nullable: true
          description: Roku deep link (only if TV links enabled)
        format:
          type: string
          nullable: true
          description: Video quality
        price:
          type: number
          nullable: true
          description: Price for rent/buy
    CastCrew:
      type: object
      properties:
        person_id:
          type: integer
          description: Watchmode person ID
          example: 7110004
        type:
          type: string
          enum:
            - Cast
            - Crew
          example: Cast
        full_name:
          type: string
          example: Bryan Cranston
        role:
          type: string
          description: Character name (cast) or job title (crew)
          example: Walter White
        episode_count:
          type: integer
          description: Number of episodes (for TV)
          example: 62
        order:
          type: integer
          nullable: true
          description: Billing order
          example: 1
    Person:
      type: object
      properties:
        id:
          type: integer
          example: 7110004
        full_name:
          type: string
          example: Brad Pitt
        first_name:
          type: string
          nullable: true
          example: Brad
        last_name:
          type: string
          nullable: true
          example: Pitt
        tmdb_id:
          type: integer
          nullable: true
          example: 287
        imdb_id:
          type: string
          nullable: true
          example: nm0000093
        main_profession:
          type: string
          nullable: true
          example: actor
        secondary_profession:
          type: string
          nullable: true
          example: producer
        tertiary_profession:
          type: string
          nullable: true
          example: soundtrack
        date_of_birth:
          type: string
          format: date
          nullable: true
          example: 1963-12-18
        date_of_death:
          type: string
          format: date
          nullable: true
        place_of_birth:
          type: string
          nullable: true
          example: Shawnee, Oklahoma, USA
        gender:
          type: string
          nullable: true
          enum:
            - m
            - f
          example: m
        known_for:
          type: array
          items:
            type: integer
          nullable: true
          description: Array of title IDs person is known for
          example:
            - 1132806
            - 1336708
            - 1183315
        relevance_percentile:
          type: number
          description: Popularity percentile (0-100)
          example: 100
    ReleasesResponse:
      type: object
      properties:
        releases:
          type: array
          items:
            $ref: "#/components/schemas/Release"
    Release:
      type: object
      properties:
        id:
          type: integer
          example: 3165490
        title:
          type: string
          example: Slow Horses
        type:
          type: string
          enum:
            - movie
            - tv_series
            - tv_special
            - tv_miniseries
            - short_film
            - tv_movie
          example: tv_series
        tmdb_id:
          type: integer
          nullable: true
          example: 95480
        tmdb_type:
          type: string
          nullable: true
          enum:
            - movie
            - tv
          example: tv
        imdb_id:
          type: string
          nullable: true
          example: tt5875444
        season_number:
          type: integer
          nullable: true
          description: Season number (for TV)
          example: 1
        poster_url:
          type: string
          format: uri
          nullable: true
          description: Poster image URL. May point to a third-party host. Watchmode does
            not grant any license to the underlying image.
        source_release_date:
          type: string
          format: date
          example: 2022-04-01
        source_id:
          type: integer
          example: 371
        source_name:
          type: string
          example: AppleTV+
        is_original:
          type: integer
          enum:
            - 0
            - 1
          description: Whether this is an original release on this service
          example: 1
    TitleReleaseDate:
      type: object
      properties:
        id:
          type: integer
          example: 1234567
        title:
          type: string
          example: "Dune: Part Two"
        title_type:
          type: string
          enum:
            - movie
            - tv_series
            - tv_special
            - tv_miniseries
            - short_film
            - tv_movie
          example: movie
        original_language:
          type: string
          nullable: true
          description: Original language code for the matched Watchmode title when
            available.
          example: en
        region:
          type: string
          example: US
        type:
          type: string
          enum:
            - streaming_movie_release
            - streaming_tv_season_release
            - theatrical_release
          example: theatrical_release
        release_date:
          type: string
          format: date
          example: 2024-03-01
        provider_id:
          type: integer
          nullable: true
          description: Streaming provider ID (null for theatrical)
          example: null
        season:
          type: integer
          nullable: true
          description: Season number (for TV releases)
          example: null
    ChangesResponse:
      type: object
      properties:
        titles:
          type: array
          items:
            type: integer
          description: Array of title IDs
          example:
            - 1138
            - 1668
            - 1867
            - 11029
        page:
          type: integer
          example: 1
        total_results:
          type: integer
          example: 6513
        total_pages:
          type: integer
          example: 27
    PeopleChangesResponse:
      type: object
      properties:
        people:
          type: array
          items:
            type: integer
          description: Array of person IDs
          example:
            - 710203130
            - 73333445
            - 710203131
        page:
          type: integer
          example: 1
        total_results:
          type: integer
          example: 15113
        total_pages:
          type: integer
          example: 61
