{
  "openapi": "3.0.1",
  "info": {
    "title": "Video Scene Splitter: scenes, keyframes, probe report",
    "description": "Turn any video into scenes and frames your model can read. Scene boundaries with timestamps, one keyframe per scene, and a full technical report. Deterministic ffmpeg, no API key.",
    "version": "0.3",
    "x-build-id": "Ggm6HurV5M4YOveGj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/frameprobe~video-scene-splitter/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-frameprobe-video-scene-splitter",
        "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/frameprobe~video-scene-splitter/runs": {
      "post": {
        "operationId": "runs-sync-frameprobe-video-scene-splitter",
        "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/frameprobe~video-scene-splitter/run-sync": {
      "post": {
        "operationId": "run-sync-frameprobe-video-scene-splitter",
        "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": "Direct video URLs",
            "type": "array",
            "description": "Direct media file URLs (ending in .mp4 and similar), processed straight away. Social page links (tiktok.com, instagram.com, youtube.com) will NOT work: those platforms block video fetching from cloud servers, so chain a scraper and use the dataset field below. If you paste a page link anyway, the Actor tells you which scraper to run.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset from a scraper run (recommended)",
            "type": "string",
            "description": "The recommended input. Run a TikTok, Instagram or YouTube scraper first, then pick its dataset here: this Actor reads the media URLs the scraper already collected and splits each one. Recognised fields include videoUrl, videoUrlNoWaterMark, mediaUrl, webVideoUrl and url."
          },
          "maxVideos": {
            "title": "Maximum videos",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Hard stop on how many videos this run processes, so a large input list cannot spend more than you expect. Cost is per minute of video, so this is a ceiling on how many videos are attempted, not on the total bill. Use the run's maximum charge setting for a hard spend cap.",
            "default": 10
          },
          "sceneThreshold": {
            "title": "Scene sensitivity",
            "minimum": 0.1,
            "maximum": 0.9,
            "type": "number",
            "description": "How different two frames must be to count as a cut, from 0.10 to 0.90. LOWER finds more scenes, including soft transitions, camera moves and animated text. HIGHER finds only hard cuts. Start at the default; if a fast-cut video comes back with too few scenes, lower it by 0.05 at a time.",
            "default": 0.35
          },
          "minSceneSeconds": {
            "title": "Shortest scene",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Cuts closer together than this merge into the scene before them. Overlays, flashes and kinetic text all trip a scene detector, so without a floor a 3-minute video can come back with 300 'scenes'. RAISE it for cleaner, chunkier scenes; set it to 0 to keep every detection.",
            "default": 0.6
          },
          "maxKeyframes": {
            "title": "Maximum keyframes per video",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Cap on how many stills are saved per video. Every scene boundary is always returned in the dataset; this only limits the images. When a video has more scenes than this, stills are sampled evenly across the whole video rather than stopping partway through.",
            "default": 40
          },
          "keyframeLongEdge": {
            "title": "Keyframe size",
            "minimum": 240,
            "maximum": 1920,
            "type": "integer",
            "description": "Longest edge of each saved still, in pixels. Aspect ratio is preserved and the image is never upscaled. 1024 is a good size for feeding a vision model; drop to 512 for cheaper storage and faster runs.",
            "default": 1024
          },
          "includeKeyframes": {
            "title": "Extract keyframes",
            "type": "boolean",
            "description": "Turn this off to get scene boundaries and the probe report only, with no images. Faster, and it costs you less, because extracting stills is most of the processing time. Useful when you only need cut timings or a technical report.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}