{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook Page Reels Scraper — Facebook Reels API, Views, MP4",
    "description": "Facebook page reels as rows: paste a page link and get views, duration, description, music, post date and a playable MP4 link — with an opt-in transcript per reel. No login, no cookies, exact limit. A page with no reels, a private page and a reel we cannot transcribe are never charged.",
    "version": "1.0",
    "x-build-id": "hsy7kgGQWJYJq3FS1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~facebook-reels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-facebook-reels-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/steadyfetch~facebook-reels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-facebook-reels-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/steadyfetch~facebook-reels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-facebook-reels-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": {
          "pages": {
            "title": "Facebook pages",
            "type": "array",
            "description": "Facebook pages to list reels from, one to an entry, e.g. [\"ladbible\", \"https://www.facebook.com/ladbible\"] — a page name, a page slug or a full page link; \"_demo\" is the sample switch, not a page. Public Facebook Pages only: most personal profiles cannot be read and come back as page not found, never charged. A page with no reels, and a page Facebook will not show without a login, are delivered as labelled rows and are never charged. A reel link put here is routed to the reel box automatically, not refused, and a page's reels come back newest first. Leave this empty and the run returns built-in sample rows instead of collecting anything, so you can see the output shape at no result fee.",
            "default": [
              "_demo"
            ],
            "items": {
              "type": "string"
            }
          },
          "reelUrls": {
            "title": "Reel links",
            "type": "array",
            "description": "Individual reel links, one per line — https://www.facebook.com/reel/1234567890, https://www.facebook.com/share/r/abc123/, https://www.facebook.com/watch/?v=1234567890, https://fb.watch/abc123/ or https://www.facebook.com/<page>/videos/1234567890. Charged as one Reel lookup when the row lands; a link Facebook answers is gone costs nothing. A pasted reel link is a first-class input here, not a workaround: each one returns its own row with the like, comment, share and view counts a page listing does not carry.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (pages and reel links mixed)",
            "type": "array",
            "description": "One list for both kinds of link, for buyers moving over from another scraper — e.g. https://www.facebook.com/ladbible and https://www.facebook.com/reel/1234567890 in the same list. A line this actor cannot place is refused on an uncharged row naming the field or the sibling actor that does take it, so a wrong link never costs you anything. A page or profile URL lists its reels; a reel, share, watch or fb.watch link returns that one reel, each line sorted into the right door before anything is bought.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "includeTranscript": {
            "title": "Include transcript",
            "type": "boolean",
            "description": "ON adds a transcript to every delivered reel — `transcript`, `transcriptLanguage` and timestamped `transcriptSegments` — e.g. {\"pages\": [\"ladbible\"], \"includeTranscript\": true}. Charged as one Reel transcript at $0.0075 per produced transcript, on top of the row. Never charged: a reel longer than 180 seconds, which is delivered without a transcript and whose row names our Media Transcriber, which transcribes any length by the minute. Facebook reels run about two minutes on average. A reel your account already has whose transcript never came is handed back with the transcript bought for it — the transcript is charged, the reel is not. A reel already answered as having no speech, no audio or being over the ceiling is never asked again. OFF (default): rows carry the reel’s description and metadata only.",
            "default": false
          },
          "maxItems": {
            "title": "Max reels to return",
            "minimum": 1,
            "type": "integer",
            "description": "Hard ceiling — the run never delivers or bills more reel rows than this, across every page and every link, whatever else is set. With more than one page the limit is split evenly between them, so 60 across 3 pages collects 20 from each; a page that runs short leaves an uncharged row saying so rather than borrowing another page's share. Other reels scrapers call this `resultsLimit`, `limit` or `count`; those names are read as this field too and the smallest of them wins, with one uncharged note row saying which was read. Ask for more than this actor can serve in one run and the run still starts: it continues at the actor's own ceiling of 2,000 rows, with one uncharged row saying what you asked for and what bound it.",
            "default": 30
          },
          "newerThan": {
            "title": "Only reels posted after",
            "type": "string",
            "description": "A date like 2026-09-01, 1 Sep 2026 or 09/01/2026 (month first), or a span back from the run's start like 7 days, 2 weeks, 3 months, 48h, today or yesterday. Reels posted before it are dropped, uncharged, and the status line says how many. A date this actor cannot read, or a day that does not exist, stops the run before anything is read or charged. Page reels arrive newest first, so a daily run with the default limit catches everything posted since."
          },
          "olderThan": {
            "title": "Only reels posted before",
            "type": "string",
            "description": "A date like 2026-09-01, 1 Sep 2026 or 09/01/2026 (month first), or a span back from the run's start like 30 days, 2 weeks, 3 months, today or yesterday. Reels posted after it are dropped, uncharged, and counted on the status line. A date this actor cannot read, or a window whose \"posted after\" falls after it, stops the run before anything is read or charged."
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "type": "integer",
            "description": "The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout. A time limit ends the collecting, never the delivering: reels already in hand are always written out. With the transcript on, budget roughly 6-10 seconds per reel. Anything outside the actor's own range of 30 to 3,600 seconds still starts a run: the clock is set to the nearest end of that range and one uncharged row says so.",
            "default": 1800
          },
          "includeSeen": {
            "title": "Include reels you already have",
            "type": "boolean",
            "description": "OFF (default): a reel already delivered to your account is skipped — no row, no charge — and the next new reel takes its place, so you still get the number you asked for. ON: those reels are delivered again anyway, marked `repeat: true`, without a transcript leg and still not charged. That is about reels found in a page listing. A reel you pasted a LINK to is one you named, and there is no next reel behind it to take its place, so it always comes back either way — marked `repeat: true` and with no result fee. ONE EXCEPTION on both doors, and only with \"Include transcript\" on: a reel your account already has whose transcript it never got comes back with the transcript bought for it — the reel is still not charged, the transcript is, and the row says so. Reels older than 90 days in your account's memory count as new again either way.",
            "default": false
          },
          "resumeFromDatasetId": {
            "title": "Skip reels in this dataset",
            "type": "string",
            "description": "The dataset ID of a previous run of this actor. Reels already in it are treated as reels you already have and are skipped, so a follow-up run collects only what is new even from a different Apify account. Selecting it here is what grants this run permission to read it. With \"Include transcript\" on it is also read for what each row's transcript did, so reels in it whose transcript never came are handed back with the transcript bought and nothing else charged."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}