{
  "openapi": "3.0.1",
  "info": {
    "title": "Spotify Search & Complete Data Scraper ✨",
    "description": "Search tracks, albums, artists, playlists, genres, audiobooks, podcasts & episodes — multiple keywords per run. Fetch full metadata by URI/URL: track lists, chapters, episode counts, follower stats, popularity scores, release dates & cover images. No Spotify account required.",
    "version": "0.0",
    "x-build-id": "okrmJkAVvlQLD44s0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/apiharvest~spotify-search-complete-data-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-apiharvest-spotify-search-complete-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/apiharvest~spotify-search-complete-data-scraper/runs": {
      "post": {
        "operationId": "runs-sync-apiharvest-spotify-search-complete-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/apiharvest~spotify-search-complete-data-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-apiharvest-spotify-search-complete-data-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "🎯 Scraper Mode",
            "enum": [
              "search",
              "get_details"
            ],
            "type": "string",
            "description": "Choose how to scrape Spotify:\n\n🔍 Search Mode — enter a keyword and pick a Search Type. Returns ranked results.\n   Active fields: Search Type, Search Keyword, and each type's filter section below.\n\n🔗 Get Details Mode — paste Spotify URIs/URLs and pick a Get Details Type. Returns full metadata.\n   Active fields: Get Details Type, Spotify URIs / URLs, and each type's filter section below.",
            "default": "search"
          },
          "searchType": {
            "title": "🔎 Search Type",
            "enum": [
              "searchTracks",
              "searchAlbums",
              "searchArtists",
              "searchPlaylists",
              "searchGenres",
              "searchUsers",
              "searchAudiobooks",
              "searchFullEpisodes",
              "searchPodcasts"
            ],
            "type": "string",
            "description": "⚠️ Search Mode only — ignored in Get Details Mode.\n\nWhich Spotify category to search by keyword.\n🎵 Tracks · 💿 Albums · 🎤 Artists · 🎧 Playlists · 🎨 Genres/Moods · 👤 Users · 📚 Audiobooks · 🎙️ Full Episodes · 🎙 Podcasts/Shows\n\n💡 Each type also has a 'Fetch Full Details' toggle inside its own section below — turn it on to automatically run the matching get-detail scraper on every result URI found.",
            "default": "searchTracks"
          },
          "keyword": {
            "title": "🔍 Search Keyword(s)",
            "type": "array",
            "description": "⚠️ Search Mode only — ignored in Get Details Mode.\n\nOne or more search terms sent to Spotify. Each keyword runs as a separate search.\nUse full track names, artist names, or titles for accurate results.\n\n💡 Add multiple keywords — one per entry — to search for several terms in a single run.",
            "items": {
              "type": "string"
            }
          },
          "getDetailsType": {
            "title": "🔗 Get Details Type",
            "enum": [
              "track",
              "album",
              "artist",
              "playlist",
              "genre",
              "audiobook",
              "podcast",
              "episode"
            ],
            "type": "string",
            "description": "⚠️ Get Details Mode only — ignored in Search Mode.\n\nSelect which Spotify entity type you are fetching. This must match the URIs you paste below.\n🎵 Track · 💿 Album · 🎤 Artist · 🎧 Playlist · 🎨 Genre/Mood · 📚 Audiobook · 🎙 Podcast/Show · 🎙️ Full Episode\n\n💡 For spotify:show: URIs — select Audiobook or Podcast/Show explicitly since both share the same URI prefix.",
            "default": "track"
          },
          "spotifyUris": {
            "title": "🔗 Spotify URIs / URLs",
            "type": "array",
            "description": "⚠️ Get Details Mode only — ignored in Search Mode.\n\nOne or more Spotify URIs or open.spotify.com URLs to fetch.\nExamples: spotify:track:ID · https://open.spotify.com/album/ID\n\n💡 All URIs must be the same entity type — select the matching type in Get Details Type above.",
            "items": {
              "type": "string"
            }
          },
          "showDetailType": {
            "title": "❓ Show URI Type — Audiobook or Podcast?",
            "enum": [
              "podcast",
              "audiobook"
            ],
            "type": "string",
            "description": "⚠️ This field is no longer needed. Use Get Details Type above to select Audiobook or Podcast/Show explicitly.\n\nKept for backward compatibility only. Ignored when Get Details Type is set.",
            "default": "podcast"
          },
          "proxyCountry": {
            "title": "🌐 Proxy Country",
            "enum": [
              "US",
              "GB",
              "AU",
              "CA",
              "DE",
              "FR",
              "NL",
              "IT",
              "ES",
              "SE",
              "NO",
              "DK",
              "FI",
              "BE",
              "AT",
              "CH",
              "IE",
              "PL",
              "PT",
              "CZ",
              "HU",
              "RO",
              "GR",
              "BG",
              "HR",
              "SK",
              "RS",
              "JP",
              "KR",
              "SG",
              "HK",
              "TW",
              "TH",
              "MY",
              "ID",
              "PH",
              "VN",
              "IN",
              "BR",
              "MX",
              "AR",
              "CL",
              "CO",
              "PE",
              "ZA",
              "NG",
              "KE",
              "EG",
              "SA",
              "AE",
              "TR",
              "IL",
              "UA",
              "RU",
              "BY"
            ],
            "type": "string",
            "description": "Residential proxy exit country — Spotify sees your requests as coming from this location.\n\n⭐ US recommended — widest catalog, only country guaranteed for ALL scraper types (Tracks, Albums, Artists, Playlists, Audiobooks, Podcasts, Episodes).\n\n⚠️ Regional restrictions:\n• Podcasts & Episodes → require US, GB, AU, or CA\n• Audiobooks → US, GB, AU, CA only\n• Music (Tracks/Albums/Artists) → works in most countries\n\nIf results are empty, switch to US. If US still returns empty, it's a script or API issue — contact the developer.",
            "default": "US"
          },
          "tracks_search_offset": {
            "title": "🎵 Tracks — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "tracks_search_limit": {
            "title": "🎵 Tracks — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of track results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 10
          },
          "tracks_search_numberOfTopResults": {
            "title": "🎵 Tracks — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 10
          },
          "tracks_fetchDetails": {
            "title": "🎵 Tracks — 🔄 Fetch Full Track Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs getTrack for every URI found in search results, merging full track metadata into each result.\n⚠️ Slower — one extra API call per search result.",
            "default": false
          },
          "albums_search_offset": {
            "title": "💿 Albums — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "albums_search_limit": {
            "title": "💿 Albums — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of album results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "albums_search_numberOfTopResults": {
            "title": "💿 Albums — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 20
          },
          "albums_get_offset": {
            "title": "💿 Albums — 📄 Get: Track List Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position in the album's track list. 0 = first track.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Album Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 0
          },
          "albums_get_limit": {
            "title": "💿 Albums — 📊 Get: Track List Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of tracks to return from the album.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Album Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 50
          },
          "albums_fetchDetails": {
            "title": "💿 Albums — 🔄 Fetch Full Album Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs getAlbum for every URI found in search results. This activates the Get: Track List Offset and Limit filters above.\n⚠️ Slower — one extra API call per search result.",
            "default": false
          },
          "artists_search_offset": {
            "title": "🎤 Artists — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "artists_search_limit": {
            "title": "🎤 Artists — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of artist results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "artists_search_numberOfTopResults": {
            "title": "🎤 Artists — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 20
          },
          "artists_fetchDetails": {
            "title": "🎤 Artists — 🔄 Fetch Full Artist Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs queryArtistOverview for every URI found in search results, merging full artist metadata into each result.\n⚠️ Slower — one extra API call per search result.",
            "default": false
          },
          "playlists_search_offset": {
            "title": "🎧 Playlists — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "playlists_search_limit": {
            "title": "🎧 Playlists — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of playlist results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "playlists_search_numberOfTopResults": {
            "title": "🎧 Playlists — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 20
          },
          "playlists_get_offset": {
            "title": "🎧 Playlists — 📄 Get: Track List Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position in the playlist's track list. 0 = first track.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Playlist Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 0
          },
          "playlists_get_limit": {
            "title": "🎧 Playlists — 📊 Get: Track List Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of tracks to return from the playlist.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Playlist Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 25
          },
          "playlists_fetchDetails": {
            "title": "🎧 Playlists — 🔄 Fetch Full Playlist Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs fetchPlaylist for every URI found in search results. This activates the Get: Track List Offset and Limit filters above.\n⚠️ Slower — one extra API call per search result.",
            "default": false
          },
          "genres_search_offset": {
            "title": "🎨 Genres — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "genres_search_limit": {
            "title": "🎨 Genres — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of genre results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "genres_search_numberOfTopResults": {
            "title": "🎨 Genres — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 20
          },
          "genres_get_sectionLimit": {
            "title": "🎨 Genres — 📊 Get: How Many Sections",
            "minimum": 1,
            "type": "integer",
            "description": "Number of sections to fetch from the genre page (e.g. 'Popular Playlists', 'New Releases').\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Genre Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 10
          },
          "genres_get_sectionItemLimit": {
            "title": "🎨 Genres — 📊 Get: Items Per Section",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum items returned inside each section when using browseSection.\n📌 Only active when 'Include Section Details' is ON — otherwise browsePage returns a quick 10-item preview and this value is ignored.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 20
          },
          "genres_includeSectionDetails": {
            "title": "🎨 Genres — 🔍 Include Section Details",
            "type": "boolean",
            "description": "Controls whether a separate browseSection API call runs for each section.\n• ON → runs browseSection per section, fetching full items up to Items Per Section limit. Activates the Items Per Section filter.\n• OFF → uses the quick 10-item preview from browsePage only (faster, fewer API calls). Items Per Section is ignored.\n✅ Your ON/OFF choice is respected in both modes.\n📌 In Get Details Mode — always available. In Search Mode — only when Fetch Full Genre Details is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": false
          },
          "genres_fetchDetails": {
            "title": "🎨 Genres — 🔄 Fetch Full Genre Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs browsePage for every URI found in search results. This activates all Get: filters and toggle buttons above (How Many Sections, Items Per Section, Include Section Details).\n⚠️ Slower — one or more extra API calls per search result.",
            "default": false
          },
          "users_search_offset": {
            "title": "👤 Users — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only.",
            "default": 0
          },
          "users_search_limit": {
            "title": "👤 Users — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of user results to return.\n📌 Search Mode only.",
            "default": 30
          },
          "users_search_numberOfTopResults": {
            "title": "👤 Users — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only.",
            "default": 20
          },
          "audiobooks_search_offset": {
            "title": "📚 Audiobooks — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "audiobooks_search_limit": {
            "title": "📚 Audiobooks — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of audiobook results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "audiobooks_search_numberOfTopResults": {
            "title": "📚 Audiobooks — 🏆 Top Results Count",
            "minimum": 1,
            "type": "integer",
            "description": "Number of top-ranked items highlighted in the response.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 20
          },
          "audiobooks_get_offset": {
            "title": "📚 Audiobooks — 📄 Get: Chapter List Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position in the chapter list. 0 = start from chapter 1.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Audiobook Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 0
          },
          "audiobooks_get_limit": {
            "title": "📚 Audiobooks — 📊 Get: Chapter List Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of chapters to fetch per audiobook.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Audiobook Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 50
          },
          "audiobooks_includeSimilar": {
            "title": "📚 Audiobooks — 🔗 Include Similar Audiobooks",
            "type": "boolean",
            "description": "Controls whether the similarAudiobooks API call (3rd operation) runs to fetch recommendations.\n• ON → fetches similar audiobook recommendations\n• OFF → skips the 3rd operation (faster)\n✅ Your ON/OFF choice is respected in both modes.\n📌 In Get Details Mode — always available. In Search Mode — only when Fetch Full Audiobook Details is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.\n⚠️ Spotify has retired this API in some regions — may return no data.",
            "default": false
          },
          "audiobooks_fetchDetails": {
            "title": "📚 Audiobooks — 🔄 Fetch Full Audiobook Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs all 3 operations (metadata + chapters + optional similar) for every audiobook URI found in search results. This activates all Get: filters and toggle buttons above.\n⚠️ Slower — multiple extra API calls per search result.",
            "default": false
          },
          "episodes_search_offset": {
            "title": "🎙️ Episodes — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "episodes_search_limit": {
            "title": "🎙️ Episodes — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of episode results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "episodes_includeRecommended": {
            "title": "🎙️ Episodes — 💡 Include Recommended Episodes",
            "type": "boolean",
            "description": "Controls whether the internalLinkRecommenderEpisode API call (2nd operation) runs to fetch related episodes.\n• ON → fetches recommended episode suggestions\n• OFF → skips the 2nd operation (faster)\n✅ Your ON/OFF choice is respected in both modes.\n📌 In Get Details Mode — always available. In Search Mode — only when Fetch Full Episode Details is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.\n⚠️ Spotify has retired this API in most regions — automatically skipped if the hash is not found.",
            "default": false
          },
          "episodes_fetchDetails": {
            "title": "🎙️ Episodes — 🔄 Fetch Full Episode Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs getEpisodeOrChapter for every URI found in search results. This activates the Include Recommended Episodes toggle above.\n⚠️ Slower — one or more extra API calls per search result.",
            "default": false
          },
          "podcasts_search_offset": {
            "title": "🎙 Podcasts — 📄 Search Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position for search pagination. 0 = first page.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 0
          },
          "podcasts_search_limit": {
            "title": "🎙 Podcasts — 📊 Search Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of podcast results to return.\n📌 Search Mode only — ignored in Get Details Mode.",
            "default": 30
          },
          "podcasts_get_offset": {
            "title": "🎙 Podcasts — 📄 Get: Episode List Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Starting position in the episode list. 0 = most recent episode first.\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Podcast Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 0
          },
          "podcasts_get_limit": {
            "title": "🎙 Podcasts — 📊 Get: Episode List Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of episodes to fetch per podcast.\nEach podcast result gets this many episodes independently (e.g. limit=4 means 4 episodes per show).\n📌 Active in Get Details Mode (always) and in Search Mode only when 'Fetch Full Podcast Details' is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.",
            "default": 50
          },
          "podcasts_includeRecommended": {
            "title": "🎙 Podcasts — 💡 Include Recommended Shows",
            "type": "boolean",
            "description": "Controls whether the internalLinkRecommenderShow API call (3rd operation) runs to fetch related show recommendations.\n• ON → fetches recommended similar shows\n• OFF → skips the 3rd operation (faster)\n✅ Your ON/OFF choice is respected in both modes.\n📌 In Get Details Mode — always available. In Search Mode — only when Fetch Full Podcast Details is ON.\n⛔ Ignored in Search Mode when Fetch Details is OFF.\n⚠️ Spotify has retired this API in most regions — automatically skipped if the hash is not found.",
            "default": false
          },
          "podcasts_fetchDetails": {
            "title": "🎙 Podcasts — 🔄 Fetch Full Podcast Details",
            "type": "boolean",
            "description": "📌 Search Mode only — in Get Details Mode the detail scraper always runs, this toggle is ignored.\nWhen ON — runs all 3 operations (metadata + episodes + optional recommended) for every podcast URI found in search results. This activates all Get: filters and toggle buttons above.\n⚠️ Slower — multiple extra API calls per search result.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}