{
  "openapi": "3.0.1",
  "info": {
    "title": "Loom Scraper | 🎥Downloader & 📄 Transcript",
    "description": "🎥 Advanced Loom scraper that extracts & downloads videos, transcripts, and metadata from individual videos and entire 🗂️folders. Supports bulk operations, multiple formats (SRT, VTT, TXT, XML), and authentication. 📚 Ideal for content archiving and knowledge management.",
    "version": "0.1",
    "x-build-id": "8SwR2VxCPmszSwyUn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dz_omar~loom-video-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dz_omar-loom-video-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/dz_omar~loom-video-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dz_omar-loom-video-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/dz_omar~loom-video-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dz_omar-loom-video-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",
        "properties": {
          "url": {
            "title": "🔗 Loom URLs",
            "type": "array",
            "description": "List of Loom share URLs. Supports both individual videos and 📁 folders:\n\n**Individual Videos:**\n- https://www.loom.com/share/VIDEO_ID\n- VIDEO_ID (32-character hex string)\n\n**Folders:**\n- https://www.loom.com/share/folder/FOLDER_ID\n- FOLDER_ID (32-character hex string)\n\n**Mixed Input:** You can mix videos and folders in the same request.",
            "items": {
              "type": "string"
            }
          },
          "downloadTranscript": {
            "title": "📝 Download Transcript Files",
            "type": "boolean",
            "description": "## 📁 Download Transcript Files\n\nEnable this option to store transcript files in Apify storage for download:\n\n- **Disabled (default)**: Only clean text transcript included in results\n- **Enabled**: Store formatted transcript files in storage with download URLs\n\n💡 **Note:** Clean text transcript is always included in the results regardless of this setting.\n\n📁 **Folder Support:** When processing folders, this applies to all videos in the folder.",
            "default": false
          },
          "outputFormat": {
            "title": "📄 Transcript Download Format",
            "enum": [
              "srt",
              "vtt",
              "txt",
              "xml"
            ],
            "type": "string",
            "description": "## 🎯 Select Transcript Format (only applies if transcript download is enabled)\n\nChoose the subtitle format for downloaded transcripts:\n\n- **SubRip (SRT)**: Standard format compatible with most video players (default)\n- **WebVTT (VTT)**: Web-friendly format with CSS styling support for HTML5 videos\n- **Plain Text (TXT)**: Raw transcript text without timestamps\n- **XML**: Original structure with full metadata\n\n💡 **Recommendations:**\n- Use SRT for general compatibility\n- Choose VTT for web embedding\n- Select TXT for NLP/text analysis\n- Keep XML for full technical details\n\n📁 **Folder Support:** This format applies to all videos when processing folders.",
            "default": "srt"
          },
          "pollMultiplier": {
            "title": "⏱️ Download Preparation Time Multiplier",
            "minimum": 0.01,
            "maximum": 1,
            "type": "number",
            "description": "## ⏱️ Download Preparation Time Multiplier\n\nWhen you request a video download, Loom does not return the URL instantly — it prepares the MP4 file in the background first. The longer the video, the longer this takes.\n\nThis multiplier controls the **maximum time the scraper will wait** for Loom to finish preparing the download URL, calculated as:\n\n```\nmax_wait_seconds = max(30, video_duration_seconds × multiplier)\n```\n\n**Examples with default value (0.02):**\n- 1m 41s video (101s) → max wait: **30s** (minimum floor)\n- 30min video (1800s) → max wait: **36s**\n- 2.5hr video (9000s) → max wait: **180s**\n\n💡 **When to increase this value:**\n- If you are seeing timeout errors on long videos\n- If your network or Loom's servers are slower than usual\n\n💡 **When to decrease this value:**\n- If you want faster failure detection and are processing many short videos\n\n⚠️ **Note:** The max wait is capped at 600s (10 minutes) regardless of this value.",
            "default": 0.02
          },
          "downloadVideo": {
            "title": "🎞️ Download Video Files",
            "type": "boolean",
            "description": "## 🎬 Download Video Files\n\nEnable this option to download and store the actual video files via the [Universal File Downloader](https://apify.com/dz_omar/universal-file-downloader):\n\n- **Disabled (default)**: Only video metadata and transcript extracted\n- **Enabled**: Download MP4 video files to Apify storage\n\n⚠️ **Warning:** Video files can be large and will consume significant storage space and bandwidth.\n\n💡 **OOM handling**: If the download actor runs out of memory, the scraper automatically retries with double memory (up to your plan limit).\n\n📁 **Folder Support:** When processing folders, this applies to all videos in the folder.",
            "default": false
          },
          "returnVideoUrl": {
            "title": "🔗 Return Direct Video URL",
            "type": "boolean",
            "description": "## 🔗 Return Direct Loom CDN Video URL\n\nReturn the signed Loom CDN download URL directly in the output — **without** downloading the video via the Universal File Downloader.\n\n- **Disabled (default)**: No CDN URL in output\n- **Enabled**: The `video.download.cdn_url` field will contain the direct MP4 link from Loom's CDN\n\n💡 **Use cases:**\n- You want to download the video yourself in your own app/pipeline\n- You don't want to pay for the 2nd actor (Universal Downloader)\n- You want both: the CDN URL + the Apify-hosted download (enable both `downloadVideo` and `returnVideoUrl`)\n\n⚠️ **Note:** CDN URLs are **signed and temporary** — they expire after a few hours. Use them promptly.",
            "default": false
          },
          "includeAccountVideos": {
            "title": "👤 Include My Account Videos",
            "type": "boolean",
            "description": "## 📚 Access Your Personal Loom Library\n\nEnable this to automatically discover and process videos from your Loom account:\n\n- **Disabled (default)**: Only process URLs provided above\n- **Enabled**: Scan your account for videos and include them in results\n\n🔐 **Authentication Required:**\n- This feature ONLY works with proper authentication (email + password OR browser cookies)\n- Without authentication, this setting has no effect\n- If enabled but no authentication provided, only URL-based videos will be processed\n\n📊 **What You Get:**\n- All videos from your account workspace\n- Video metadata, transcripts, and comments\n- Same download options apply (video files, transcripts)\n- Perfect for bulk analysis, backup, or content management\n\n⚠️ **Important Notes:**\n- If your account has no videos, results will be empty\n- Large accounts may take longer to process\n- Respects your account's privacy settings\n\n💡 **Use Cases:**\n- Backup all your Loom content\n- Analyze your video library\n- Bulk download transcripts for documentation\n- Content audit and management",
            "default": false
          },
          "email": {
            "title": "📧 Email (optional)",
            "type": "string",
            "description": "**Method 1: Automatic Login** 🎯\n\nYour Loom account email for automatic login.\n\n**How it works:**\n✅ System logs in automatically\n🍪 Creates fresh session cookies\n🔄 If login fails → falls back to browser cookies below\n\n💡 **Leave empty** to skip automatic login and use browser cookies instead."
          },
          "password": {
            "title": "🔑 Password (optional)",
            "type": "string",
            "description": "**Required only if using email above** 🔒\n\nYour Loom account password.\n\n**Security:** Password is encrypted and deleted after use.\n\n**What happens:**\n✅ **Login succeeds** → You're authenticated\n❌ **Login fails** → System tries browser cookies below\n❌ **Both fail** → Only public content accessible"
          },
          "customCookies": {
            "title": "🍪 Browser Cookies (optional)",
            "type": "array",
            "description": "**Method 2: Import Browser Session** 🍪\n\nCopy cookies from your browser to access private content.\n\n🔄 **How Authentication   Works:**\n\n**Priority Order:**\n1. **Email + Password** (if provided) → Automatic login\n2. **Browser Cookies** (if login fails or no credentials)\n3. **No Authentication** → Public content only\n\n📋 **Getting Your Cookies:**\n\n**Easy Method - Copy Cookies Extension:**\n1. Install: [Copy Cookies Extension](https://chromewebstore.google.com/detail/copy-cookies/jcbpglbplpblnagieibnemmkiamekcdg)\n2. Go to loom.com and log in\n3. Click the extension → Copy as JSON\n4. Paste here\n\n**Alternative - Cookie-Editor:**\n1. Install: [Cookie-Editor](https://cookie-editor.com/)\n2. Go to loom.com and log in\n3. Open extension → Export → JSON format\n4. Paste here\n\n ",
            "default": []
          },
          "videoSortOrder": {
            "title": "📅 Video Sort Order",
            "enum": [
              "DESC",
              "ASC"
            ],
            "type": "string",
            "description": "## 🧭 Choose how to sort your videos\n\n- **Newest to Oldest**: Shows the most recently uploaded videos first\n- **Oldest to Newest**: Shows the earliest videos first\n\n📝 This applies to how videos are listed when scraping folders or organizing downloads.",
            "default": "ASC"
          },
          "maxVideos": {
            "title": "🔢 Max Videos To Process",
            "minimum": 0,
            "type": "integer",
            "description": "Limit how many videos are fetched from your account. `0` = no limit (processes all matching videos).\n\n💡 Useful for testing with a small batch before running a full account backup.\n\n⚠️ **Note**: Only applies to your own account videos, not individual URLs.",
            "default": 0
          },
          "startDate": {
            "title": "📅 Start Date",
            "type": "string",
            "description": "Select the earliest upload date to include. Default is when Loom was likely active."
          },
          "endDate": {
            "title": "📅 End Date",
            "type": "string",
            "description": "Select the latest upload date to include. Defaults to today."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}