{
  "openapi": "3.0.1",
  "info": {
    "title": "Video Frame Extractor & Scene Detector for AI",
    "description": "Extract frames from direct video links by count, interval, exact timestamps or scene changes. Get image links, timecodes and a contact sheet, with near-duplicate frames removed and not charged. Runs ffmpeg for you.",
    "version": "0.1",
    "x-build-id": "fxDxlu2XixZcHA2OX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/earlytern~video-frame-extractor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-earlytern-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/earlytern~video-frame-extractor/runs": {
      "post": {
        "operationId": "runs-sync-earlytern-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/earlytern~video-frame-extractor/run-sync": {
      "post": {
        "operationId": "run-sync-earlytern-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",
        "required": [
          "videoUrls"
        ],
        "properties": {
          "videoUrls": {
            "title": "Video links",
            "type": "array",
            "description": "Direct links to video files, one per line (MP4, WebM, MOV, MKV, AVI, MPEG, FLV, WMV or Ogg), up to 100. The link must open the file itself. YouTube, TikTok, Instagram and other video platforms are not supported. Only use videos you have the right to process.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Frame selection",
            "enum": [
              "count",
              "interval",
              "timestamps",
              "scenes"
            ],
            "type": "string",
            "description": "Number of frames: evenly spread over the video. Every few seconds: one frame per interval. Exact times: the moments you list. Scene changes: the first frame and each cut, which reads the whole video and adds a fee per minute.",
            "default": "count"
          },
          "frameCount": {
            "title": "Number of frames",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Frames per video in the Number of frames mode.",
            "default": 10
          },
          "intervalSeconds": {
            "title": "Seconds between frames",
            "minimum": 0.1,
            "maximum": 86400,
            "type": "number",
            "description": "Used by the Every few seconds mode. A video gives at most 500 frames.",
            "default": 10
          },
          "timestamps": {
            "title": "Exact times",
            "type": "array",
            "description": "Seconds into the video, for example [5, 12.5, 60]. Used by the Exact times mode, which keeps every frame you ask for.",
            "default": []
          },
          "sceneThreshold": {
            "title": "Scene sensitivity",
            "minimum": 0.01,
            "maximum": 1,
            "type": "number",
            "description": "Used by the Scene changes mode: how much the picture must change, from 0.01 to 1. Lower finds more scenes.",
            "default": 0.3
          },
          "skipSimilarFrames": {
            "title": "Skip similar frames",
            "type": "boolean",
            "description": "Leave out frames that look almost the same as the frame before. Skipped frames are free.",
            "default": true
          },
          "contactSheet": {
            "title": "Contact sheet",
            "type": "boolean",
            "description": "Add one free image showing the frames of the video in a grid (up to 100 of them).",
            "default": true
          },
          "imageFormat": {
            "title": "Image format",
            "enum": [
              "jpg",
              "png"
            ],
            "type": "string",
            "description": "JPG files are smaller; PNG files keep every detail.",
            "default": "jpg"
          },
          "maxWidth": {
            "title": "Maximum image width",
            "minimum": 64,
            "maximum": 3840,
            "type": "integer",
            "description": "Larger frames are scaled down to this width in pixels. Smaller frames keep their size.",
            "default": 1280
          },
          "startSeconds": {
            "title": "Start at",
            "minimum": 0,
            "type": "number",
            "description": "Leave out everything before this second of the video."
          },
          "endSeconds": {
            "title": "End at",
            "minimum": 0,
            "type": "number",
            "description": "Leave out everything after this second of the video."
          },
          "maxFileSizeMb": {
            "title": "Maximum file size",
            "minimum": 1,
            "maximum": 4000,
            "type": "integer",
            "description": "Larger files are refused and not charged. Up to 2,000 MB, or 4,000 MB in the Scene changes mode.",
            "default": 500
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}