{
  "openapi": "3.0.1",
  "info": {
    "title": "Video Frame Extractor - Thumbnails, Scenes & Contact Sheet",
    "description": "Extract thumbnails and frames from videos: evenly spaced frames, a frame every N seconds, scene changes or keyframes, saved as WebP, JPEG or PNG with exact timestamps, plus a contact sheet per video. Reads MP4, MOV, WebM, MKV and AVI from direct file links, your key-value store or uploaded files.",
    "version": "0.1",
    "x-build-id": "bFwhvTt4T5gbPRpOR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/quietworkslab~video-frame-extractor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-quietworkslab-video-frame-extractor",
        "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/quietworkslab~video-frame-extractor/runs": {
      "post": {
        "operationId": "runs-sync-quietworkslab-video-frame-extractor",
        "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/quietworkslab~video-frame-extractor/run-sync": {
      "post": {
        "operationId": "run-sync-quietworkslab-video-frame-extractor",
        "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": {
          "videoUrls": {
            "title": "Video links",
            "type": "array",
            "description": "Direct links to video files (MP4, MOV, WebM, MKV or AVI) that you have the right to use, one per line, for example https://example.com/clip.mp4. Not web pages or streaming sites: the link must return the file itself. Each link is downloaded once (up to 2 GB and the run's free disk, within 10 minutes and at least 1 MB/s on average; for slower hosts, upload the file or use a key-value store). Besides one event per frame, each downloaded file counts one frame-extracted event per 64 MB (a 100 MB file adds 1.6, see Pricing). Links that need a login, and links to private or local network addresses, are refused. Leave empty (with no store and no uploads) to try the Actor on the built-in sample clip.",
            "items": {
              "type": "string"
            }
          },
          "keyValueStoreId": {
            "title": "Key-value store",
            "type": "string",
            "description": "Optional. A key-value store in your account that holds videos. Every record that is a video is handled; JSON, text and image records are skipped for free. Besides one event per frame, each video read from your storage counts one frame-extracted event per 16 MB (Apify charges for reading storage; a 100 MB video adds 6.25, see Pricing). When this Actor runs after another Actor from its Integrations tab, set it to {{resource.defaultKeyValueStoreId}}. Uploaded files that are in this store are handled with it, once."
          },
          "keyPrefix": {
            "title": "Only keys starting with",
            "type": "string",
            "description": "Optional. Handle only the records of the key-value store whose key starts with this text, for example clip- or 2026-10-. Empty = all records."
          },
          "uploadedFiles": {
            "title": "Upload videos",
            "type": "array",
            "description": "Optional. Upload video files here (MP4, MOV, WebM, MKV or AVI). The files are stored in a key-value store of your Apify account and read from there, so they count like store records: one frame-extracted event per 16 MB on top of the frames. If your account keeps its storages private (the default), this Actor, which runs with limited permissions, may not open the uploads: the run then names the store they are in. Choose that store in \"Key-value store\" and start again."
          },
          "mode": {
            "title": "Which frames",
            "enum": [
              "count",
              "interval",
              "scenes",
              "keyframes"
            ],
            "type": "string",
            "description": "count: \"Number of frames\" evenly spaced over the video (thumbnails, previews). interval: one frame every \"Seconds between frames\". scenes: the first frame and every frame where the picture changes a lot (shot cuts); the whole video is decoded, which takes longer and can count extra events for long videos with few scenes (see Pricing). keyframes: the video's own keyframes, spread over the video. In count and interval mode a video with very few keyframes (typical for screen and browser recordings) is also decoded once from start to end, which can count extra events like scenes (see Pricing).",
            "default": "count"
          },
          "frameCount": {
            "title": "Number of frames (count mode)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "For mode count: how many evenly spaced frames per video, each in the middle of one of that many equal parts of the video, at most \"Maximum frames per video\" (default 50: raise it for more). Empty = 10 (6 for the built-in sample clip)."
          },
          "intervalSec": {
            "title": "Seconds between frames (interval mode)",
            "minimum": 0.1,
            "maximum": 86400,
            "type": "number",
            "description": "For mode interval: one frame at the start and then one every this many seconds, for example 5. At most \"Maximum frames per video\": if that stops it early, the summary says which part of the video the frames cover.",
            "default": 10
          },
          "sceneThreshold": {
            "title": "Scene change threshold (scenes mode)",
            "minimum": 0.01,
            "maximum": 1,
            "type": "number",
            "description": "For mode scenes: how different a frame must be from the previous one to count as a new scene, from 0.01 (many frames) to 1 (only total changes). 0.3 finds most shot cuts; try 0.2 for soft cuts or 0.4 for fewer frames.",
            "default": 0.3
          },
          "maxFramesPerVideo": {
            "title": "Maximum frames per video",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Upper limit of frames per video in every mode. In scenes and keyframes modes the first frames found are kept (keyframes are spread over the video first).",
            "default": 50
          },
          "startSec": {
            "title": "Start at (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Ignore the video before this time, for example 12.5 to skip an intro. Empty = from the beginning."
          },
          "endSec": {
            "title": "End at (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Ignore the video after this time; must be later than \"Start at\". Empty = to the end."
          },
          "format": {
            "title": "Image format",
            "enum": [
              "webp",
              "jpeg",
              "png"
            ],
            "type": "string",
            "description": "Format of the extracted frames and of the contact sheets.",
            "default": "webp"
          },
          "maxWidth": {
            "title": "Maximum width (px)",
            "minimum": 32,
            "maximum": 3840,
            "type": "integer",
            "description": "Frames wider than this are shrunk, keeping the aspect ratio, for example 640 for thumbnails or 3840 for full 4K. Frames are never enlarged. Rotated phone videos are turned upright first.",
            "default": 1280
          },
          "quality": {
            "title": "Quality",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Compression quality from 1 (smallest file) to 100 (best) for WebP and JPEG. PNG is always lossless.",
            "default": 80
          },
          "contactSheet": {
            "title": "Contact sheet",
            "type": "boolean",
            "description": "Also save one grid image per video with its frames and their times (up to 100 tiles). Not charged.",
            "default": true
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}