{
  "openapi": "3.0.1",
  "info": {
    "title": "Video Frame Extractor - Scene Detection, $1.50/1k Frames",
    "description": "Video Frame Extractor: still frames from direct video file URLs (mp4, mov, webm, mkv, m4v). Scene-change detection, every N seconds, N evenly spaced frames or exact timestamps. One row per frame with image URL, timecode and video metadata, plus an optional contact sheet. Seeks over HTTP without down",
    "version": "0.1",
    "x-build-id": "vWLFEIO8WVhTmPJaL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/martin10291~video-frame-extractor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-martin10291-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/martin10291~video-frame-extractor/runs": {
      "post": {
        "operationId": "runs-sync-martin10291-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/martin10291~video-frame-extractor/run-sync": {
      "post": {
        "operationId": "run-sync-martin10291-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 URLs",
            "type": "array",
            "description": "Direct links to video files (mp4, mov, webm, mkv, m4v) or Apify key-value store file URLs. Links must be public and point straight to the file. YouTube, TikTok, Instagram and Facebook page links are not supported and are skipped.",
            "default": [
              "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4"
            ],
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "count",
              "scenes",
              "interval",
              "timestamps"
            ],
            "type": "string",
            "description": "scenes = a frame at every scene change (ffmpeg scene detection). interval = one frame every N seconds. count = N evenly spaced frames. timestamps = exact times you list.",
            "default": "count"
          },
          "frameCount": {
            "title": "Frame count",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Used in count mode: how many evenly spaced frames to extract per video (limited by Max frames per video).",
            "default": 10
          },
          "everySeconds": {
            "title": "Every N seconds",
            "minimum": 0.1,
            "type": "number",
            "description": "Used in interval mode: extract one frame every this many seconds, starting at 0.",
            "default": 10
          },
          "timestamps": {
            "title": "Timestamps",
            "type": "array",
            "description": "Used in timestamps mode: times to extract, as seconds (12.5) or HH:MM:SS (00:01:02.5). Times beyond the video end are skipped.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sceneThreshold": {
            "title": "Scene threshold",
            "minimum": 0.01,
            "maximum": 1,
            "type": "number",
            "description": "Used in scenes mode: sensitivity from 0.01 to 1. Lower finds more scene changes (0.1 very sensitive), higher only hard cuts. 0.3 is a good default.",
            "default": 0.3
          },
          "maxFramesPerVideo": {
            "title": "Max frames per video",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Hard cap on frames per video (any mode). You pay per frame, so this caps the cost. Maximum 500.",
            "default": 30
          },
          "format": {
            "title": "Image format",
            "enum": [
              "jpg",
              "png",
              "webp"
            ],
            "type": "string",
            "description": "Image format of the extracted frames. jpg is smallest, png is lossless, webp is a good compromise.",
            "default": "jpg"
          },
          "width": {
            "title": "Image width (px)",
            "minimum": 0,
            "maximum": 7680,
            "type": "integer",
            "description": "Resize frames to this width, keeping the aspect ratio. Never upscales. 0 keeps the original size.",
            "default": 1280
          },
          "quality": {
            "title": "Image quality",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Quality for jpg and webp, 1 to 100 (higher = better and bigger files). Ignored for png.",
            "default": 85
          },
          "contactSheet": {
            "title": "Contact sheet",
            "type": "boolean",
            "description": "Also create one tiled grid image per video with all frames and their timecodes (one extra result row of type contact_sheet). Handy for a quick overview or for sending one image to an AI vision model.",
            "default": true
          },
          "maxVideoMinutes": {
            "title": "Max video length (minutes)",
            "minimum": 1,
            "maximum": 600,
            "type": "integer",
            "description": "Skip videos longer than this many minutes. A safety guard against huge files and surprise cost.",
            "default": 30
          },
          "onlyNew": {
            "title": "Only new videos since last run",
            "type": "boolean",
            "description": "Skip every video URL already processed in an earlier run with the same Monitor ID and the same settings. Use it for recurring jobs on a folder or feed of videos. Each video is paid for once.",
            "default": false
          },
          "monitorId": {
            "title": "Monitor ID",
            "type": "string",
            "description": "Separate memory for each watch list (used with only-new mode). Use a different ID per feed or customer.",
            "default": "default"
          },
          "datasetId": {
            "title": "Dataset (integration input)",
            "type": "string",
            "description": "Optional. Pick a dataset (or paste its ID) to read the input from, for example the result of Google Maps Scraper. When this actor runs as an integration, the dataset of the triggering run is used automatically (payload.resource.defaultDatasetId), so you can leave this empty. If set, the values found in the dataset replace the main input list."
          },
          "datasetField": {
            "title": "Dataset field",
            "type": "string",
            "description": "Optional. The item field that holds the value, for example website, url or videoUrl (dot paths like author.url work). Empty = detected automatically."
          },
          "datasetMaxItems": {
            "title": "Max values from the dataset",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Upper limit of unique values taken from the dataset, to keep the cost under control.",
            "default": 1000
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}