{"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.\n\n## Official TypeScript SDK\n\nInstall our official SDK for the best developer experience:\n\n```bash\nnpm install @watchmode/api-client\n```\n\n**Quick Start:**\n```typescript\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Search for titles\nconst { data: results } = await client.search.byName('Breaking Bad');\n\n// Get title details\nconst { data: title } = await client.title.getDetails('3173903');\n\n// Get streaming sources\nconst { data: sources } = await client.title.getSources('3173903');\n```\n\n📦 [View on npm](https://www.npmjs.com/package/@watchmode/api-client) | 📖 [SDK Examples](#operation/getSources)\n\n---\n\n## Features\n- **Streaming Availability**: Find where movies and TV shows are available to stream, rent, or buy\n- **Title Details**: Get comprehensive information about movies and TV series including cast, crew, ratings, and more\n- **Search**: Search for titles by name, IMDB ID, or TMDB ID\n- **Changes Tracking**: Monitor new titles, streaming source changes, and metadata updates\n- **Multi-Region Support**: Data available for 50+ countries\n\n## API Key\nAll 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.\n\nRecommended:\n```bash\ncurl -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/status/'\n```\n\nAlso supported:\n```bash\ncurl -H 'Authorization: Bearer YOUR_API_KEY' 'https://api.watchmode.com/v1/status/'\n```\n\nFor backwards compatibility, the `apiKey` query parameter is still accepted, but new integrations should prefer headers:\n```bash\ncurl 'https://api.watchmode.com/v1/status/?apiKey=YOUR_API_KEY'\n```\n\nGet your free API key at [https://api.watchmode.com/requestApiKey/](https://api.watchmode.com/requestApiKey/)\n\n## Third-Party Image URLs\nSome 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).\n\n## Rate Limiting\nAPI requests are limited based on your plan. Check response headers for current limits:\n- `X-RateLimit-Limit`: Maximum requests per minute\n- `X-RateLimit-Remaining`: Remaining requests in current window\n- `X-Account-Quota`: Monthly quota limit\n- `X-Account-Quota-Used`: Quota used this month\n\n## ID Mapping\nWatchmode IDs are universally unique across titles and people. Download ID mapping files:\n- [Title ID Map](https://api.watchmode.com/datasets/title_id_map.csv)\n- [Person ID Map](https://api.watchmode.com/datasets/person_id_map.csv)\n","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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\nconst { data: status } = await client.account.getStatus();\nconsole.log(`Quota: ${status.quota}, Used: ${status.quotaUsed}`);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = 'https://api.watchmode.com/v1/status/';\n\nconst response = await fetch(url, {\n  headers: { 'X-API-Key': apiKey }\n});\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = 'https://api.watchmode.com/v1/status/'\nrequest = urllib.request.Request(url, headers={'X-API-Key': api_key})\n\nwith urllib.request.urlopen(request) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/status/')\nrequest = Net::HTTP::Get.new(uri)\nrequest['X-API-Key'] = 'YOUR_API_KEY'\n\nresponse = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }\njson = response.body\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/status/\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\"X-API-Key: {$apiKey}\"]);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nThis includes subscription services (like Netflix), rental/purchase services (like iTunes), and free services.\nEach source includes details about supported regions, logos, and app store links.\n","tags":["Configuration"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/sources/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\nconst { data: sources } = await client.sources.list();\nconsole.log(sources);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/sources/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = f'https://api.watchmode.com/v1/sources/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/sources/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/sources/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\n- `sub` - Subscription services (Netflix, Hulu, etc.)\n- `purchase` - Rental/purchase services (iTunes, Vudu, etc.)\n- `free` - Free ad-supported services (Tubi, Pluto TV, etc.)\n- `tve` - TV Channel App (cable login required)\n","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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\nconst { data: regions } = await client.reference.getRegions();\nconsole.log(regions);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/regions/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = f'https://api.watchmode.com/v1/regions/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/regions/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/regions/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\nconst { data: networks } = await client.reference.getNetworks();\nconsole.log(networks);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/networks/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = f'https://api.watchmode.com/v1/networks/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/networks/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/networks/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\nconst { data: genres } = await client.reference.getGenres();\nconsole.log(genres);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/genres/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = f'https://api.watchmode.com/v1/genres/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/genres/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/genres/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nReturns matching titles and people with their Watchmode IDs.\nUseful for getting Watchmode IDs to use with other endpoints.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Search by name\nconst { data: results } = await client.search.byName('Ed Wood');\nconsole.log(results);\n\n// Or search by IMDB ID\nconst { data: imdbResults } = await client.search.byImdbId('tt0109707');\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst searchField = 'name';\nconst searchValue = 'Ed Wood';\nconst url = `https://api.watchmode.com/v1/search/?apiKey=${apiKey}&search_field=${searchField}&search_value=${encodeURIComponent(searchValue)}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\nfrom urllib.parse import urlencode\n\napi_key = 'YOUR_API_KEY'\nsearch_field = 'name'\nsearch_value = 'Ed Wood'\n\nparams = {\n    'apiKey': api_key,\n    'search_field': search_field,\n    'search_value': search_value\n}\n\nurl = f'https://api.watchmode.com/v1/search/?{urlencode(params)}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/search/?apiKey=YOUR_API_KEY&search_field=name&search_value=Ed%20Wood')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$searchField = 'name';\n$searchValue = 'Ed Wood';\n$url = \"https://api.watchmode.com/v1/search/?apiKey={$apiKey}&search_field={$searchField}&search_value=\" . urlencode($searchValue);\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"parameters":[{"name":"search_field","in":"query","required":true,"description":"The field to search in:\n- `name` - Search by title or person name\n- `imdb_id` - Search by IMDB ID (e.g., tt0944947)\n- `tmdb_movie_id` - Search by TMDB movie ID\n- `tmdb_tv_id` - Search by TMDB TV show ID\n- `tmdb_person_id` - Search by TMDB person ID\n","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.\nOptimized for building autocomplete/typeahead search interfaces.\nResults include relevance scores and thumbnail images.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Autocomplete search (optimized for typeahead)\nconst { data } = await client.search.autocomplete('Breaking bad', {\n  searchType: 2  // 2 = titles only\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst searchValue = 'Breaking bad';\nconst searchType = 1; // 1 = titles and people\nconst url = `https://api.watchmode.com/v1/autocomplete-search/?apiKey=${apiKey}&search_value=${encodeURIComponent(searchValue)}&search_type=${searchType}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\nfrom urllib.parse import urlencode\n\napi_key = 'YOUR_API_KEY'\nsearch_value = 'Breaking bad'\nsearch_type = 1  # 1 = titles and people\n\nparams = {\n    'apiKey': api_key,\n    'search_value': search_value,\n    'search_type': search_type\n}\n\nurl = f'https://api.watchmode.com/v1/autocomplete-search/?{urlencode(params)}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/autocomplete-search/?apiKey=YOUR_API_KEY&search_value=Breaking%20bad&search_type=1')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$searchValue = 'Breaking bad';\n$searchType = 1; // 1 = titles and people\n$url = \"https://api.watchmode.com/v1/autocomplete-search/?apiKey={$apiKey}&search_value=\" . urlencode($searchValue) . \"&search_type={$searchType}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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:\n- `1` - Titles and people (default)\n- `2` - Titles only\n- `3` - Movies only\n- `4` - TV shows only\n- `5` - People only\n","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.\nThis powerful endpoint allows granular filtering such as \"Horror movies streaming on Netflix in the USA\".\n\n**Quota Notes:**\n- Each additional region costs 1 API credit\n- When using `source_ids` or `source_types`, only one region is allowed\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// List titles with filtering\nconst { data } = await client.title.list({\n  types: 'movie',\n  genres: '12',           // Horror genre ID\n  sourceIds: '203',       // Netflix\n  regions: 'US',\n  sortBy: 'popularity_desc',\n  page: 1,\n  limit: 50\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst sourceIds = '203,57';\nconst url = `https://api.watchmode.com/v1/list-titles/?apiKey=${apiKey}&source_ids=${sourceIds}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nsource_ids = '203,57'\nurl = f'https://api.watchmode.com/v1/list-titles/?apiKey={api_key}&source_ids={source_ids}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/list-titles/?apiKey=YOUR_API_KEY&source_ids=203,57')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$sourceIds = '203,57';\n$url = \"https://api.watchmode.com/v1/list-titles/?apiKey={$apiKey}&source_ids={$sourceIds}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"parameters":[{"name":"types","in":"query","description":"Filter by title type. Comma-separated for multiple values.\nValid types: `movie`, `tv_series`, `tv_movie`, `tv_special`, `tv_miniseries`, `short_film`\n","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.\n- `sub` - Subscription\n- `rent` - Rental\n- `buy` - Purchase\n- `free` - Free\n- `tve` - TV Channel App (Cable Plan Required)\n","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.\n\n**ID Formats Accepted:**\n- Watchmode ID (e.g., `345534`) - costs 1 credit\n- IMDB ID (e.g., `tt0903747`) - costs 2 credits\n- TMDB format (e.g., `movie-278` or `tv-1396`) - costs 2 credits\n\nUse `append_to_response` to include additional data in a single request.\n","tags":["Title"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/title/345534/details/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get title details\nconst { data: title } = await client.title.getDetails('345534');\nconsole.log(title);\n\n// With additional data appended\nconst { data: fullTitle } = await client.title.getDetails('345534', {\n  appendToResponse: 'sources,cast-crew',\n  regions: 'US'\n});\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst url = `https://api.watchmode.com/v1/title/${titleId}/details/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nurl = f'https://api.watchmode.com/v1/title/{title_id}/details/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/details/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/details/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"parameters":[{"$ref":"#/components/parameters/titleId"},{"name":"append_to_response","in":"query","description":"Include additional data. Comma-separated values. Each adds 1 credit.\n- `sources` - Streaming availability\n- `seasons` - Season list (TV only)\n- `episodes` - Episode list with sources (TV only)\n- `cast-crew` - Cast and crew\n","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.\nReturns subscription services, rental options, purchase options, and free streaming.\nFor TV shows, includes information about available seasons and episodes per source.\n","tags":["Title"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/title/345534/sources/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get streaming sources for a title\nconst { data: sources } = await client.title.getSources('345534', {\n  regions: 'US'\n});\nconsole.log(sources);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst url = `https://api.watchmode.com/v1/title/${titleId}/sources/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nurl = f'https://api.watchmode.com/v1/title/{title_id}/sources/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/sources/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/sources/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get seasons for a TV series\nconst { data: seasons } = await client.title.getSeasons('345534');\nconsole.log(seasons);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst url = `https://api.watchmode.com/v1/title/${titleId}/seasons/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nurl = f'https://api.watchmode.com/v1/title/{title_id}/seasons/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/seasons/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/seasons/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nFor paid plans, includes deep links to watch each episode on streaming services.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get all episodes for a TV series with US streaming sources\nconst { data: episodes } = await client.title.getEpisodes('345534', {\n  regions: 'US'\n});\nconsole.log(episodes);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst regions = 'US';\nconst url = `https://api.watchmode.com/v1/title/${titleId}/episodes/?apiKey=${apiKey}&regions=${regions}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nregions = 'US'\nurl = f'https://api.watchmode.com/v1/title/{title_id}/episodes/?apiKey={api_key}&regions={regions}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/episodes/?apiKey=YOUR_API_KEY&regions=US')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$regions = 'US';\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/episodes/?apiKey={$apiKey}&regions={$regions}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get cast and crew for a title\nconst { data: credits } = await client.title.getCastCrew('345534');\nconsole.log(credits);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst url = `https://api.watchmode.com/v1/title/${titleId}/cast-crew/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nurl = f'https://api.watchmode.com/v1/title/{title_id}/cast-crew/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/cast-crew/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/cast-crew/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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\nby allowing users to flag issues with title information.\n\n**Note:** This endpoint does not count against your quota as users are helping improve data quality.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Report incorrect data for a title\nconst { data } = await client.title.reportIncorrectData('345534', {\n  sourceMissing: 1,\n  somethingWrongDetails: 'Missing Netflix availability'\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst titleId = '345534';\nconst params = new URLSearchParams({\n  apiKey,\n  sourceMissing: '1',\n  somethingWrongDetails: 'Missing Netflix availability'\n});\nconst url = `https://api.watchmode.com/v1/title/${titleId}/incorrect-data/?${params}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\nfrom urllib.parse import urlencode\n\napi_key = 'YOUR_API_KEY'\ntitle_id = '345534'\nparams = urlencode({\n    'apiKey': api_key,\n    'sourceMissing': 1,\n    'somethingWrongDetails': 'Missing Netflix availability'\n})\nurl = f'https://api.watchmode.com/v1/title/{title_id}/incorrect-data/?{params}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title/345534/incorrect-data/?apiKey=YOUR_API_KEY&sourceMissing=1')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$titleId = '345534';\n$params = http_build_query([\n    'apiKey' => $apiKey,\n    'sourceMissing' => 1,\n    'somethingWrongDetails' => 'Missing Netflix availability'\n]);\n$url = \"https://api.watchmode.com/v1/title/{$titleId}/incorrect-data/?{$params}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nPerson IDs in Watchmode always start with `7` followed by the actual ID.\n","tags":["Person"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/person/7110004'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get person details\nconst { data: person } = await client.person.getDetails(7110004);\nconsole.log(person?.full_name);  // \"Brad Pitt\"\nconsole.log(person?.known_for);  // Array of title IDs\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst personId = '7110004';\nconst url = `https://api.watchmode.com/v1/person/${personId}?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nperson_id = '7110004'\nurl = f'https://api.watchmode.com/v1/person/{person_id}?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/person/7110004?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$personId = '7110004';\n$url = \"https://api.watchmode.com/v1/person/{$personId}?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nIncludes original content flags to identify platform exclusives.\nPrimarily US release dates, though most major services release globally on the same day.\n","tags":["Releases"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/releases/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get recent/upcoming releases\nconst { data } = await client.releases.getRecent({\n  startDate: 20240101,\n  endDate: 20240131,\n  limit: 100\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/releases/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\napi_key = 'YOUR_API_KEY'\nurl = f'https://api.watchmode.com/v1/releases/?apiKey={api_key}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/releases/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$url = \"https://api.watchmode.com/v1/releases/?apiKey={$apiKey}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"parameters":[{"name":"start_date","in":"query","description":"Get releases after this date (PST timezone).\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\nDefault: 30 days ago\n","schema":{"type":"integer","example":20240101}},{"name":"end_date","in":"query","description":"Get releases before this date (PST timezone).\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\nDefault: 30 days from now\n","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.\nIncludes both historical and upcoming releases, as well as streaming premieres and theatrical releases.\n\nRelease dates are returned as normalized calendar dates in `YYYY-MM-DD` format. When an upstream source provides a midnight UTC\navailability timestamp that is stored in a US time zone, Watchmode normalizes it back to the intended UTC calendar date before\nfiltering and returning results.\n\nBy default, this endpoint returns all region-specific release rows available to Watchmode. Use the `regions` parameter to filter\nresults to specific countries. Some legacy streaming release-date sources are US-only; those rows are returned with `region: \"US\"`.\n\n**Note:** This endpoint requires a paid plan.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get advanced release dates (paid plans only)\nconst { data } = await client.releases.getReleaseDates({\n  startDate: 20240101,\n  endDate: 20240331,\n  regions: 'US,GB'\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst startDate = 20240101;\nconst endDate = 20240331;\nconst regions = 'US,GB';\nconst url = `https://api.watchmode.com/v1/title-release-dates/?apiKey=${apiKey}&start_date=${startDate}&end_date=${endDate}&regions=${regions}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\nfrom urllib.parse import urlencode\n\napi_key = 'YOUR_API_KEY'\nparams = urlencode({\n    'apiKey': api_key,\n    'start_date': 20240101,\n    'end_date': 20240331,\n    'regions': 'US,GB'\n})\nurl = f'https://api.watchmode.com/v1/title-release-dates/?{params}'\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/title-release-dates/?apiKey=YOUR_API_KEY&start_date=20240101&end_date=20240331&regions=US,GB')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$apiKey = 'YOUR_API_KEY';\n$params = http_build_query([\n    'apiKey' => $apiKey,\n    'start_date' => 20240101,\n    'end_date' => 20240331,\n    'regions' => 'US,GB'\n]);\n$url = \"https://api.watchmode.com/v1/title-release-dates/?{$params}\";\n\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\n"}],"parameters":[{"name":"start_date","in":"query","description":"Filter releases on or after this normalized calendar date.\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\n","schema":{"type":"integer","example":20240101}},{"name":"end_date","in":"query","description":"Filter releases on or before this normalized calendar date.\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\n","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.\nUseful for keeping your database in sync with Watchmode.\n\n**Note:** This endpoint requires a paid plan.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get newly added titles (paid plans only)\nconst { data } = await client.changes.getNewTitles({\n  startDate: 20240101,\n  endDate: 20240107,\n  types: 'movie,tv_series',\n  page: 1,\n  limit: 250\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst types = 'movie,tv_series';\nconst url = `https://api.watchmode.com/v1/changes/new_titles?apiKey=${apiKey}&types=${types}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\nurl = \"https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series\"\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/new_titles?apiKey=YOUR_API_KEY&types=movie,tv_series');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\n\n**Note:** This endpoint requires a paid plan.\n","tags":["Changes"],"x-codeSamples":[{"lang":"Shell","source":"curl -i -H 'X-API-Key: YOUR_API_KEY' 'https://api.watchmode.com/v1/changes/new_people/'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get newly added people (paid plans only)\nconst { data } = await client.changes.getNewPeople({\n  startDate: 20240101,\n  endDate: 20240107\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/changes/new_people/?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\nurl = \"https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY\"\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/new_people/?apiKey=YOUR_API_KEY');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\nUse this to know which titles need their sources refreshed.\n\n**Note:** This endpoint requires a paid plan.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get titles where streaming sources changed (paid plans only)\nconst { data } = await client.changes.getTitlesSourcesChanged({\n  startDate: 20240101,\n  endDate: 20240107,\n  regions: 'US'\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=${apiKey}&regions=US`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\nurl = \"https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US\"\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_sources_changed?apiKey=YOUR_API_KEY&regions=US');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\n\n**Note:** This endpoint requires a paid plan.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get titles where details changed (paid plans only)\nconst { data } = await client.changes.getTitlesDetailsChanged({\n  startDate: 20240101,\n  endDate: 20240107\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\nurl = \"https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY\"\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_details_changed?apiKey=YOUR_API_KEY');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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.\n\n**Note:** This endpoint requires a paid plan.\n","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'\n"},{"lang":"TypeScript","label":"TypeScript SDK","source":"// npm install @watchmode/api-client\nimport { WatchmodeClient } from '@watchmode/api-client';\n\nconst client = new WatchmodeClient({ apiKey: 'YOUR_API_KEY' });\n\n// Get titles where episodes changed (paid plans only)\nconst { data } = await client.changes.getTitlesEpisodesChanged({\n  startDate: 20240101,\n  endDate: 20240107\n});\nconsole.log(data);\n"},{"lang":"JavaScript","source":"const apiKey = 'YOUR_API_KEY';\nconst url = `https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=${apiKey}`;\n\nconst response = await fetch(url);\nconst json = await response.json();\nconsole.log(json);\n"},{"lang":"Python","source":"import urllib.request\nimport json\n\nurl = \"https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY\"\n\nwith urllib.request.urlopen(url) as response:\n    data = json.loads(response.read().decode())\n    print(data)\n"},{"lang":"Ruby","source":"require 'net/http'\nrequire 'uri'\nrequire 'json'\n\nuri = URI('https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY')\njson = Net::HTTP.get(uri)\nresult = JSON(json)\nprint(result)\n"},{"lang":"PHP","source":"<?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'https://api.watchmode.com/v1/changes/titles_episodes_changed?apiKey=YOUR_API_KEY');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n$response = curl_exec($ch);\ncurl_close($ch);\n\n$json = json_decode($response);\nprint_r($json);\n"}],"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:\n- Watchmode ID (e.g., `345534`) - 1 credit\n- IMDB ID (e.g., `tt0903747`) - 2 credits\n- TMDB format (e.g., `movie-278` or `tv-1396`) - 2 credits\n","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).\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\nDefault: 1 day ago\n","schema":{"type":"integer","example":20240101}},"endDate":{"name":"end_date","in":"query","description":"Get changes before this date (PST timezone).\nFormat: `YYYYMMDD` or `YYYYMMDDHHMMSS`\nDefault: current date\n","schema":{"type":"integer","example":20240131}},"titleTypes":{"name":"types","in":"query","description":"Filter by title type. Comma-separated.\nValid types: `movie`, `tv_series`, `tv_movie`, `tv_special`, `tv_miniseries`, `short_film`\n","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:\n- `sub` - Subscription service (Netflix, Hulu, etc.)\n- `purchase` - Rental/purchase service (iTunes, Vudu, etc.)\n- `free` - Free ad-supported service (Tubi, Pluto TV, etc.)\n- `tve` - TV Channel App (cable login required)\n","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.\n\n**Plan-dependent fields:**\n- `ios_url` and `android_url`: For free plans, returns the string \"Deeplinks available for paid plans only.\" instead of a URL\n- `tvos_url`, `android_tv_url`, `roku_url`: Only included if TV links are enabled for your account\n","properties":{"source_id":{"type":"integer","example":203},"name":{"type":"string","example":"Netflix"},"type":{"type":"string","description":"Availability type for this title on this source:\n- `sub` - Available with subscription\n- `rent` - Available for rental\n- `buy` - Available for purchase\n- `free` - Available for free (ad-supported)\n- `tve` - Available with TV Channel App (cable login)\n","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.\"\n"},"android_url":{"type":"string","nullable":true,"description":"Android deep link URL. For free plans, returns \"Deeplinks available for paid plans only.\"\n"},"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.**\n"},"android_tv_url":{"type":"string","format":"uri","nullable":true,"description":"Android TV deep link. **Only included if TV links are enabled for your account.**\n"},"roku_url":{"type":"string","format":"uri","nullable":true,"description":"Roku deep link. **Only included if TV links are enabled for your account.**\n"},"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.\n\n**Plan-dependent fields:**\n- `ios_url` and `android_url`: For free plans, returns \"Deeplinks available for paid plans only.\"\n- `web_url`: For free plans, returns \"Episode links available for paid plans only.\"\n- `tvos_url`, `android_tv_url`, `roku_url`: Only included if TV links are enabled for your account\n","properties":{"source_id":{"type":"integer","example":203},"name":{"type":"string","example":"Netflix"},"type":{"type":"string","description":"Availability type for this episode on this source:\n- `sub` - Available with subscription\n- `rent` - Available for rental\n- `buy` - Available for purchase\n- `free` - Available for free (ad-supported)\n- `tve` - Available with TV Channel App (cable login)\n","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}}}}}}