{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook Video Search Scraper: Reels, No Login",
    "description": "Search public Facebook videos and reels by keyword, #hashtag or video search link, no login, with date, reels only and place filters. Rows: views, reactions, comments, shares, video files, captions and transcripts; Video details add-on for exact plays. JSON, CSV, API. From $1.42 per 1,000 videos.",
    "version": "0.1",
    "x-build-id": "6Kuz2soyNZf7uxmqM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automation_craft~facebook-video-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automation_craft-facebook-video-search-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/automation_craft~facebook-video-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automation_craft-facebook-video-search-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/automation_craft~facebook-video-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automation_craft-facebook-video-search-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": {
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "What to search Facebook's videos for, one query per line (up to 100): a keyword or phrase (pizza recipe), a #hashtag, or a Facebook video search link (facebook.com/watch/search/?q=pasta or facebook.com/search/videos/?q=pasta; its most recent, date and location filters are read too). Any other link (a post search, a single video, another site, mailto: or tel:) is skipped free and named in a row, never searched as words. Each query is searched on its own and every row names it. Facebook's search is fuzzy: each row says whether its title or text holds every word (matchesQuery), and \"Only videos that contain the query\" keeps only those. Also read from query, queries, searchTerms, searchTerm and startUrls (links as { url } objects or text).",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Order",
            "enum": [
              "top",
              "recent"
            ],
            "type": "string",
            "description": "top: Facebook's relevance ranking (videos of any age). recent: Facebook's own Most recent filter, which favours recent videos but keeps Facebook's order, not a strict newest first (set a start date for a hard limit). Left empty: top, or the order a pasted search link names. Also read from recentVideos (true is recent) and recentPosts."
          },
          "maxVideosPerQuery": {
            "title": "Videos per query",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The most new videos delivered per query (and per location). Left empty (an API call without it): 20; the Console form starts at 10. A query whose results end earlier is walked month by month when \"Deep search\" is on. Also read from resultsCount, maxResults and resultsLimit."
          },
          "maxVideos": {
            "title": "Videos per run",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "The most videos delivered in the whole run, across queries. Left empty: no cap beyond the per query number and your charge limit. Also read from maxItems."
          },
          "startDate": {
            "title": "Posted on or after",
            "type": "string",
            "description": "The first day of a date window (UTC): YYYY-MM-DD, today, yesterday, or a time back from the run's start such as 7 days, 3 weeks, 2 months, 1 year. Sent to Facebook as its own date filter and checked again on every video: a video with an exact time is judged on it; a compact result shows only a day (\"Oct 1\") or an age (\"14 hours ago\"), which is judged as every moment it can mean in any time zone, so one on the window's first or last day is left out unless \"Video details\" reads its exact time. Videos outside the window are left out and not charged. On or after 2004-01-01. Left empty: no start. Also read from postedAfter, dateFrom and start_date."
          },
          "endDate": {
            "title": "Posted on or before",
            "type": "string",
            "description": "The last day of the date window (UTC), in the same forms as the start. Left empty: today. Also read from postedBefore, dateTo and end_date."
          },
          "locations": {
            "title": "Tagged locations",
            "type": "array",
            "description": "Only videos Facebook's own location filter returns for a place, one per line: a Facebook location id (108424279189115 is New York, New York) or a place's full name as Facebook writes it (New York, New York; London, United Kingdom), looked up in Facebook's own place list. A name that names no single place gets a free row with Facebook's suggestions and its searches are not run. Each query is searched once per location. Up to 20. Also read from location, locationUid, locationId and location_uid.",
            "items": {
              "type": "string"
            }
          },
          "deepSearch": {
            "title": "Deep search",
            "type": "boolean",
            "description": "When a query's results end before its video number, go on month by month backwards (this month, the month before, back to the start date or 24 months), each month a new search of its own: Facebook's date filter ranks other videos first, so a month finds videos the plain search did not. Repeats are free.",
            "default": true
          },
          "videoTypes": {
            "title": "Video types",
            "type": "array",
            "description": "Only these kinds (any of them): reel (a facebook.com/reel/ link) or video (every other video). Left empty: both. Others are left out and not charged. Also read from videoType, and onlyReels true means reels only.",
            "items": {
              "type": "string",
              "enum": [
                "reel",
                "video"
              ],
              "enumTitles": [
                "Reel",
                "Video (not a reel)"
              ]
            }
          },
          "minViews": {
            "title": "Minimum views",
            "minimum": 0,
            "type": "integer",
            "description": "Only videos with at least this many views. A compact result shows Facebook's cut figure (\"285K views\" is 285,000 to 285,999), judged as its whole range: one whose range crosses your number is left out unless \"Video details\" reads the exact count. Videos below it, or with no count shown, are left out and not charged."
          },
          "minReactions": {
            "title": "Minimum reactions",
            "minimum": 0,
            "type": "integer",
            "description": "Only videos with at least this many reactions. Compact results carry no reaction, comment or share counts: with a minimum set they are left out unless \"Video details\" reads the counts (shares never: the watch page shows none). Videos with fewer, or with no count, are left out and not charged."
          },
          "minComments": {
            "title": "Minimum comments",
            "minimum": 0,
            "type": "integer",
            "description": "Only videos with at least this many comments. A compact result carries no comment count: with a minimum set it is left out unless \"Video details\" reads the count. Videos with fewer, or with no count, are left out and not charged."
          },
          "minShares": {
            "title": "Minimum shares",
            "minimum": 0,
            "type": "integer",
            "description": "Only videos with at least this many shares. Only full results carry a share count (a video's own page shows none, so \"Video details\" adds none): compact results are left out when a minimum is set. Videos with fewer, or with no count, are left out and not charged."
          },
          "mustContainQuery": {
            "title": "Only videos that contain the query",
            "type": "boolean",
            "description": "Keep only videos whose title, text or link title holds every word of the query as a whole word, case and accents (é, ü, ñ) aside; a query in double quotes must stand as that exact phrase. Off: Facebook's own matches are delivered and each row says whether it holds the query (matchesQuery, matchedWords).",
            "default": false
          },
          "includeKeywords": {
            "title": "Keep videos with any of these words",
            "type": "array",
            "description": "Only videos whose title or text holds at least one of these words or phrases (whole words, case aside). Up to 50. Also read from keywordFilter.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Leave out videos with any of these words",
            "type": "array",
            "description": "Videos whose title or text holds any of these words or phrases are left out and not charged (the same matching rule). Up to 50.",
            "items": {
              "type": "string"
            }
          },
          "maxPagesPerQuery": {
            "title": "Pages per search",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most result pages read per search (about 7 videos a page). Left empty: no page limit (the videos per search cap and Facebook's own end decide)."
          },
          "includeVideoDetails": {
            "title": "Video details (add-on)",
            "type": "boolean",
            "description": "Read each delivered video's own page for its exact figures (the Video details event, charged only when the page gave them): exact play and view counts, reactions by type, the comment count, the exact time and text, the video files and the captions link. Most useful for compact results (about half of a plain search, nearly all of a filtered one), which show only a day, a cut view figure and no counts. Off by default. Also read from enrichDetailPage."
          },
          "includeTranscript": {
            "title": "Transcripts",
            "type": "boolean",
            "description": "Add the text of Facebook's own captions of each delivered video that has them (transcript, transcriptStatus), at no extra charge. A compact result carries its captions link only once \"Video details\" read its page. No speech to text: a video without Facebook captions says no_captions. Off by default."
          },
          "includeAuthorDetails": {
            "title": "Author details",
            "type": "boolean",
            "description": "Add each page author's follower count (as Facebook rounds it), category, verified mark and rating (\"96% recommend (312 reviews)\") from the page's own embed and reviews tab, once per author per run, at no extra charge. Read for a full result's page author and for every compact result's owner: the embed answers only for a page, so an owner it names is a page and its id and link are delivered; people get authorDetailsStatus not_a_page; a page whose link names it by number only (facebook.com/people/... or profile.php) gets its followers and category without the rating (ok_without_rating). Off by default. Also read from includeAuthorFollowers."
          },
          "outputFormat": {
            "title": "Row form",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "full: every field; compact: the main fields of a video one level deep (link, title, text, author, date, views, counts, duration, thumbnail, file, transcript). Left empty: full. Also read from compact (true or false)."
          },
          "includePersonalData": {
            "title": "Include personal data",
            "type": "boolean",
            "description": "Off (the default): the dedicated fields that name or reach a private person are empty: the author's id, profile link and picture unless the row shows a page (a compact result never names its owner's kind, so its owner id and link are empty), the ids and links of people tagged or mentioned, and a person's video link is given as facebook.com/reel/<id> or watch/?v=<id> (both open without a login). Names, texts and every video's own address are delivered as Facebook shows them, either way. On: those fields are filled; you are responsible for a lawful use of personal data (GDPR included).",
            "default": false
          },
          "maxConcurrency": {
            "title": "Searches at once",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many searches are read at the same time, each on its own exit. Left empty: 1 (one after another)."
          },
          "requestDelayMs": {
            "title": "Pause between pages (ms)",
            "minimum": 300,
            "maximum": 10000,
            "type": "integer",
            "description": "The pause between two calls of one search, in milliseconds. Left empty: 400."
          },
          "maxRunSeconds": {
            "title": "Run deadline (seconds)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "Stop starting new work after this many seconds and end with the coverage rows and the summary (what was delivered stays delivered and charged). Left empty: the run's own timeout."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy, the datacenter pool by default; choose the RESIDENTIAL group with a country for exits of that country, your own proxies (http(s) links with their port; each new exit takes the next one), or no proxy for the run's own address. Also read from proxy."
          },
          "resumeToken": {
            "title": "Resume token",
            "type": "string",
            "description": "Go on with the searches an earlier run stopped before their end (its video number, the charge limit, the run deadline): paste the resumeToken of that run's summary row here and run the same searches again, given the same way (the same words, order, date window, and the same place ids or place names). Each search starts where it stopped, searches that run read to the end are not read again, and each search skips, free, the videos it delivered in that run. Left empty: every search starts at its first page."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}